|
|
1.1 ! root 1: #include "tdef.h" ! 2: #include <sgtty.h> ! 3: extern ! 4: #include "d.h" ! 5: extern ! 6: #include "v.h" ! 7: #include "s.h" ! 8: ! 9: /* ! 10: troff5.c ! 11: ! 12: misc processing requests ! 13: */ ! 14: ! 15: extern int inchar[LNSIZE], *pinchar; /* XXX */ ! 16: extern struct s *frame; ! 17: extern struct s *litlev; ! 18: extern filep ip; ! 19: extern filep offset; ! 20: ! 21: extern int ascii; ! 22: extern int nonumb; ! 23: extern int admod; ! 24: extern int ad; ! 25: extern int fi; ! 26: extern int cc; ! 27: extern int c2; ! 28: extern int ohc; ! 29: extern int tabc; ! 30: extern int dotc; ! 31: extern int pendnf; ! 32: extern int hyf; ! 33: extern int ce; ! 34: extern int po; ! 35: extern int po1; ! 36: extern int nc; ! 37: extern int in; ! 38: extern int un; ! 39: extern int un1; ! 40: extern int in1; ! 41: extern int ll; ! 42: extern int ll1; ! 43: extern int lt; ! 44: extern int lt1; ! 45: extern int nlist[NTRAP]; ! 46: extern int mlist[NTRAP]; ! 47: extern int lgf; ! 48: extern int pl; ! 49: extern int npn; ! 50: extern int npnflg; ! 51: extern int copyf; ! 52: extern char nextf[]; ! 53: extern int trap; ! 54: extern int lss; ! 55: extern int em; ! 56: extern int evlist[EVLSZ]; ! 57: extern int evi; ! 58: extern int ibf; ! 59: extern int ev; ! 60: extern int ch; ! 61: extern int nflush; ! 62: extern int tty; ! 63: extern struct sgttyb ttys; ! 64: extern int quiet; ! 65: extern int iflg; ! 66: extern int eschar; ! 67: extern int lit; ! 68: extern int ls; ! 69: extern int ls1; ! 70: extern int tabtab[]; ! 71: extern char trtab[]; ! 72: extern int ul; ! 73: extern int cu; ! 74: extern int sfont; ! 75: extern int font; ! 76: extern int fontlab[]; ! 77: extern int it; ! 78: extern int itmac; ! 79: extern int noscale; ! 80: extern int ic; ! 81: extern int icf; ! 82: extern int ics; ! 83: extern int *vlist; ! 84: extern int sv; ! 85: extern int esc; ! 86: extern int nn; ! 87: extern int nms; ! 88: extern int ndf; ! 89: extern int lnmod; ! 90: extern int ni; ! 91: extern int lnsize; ! 92: extern int nb; ! 93: extern int nlflg; ! 94: extern int apts, apts1, pts, pts1, font, font1; ! 95: extern int ulfont; ! 96: extern int ulbit; ! 97: extern int error; ! 98: extern int nmbits; ! 99: extern int chbits; ! 100: extern int tdelim; ! 101: extern int xxx; ! 102: int iflist[NIF]; ! 103: int ifx; ! 104: ! 105: casead(){ ! 106: register i; ! 107: ! 108: ad = 1; ! 109: /*leave admod alone*/ ! 110: if(skip())return; ! 111: switch(i = getch() & CMASK){ ! 112: case 'r': /*right adj, left ragged*/ ! 113: admod = 2; ! 114: break; ! 115: case 'l': /*left adj, right ragged*/ ! 116: admod = ad = 0; /*same as casena*/ ! 117: break; ! 118: case 'c': /*centered adj*/ ! 119: admod = 1; ! 120: break; ! 121: case 'b': case 'n': ! 122: admod = 0; ! 123: break; ! 124: case '0': case '2': case '4': ! 125: ad = 0; ! 126: case '1': case '3': case '5': ! 127: admod = (i - '0')/2; ! 128: } ! 129: } ! 130: casena(){ ! 131: ad = 0; ! 132: } ! 133: casefi(){ ! 134: tbreak(); ! 135: fi++; ! 136: pendnf = 0; ! 137: lnsize = LNSIZE; ! 138: } ! 139: casenf(){ ! 140: tbreak(); ! 141: fi = 0; ! 142: /* can't do while oline is only LNSIZE ! 143: lnsize = LNSIZE + WDSIZE; ! 144: */ ! 145: } ! 146: casers(){ ! 147: dip->nls = 0; ! 148: } ! 149: casens(){ ! 150: dip->nls++; ! 151: } ! 152: chget(c) ! 153: int c; ! 154: { ! 155: register i; ! 156: ! 157: if(skip() || ! 158: ((i = getch()) & MOT) || ! 159: ((i&CMASK) == ' ') || ! 160: ((i&CMASK) == '\n')){ ! 161: ch = i; ! 162: return(c); ! 163: }else return(i & BMASK); ! 164: } ! 165: casecc(){ ! 166: cc = chget('.'); ! 167: } ! 168: casec2(){ ! 169: c2 = chget('\''); ! 170: } ! 171: casehc(){ ! 172: ohc = chget(OHC); ! 173: } ! 174: casetc(){ ! 175: tabc = chget(0); ! 176: } ! 177: caselc(){ ! 178: dotc = chget(0); ! 179: } ! 180: casehy(){ ! 181: register i; ! 182: ! 183: hyf = 1; ! 184: if(skip())return; ! 185: noscale++; ! 186: i = atoi(); ! 187: noscale = 0; ! 188: if(nonumb)return; ! 189: hyf = max(i,0); ! 190: } ! 191: casenh(){ ! 192: hyf = 0; ! 193: } ! 194: max(aa,bb) ! 195: int aa,bb; ! 196: { ! 197: if(aa>bb)return(aa); ! 198: else return(bb); ! 199: } ! 200: casece(){ ! 201: register i; ! 202: ! 203: noscale++; ! 204: skip(); ! 205: i = max(atoi(),0); ! 206: if(nonumb)i = 1; ! 207: tbreak(); ! 208: ce = i; ! 209: noscale = 0; ! 210: } ! 211: casein(){ ! 212: register i; ! 213: ! 214: if(skip())i = in1; ! 215: else i = max(hnumb(&in),0); ! 216: tbreak(); ! 217: in1 = in; ! 218: in = i; ! 219: if(!nc){ ! 220: un = in; ! 221: setnel(); ! 222: } ! 223: } ! 224: casell(){ ! 225: register i; ! 226: ! 227: if(skip())i = ll1; ! 228: else i = max(hnumb(&ll),INCH/10); ! 229: ll1 = ll; ! 230: ll = i; ! 231: setnel(); ! 232: } ! 233: caselt(){ ! 234: register i; ! 235: ! 236: if(skip())i = lt1; ! 237: else i = max(hnumb(<),0); ! 238: lt1 = lt; ! 239: lt = i; ! 240: } ! 241: caseti(){ ! 242: register i; ! 243: ! 244: if(skip())return; ! 245: i = max(hnumb(&in),0); ! 246: tbreak(); ! 247: un1 = i; ! 248: setnel(); ! 249: } ! 250: casels(){ ! 251: register i; ! 252: ! 253: noscale++; ! 254: if(skip())i = ls1; ! 255: else i = max(inumb(&ls),1); ! 256: ls1 = ls; ! 257: ls = i; ! 258: noscale = 0; ! 259: } ! 260: casepo(){ ! 261: register i; ! 262: ! 263: if(skip())i = po1; ! 264: else i = max(hnumb(&po),0); ! 265: po1 = po; ! 266: po = i; ! 267: #ifndef NROFF ! 268: if(!ascii)esc += po - po1; ! 269: #endif ! 270: } ! 271: casepl(){ ! 272: register i; ! 273: ! 274: skip(); ! 275: if((i = vnumb(&pl)) == 0)pl = 11 * INCH; /*11in*/ ! 276: else pl = i; ! 277: if(v.nl > pl)v.nl = pl; ! 278: } ! 279: casewh(){ ! 280: register i, j, k; ! 281: ! 282: lgf++; ! 283: skip(); ! 284: i = vnumb((int *)0); ! 285: if(nonumb)return; ! 286: skip(); ! 287: j = getrq(); ! 288: if((k=findn(i)) != NTRAP){ ! 289: mlist[k] = j; ! 290: return; ! 291: } ! 292: for(k=0; k<NTRAP; k++)if(mlist[k] == 0)break; ! 293: if(k == NTRAP){ ! 294: prstrfl("Cannot plant trap.\n"); ! 295: return; ! 296: } ! 297: mlist[k] = j; ! 298: nlist[k] = i; ! 299: } ! 300: casech(){ ! 301: register i, j, k; ! 302: ! 303: lgf++; ! 304: skip(); ! 305: if(!(j=getrq()))return; ! 306: else for(k=0; k<NTRAP; k++)if(mlist[k] == j)break; ! 307: if(k == NTRAP)return; ! 308: skip(); ! 309: i = vnumb((int *)0); ! 310: if(nonumb)mlist[k] = 0; ! 311: nlist[k] = i; ! 312: } ! 313: findn(i) ! 314: int i; ! 315: { ! 316: register k; ! 317: ! 318: for(k=0; k<NTRAP; k++) ! 319: if((nlist[k] == i) && (mlist[k] != 0))break; ! 320: return(k); ! 321: } ! 322: casepn(){ ! 323: register i; ! 324: ! 325: skip(); ! 326: noscale++; ! 327: i = max(inumb(&v.pn),0); ! 328: noscale = 0; ! 329: if(!nonumb){ ! 330: npn = i; ! 331: npnflg++; ! 332: } ! 333: } ! 334: casebp(){ ! 335: register i; ! 336: register struct s *savframe; ! 337: ! 338: if(dip != d)return; ! 339: savframe = frame; ! 340: skip(); ! 341: if((i = inumb(&v.pn)) < 0)i = 0; ! 342: tbreak(); ! 343: if(!nonumb){ ! 344: npn = i; ! 345: npnflg++; ! 346: }else if(dip->nls)return; ! 347: eject(savframe); ! 348: } ! 349: casetm(x) int x;{ ! 350: register i; ! 351: char tmbuf[NTM]; ! 352: ! 353: lgf++; ! 354: copyf++; ! 355: if(skip() && x)prstrfl("User Abort."); ! 356: for(i=0; i<NTM-2;)if((tmbuf[i++]=getch()) == '\n')break; ! 357: if(i == NTM-2)tmbuf[i++] = '\n'; ! 358: tmbuf[i] = 0; ! 359: prstrfl(tmbuf); ! 360: copyf--; ! 361: } ! 362: casesp(a) ! 363: int a; ! 364: { ! 365: register i, j, savlss; ! 366: ! 367: tbreak(); ! 368: if(dip->nls || trap)return; ! 369: i = findt1(); ! 370: if(!a){ ! 371: skip(); ! 372: j = vnumb((int *)0); ! 373: if(nonumb)j = lss; ! 374: }else j = a; ! 375: if(j == 0)return; ! 376: if(i < j)j = i; ! 377: savlss = lss; ! 378: if(dip != d)i = dip->dnl; else i = v.nl; ! 379: if((i + j) < 0)j = -i; ! 380: lss = j; ! 381: newline(0); ! 382: lss = savlss; ! 383: } ! 384: casert(){ ! 385: register a, *p; ! 386: ! 387: skip(); ! 388: if(dip != d)p = &dip->dnl; else p = &v.nl; ! 389: a = vnumb(p); ! 390: if(nonumb)a = dip->mkline; ! 391: if((a < 0) || (a >= *p))return; ! 392: nb++; ! 393: casesp(a - *p); ! 394: } ! 395: caseem(){ ! 396: lgf++; ! 397: skip(); ! 398: em = getrq(); ! 399: } ! 400: casefl(){ ! 401: tbreak(); ! 402: flusho(); ! 403: } ! 404: caseev(){ ! 405: register nxev; ! 406: extern int block; ! 407: ! 408: if(skip()){ ! 409: e0: ! 410: if(evi == 0)return; ! 411: nxev = evlist[--evi]; ! 412: goto e1; ! 413: } ! 414: noscale++; ! 415: nxev = atoi(); ! 416: noscale = 0; ! 417: if(nonumb)goto e0; ! 418: flushi(); ! 419: if((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)){ ! 420: prstrfl("Cannot do ev.\n"); ! 421: if(error)done2(040);else edone(040); ! 422: return; ! 423: } ! 424: evlist[evi++] = ev; ! 425: e1: ! 426: if(ev == nxev)return; ! 427: lseek(ibf, (long)(ev*EVS*sizeof(int)), 0); ! 428: write(ibf,(char *)&block, EVS*sizeof(int)); ! 429: lseek(ibf, (long)(nxev*EVS*sizeof(int)), 0); ! 430: read(ibf,(char *)&block, EVS*sizeof(int)); ! 431: ev = nxev; ! 432: } ! 433: caseel(){ ! 434: if(--ifx < 0){ ! 435: ifx = 0; ! 436: iflist[0] = 0; ! 437: } ! 438: caseif(2); ! 439: } ! 440: caseie(){ ! 441: if(ifx >= NIF){ ! 442: prstr("if-else overflow.\n"); ! 443: ifx = 0; ! 444: edone(040); ! 445: } ! 446: caseif(1); ! 447: ifx++; ! 448: } ! 449: caseif(x) ! 450: int x; ! 451: { ! 452: register i, notflag, true; ! 453: ! 454: if(x == 2){ ! 455: notflag = 0; ! 456: true = iflist[ifx]; ! 457: goto i1; ! 458: } ! 459: true = 0; ! 460: skip(); ! 461: if(((i = getch()) & CMASK) == '!'){ ! 462: notflag = 1; ! 463: }else{ ! 464: notflag = 0; ! 465: ch = i; ! 466: } ! 467: i = atoi(); ! 468: if(!nonumb){ ! 469: if(i > 0)true++; ! 470: goto i1; ! 471: } ! 472: switch((i = getch()) & CMASK){ ! 473: case 'e': ! 474: if(!(v.pn & 01))true++; ! 475: break; ! 476: case 'o': ! 477: if(v.pn & 01)true++; ! 478: break; ! 479: #ifdef NROFF ! 480: case 'n': ! 481: true++; ! 482: case 't': ! 483: #endif ! 484: #ifndef NROFF ! 485: case 't': ! 486: true++; ! 487: case 'n': ! 488: #endif ! 489: case ' ': ! 490: break; ! 491: default: ! 492: true = cmpstr(i); ! 493: } ! 494: i1: ! 495: true ^= notflag; ! 496: if(x == 1)iflist[ifx] = !true; ! 497: if(true){ ! 498: i2: ! 499: do{ ! 500: v.hp = 0; ! 501: pinchar = inchar; /* XXX */ ! 502: } ! 503: while(((i = getch()) & CMASK) == ' '); ! 504: if((i & CMASK) == LEFT)goto i2; ! 505: ch = i; ! 506: nflush++; ! 507: }else{ ! 508: copyf++; ! 509: if(eat(LEFT) == LEFT){ ! 510: while(eatblk(RIGHT,LEFT) != RIGHT)nlflg = 0; ! 511: } ! 512: copyf--; ! 513: } ! 514: } ! 515: eatblk(right,left) ! 516: int right,left; ! 517: { ! 518: register i; ! 519: ! 520: e0: ! 521: while(((i = getch() & CMASK) != right) && ! 522: (i != left) && ! 523: (i != '\n')); ! 524: if(i == left){ ! 525: while((i=eatblk(right,left)) != right)nlflg = 0; ! 526: goto e0; ! 527: } ! 528: return(i); ! 529: } ! 530: cmpstr(delim) ! 531: int delim; ! 532: { ! 533: register i, j; ! 534: register filep p; ! 535: extern filep alloc(); ! 536: extern filep incoff(); ! 537: filep begin; ! 538: int cnt, k; ! 539: int savapts, savapts1, savfont, savfont1, ! 540: savpts, savpts1; ! 541: ! 542: if(delim & MOT)return(0); ! 543: delim &= CMASK; ! 544: if(dip != d)wbfl(); ! 545: if((offset = begin = alloc()) == (filep)0)return(0); ! 546: cnt = 0; ! 547: v.hp = 0; ! 548: pinchar = inchar; /* XXX */ ! 549: savapts = apts; ! 550: savapts1 = apts1; ! 551: savfont = font; ! 552: savfont1 = font1; ! 553: savpts = pts; ! 554: savpts1 = pts1; ! 555: while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){ ! 556: wbf(i); ! 557: cnt++; ! 558: } ! 559: wbt(0); ! 560: k = !cnt; ! 561: if(nlflg)goto rtn; ! 562: p = begin; ! 563: apts = savapts; ! 564: apts1 = savapts1; ! 565: font = savfont; ! 566: font1 = savfont1; ! 567: pts = savpts; ! 568: pts1 = savpts1; ! 569: mchbits(); ! 570: v.hp = 0; ! 571: pinchar = inchar; /* XXX */ ! 572: while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){ ! 573: if(rbf0(p) != i){ ! 574: eat(delim); ! 575: k = 0; ! 576: break; ! 577: } ! 578: p = incoff(p); ! 579: k = !(--cnt); ! 580: } ! 581: rtn: ! 582: apts = savapts; ! 583: apts1 = savapts1; ! 584: font = savfont; ! 585: font1 = savfont1; ! 586: pts = savpts; ! 587: pts1 = savpts1; ! 588: mchbits(); ! 589: offset = dip->op; ! 590: ffree(begin); ! 591: return(k); ! 592: } ! 593: caserd(){ ! 594: ! 595: lgf++; ! 596: skip(); ! 597: getname(); ! 598: if(!iflg){ ! 599: if(quiet){ ! 600: ttys.sg_flags &= ~ECHO; ! 601: stty(0, &ttys); ! 602: prstrfl(""); /*bell*/ ! 603: }else{ ! 604: if(nextf[0]){ ! 605: prstr(nextf); ! 606: prstr(":"); ! 607: }else{ ! 608: prstr(""); /*bell*/ ! 609: } ! 610: } ! 611: } ! 612: collect(); ! 613: tty++; ! 614: pushi((filep)-1); ! 615: } ! 616: rdtty(){ ! 617: char onechar; ! 618: ! 619: onechar = 0; ! 620: if(read(0, &onechar, 1) == 1){ ! 621: if(onechar == '\n')tty++; ! 622: else tty = 1; ! 623: if(tty != 3)return(onechar); ! 624: } ! 625: popi(); ! 626: tty = 0; ! 627: if(quiet){ ! 628: ttys.sg_flags |= ECHO; ! 629: stty(0, &ttys); ! 630: } ! 631: return(0); ! 632: } ! 633: caseec(){ ! 634: eschar = chget('\\'); ! 635: } ! 636: caseeo(){ ! 637: eschar = 0; ! 638: } ! 639: caseli(){ ! 640: ! 641: skip(); ! 642: lit = max(inumb((int *)0),1); ! 643: litlev = frame; ! 644: if((dip == d) && (v.nl == -1))newline(1); ! 645: } ! 646: caseta(){ ! 647: register i; ! 648: ! 649: tabtab[0] = nonumb = 0; ! 650: for(i=0; ((i < (NTAB-1)) && !nonumb); i++){ ! 651: if(skip())break; ! 652: tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]),0) & TMASK; ! 653: if(!nonumb) switch(ch & CMASK){ ! 654: case 'C': ! 655: tabtab[i] |= CTAB; ! 656: break; ! 657: case 'R': ! 658: tabtab[i] |= RTAB; ! 659: break; ! 660: default: /*includes L*/ ! 661: break; ! 662: } ! 663: nonumb = ch = 0; ! 664: } ! 665: tabtab[i] = 0; ! 666: } ! 667: casene(){ ! 668: register i, j; ! 669: ! 670: skip(); ! 671: i = vnumb((int *)0); ! 672: if(nonumb)i = lss; ! 673: if(i > (j = findt1())){ ! 674: i = lss; ! 675: lss = j; ! 676: dip->nls = 0; ! 677: newline(0); ! 678: lss = i; ! 679: } ! 680: } ! 681: casetr(){ ! 682: register i, j; ! 683: ! 684: lgf++; ! 685: skip(); ! 686: while((i = getch() & CMASK) != '\n'){ ! 687: if((i & MOT) || ((j = getch()) & MOT))return; ! 688: if((j &= CMASK) == '\n')j = ' '; ! 689: trtab[i] = j; ! 690: } ! 691: } ! 692: casecu(){ ! 693: cu++; ! 694: caseul(); ! 695: } ! 696: caseul(){ ! 697: register i; ! 698: ! 699: noscale++; ! 700: if(skip())i = 1; ! 701: else i = atoi(); ! 702: if(ul && (i == 0)){ ! 703: font = sfont; ! 704: ul = cu = 0; ! 705: } ! 706: if(i){ ! 707: if(!ul){ ! 708: sfont = font; ! 709: font = ulfont; ! 710: } ! 711: ul = i; ! 712: } ! 713: noscale = 0; ! 714: mchbits(); ! 715: } ! 716: caseuf(){ ! 717: register i, j; ! 718: ! 719: if(skip() || !(i = getrq()) || (i == 'S') || ! 720: ((j = find(i,fontlab)) == -1)) ! 721: ulfont = 1; /*default position 2*/ ! 722: else ulfont = j; ! 723: #ifdef NROFF ! 724: if(ulfont == 0)ulfont = 1; ! 725: #endif ! 726: ulbit = ulfont<<9; ! 727: } ! 728: caseit(){ ! 729: register i; ! 730: ! 731: lgf++; ! 732: it = itmac = 0; ! 733: noscale++; ! 734: skip(); ! 735: i = atoi(); ! 736: skip(); ! 737: if(!nonumb && (itmac = getrq()))it = i; ! 738: noscale = 0; ! 739: } ! 740: casemc(){ ! 741: register i; ! 742: ! 743: if(icf > 1)ic = 0; ! 744: icf = 0; ! 745: if(skip())return; ! 746: ic = getch(); ! 747: icf = 1; ! 748: skip(); ! 749: i = max(hnumb((int *)0),0); ! 750: if(!nonumb)ics = i; ! 751: } ! 752: casemk(){ ! 753: register i, j; ! 754: ! 755: if(dip != d)j = dip->dnl; else j = v.nl; ! 756: if(skip()){ ! 757: dip->mkline = j; ! 758: return; ! 759: } ! 760: if((i = getrq()) == 0)return; ! 761: vlist[findr(i)] = j; ! 762: } ! 763: casesv(){ ! 764: register i; ! 765: ! 766: skip(); ! 767: if((i = vnumb((int *)0)) < 0)return; ! 768: if(nonumb)i = 1; ! 769: sv += i; ! 770: caseos(); ! 771: } ! 772: caseos(){ ! 773: register savlss; ! 774: ! 775: if(sv <= findt1()){ ! 776: savlss = lss; ! 777: lss = sv; ! 778: newline(0); ! 779: lss = savlss; ! 780: sv = 0; ! 781: } ! 782: } ! 783: casenm(){ ! 784: register i; ! 785: ! 786: lnmod = nn = 0; ! 787: if(skip())return; ! 788: lnmod++; ! 789: noscale++; ! 790: i = inumb(&v.ln); ! 791: if(!nonumb)v.ln = max(i,0); ! 792: getnm(&ndf,1); ! 793: getnm(&nms,0); ! 794: getnm(&ni,0); ! 795: noscale = 0; ! 796: nmbits = chbits; ! 797: } ! 798: getnm(p,min) ! 799: int *p, min; ! 800: { ! 801: register i; ! 802: ! 803: eat(' '); ! 804: if(skip())return; ! 805: i = atoi(); ! 806: if(nonumb)return; ! 807: *p = max(i,min); ! 808: } ! 809: casenn(){ ! 810: noscale++; ! 811: skip(); ! 812: nn = max(atoi(),1); ! 813: noscale = 0; ! 814: } ! 815: caseab(){ ! 816: dummy(); ! 817: casetm(1); ! 818: done2(0); ! 819: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.