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