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