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