|
|
1.1 ! root 1: #include "tdef.h" ! 2: extern ! 3: #include "d.h" ! 4: extern ! 5: #include "v.h" ! 6: #ifdef NROFF ! 7: extern ! 8: #include "tw.h" ! 9: #endif ! 10: #include "s.h" ! 11: #ifdef NROFF ! 12: #define GETCH gettch ! 13: #endif ! 14: #ifndef NROFF ! 15: #define GETCH getch ! 16: #endif ! 17: ! 18: /* ! 19: troff7.c ! 20: ! 21: text ! 22: */ ! 23: ! 24: extern struct s *frame, *stk; ! 25: extern struct s *ejl; ! 26: ! 27: extern int pl; ! 28: extern int trap; ! 29: extern int flss; ! 30: extern int npnflg; ! 31: extern int npn; ! 32: extern int stop; ! 33: extern int nflush; ! 34: extern int ejf; ! 35: extern int ascii; ! 36: extern int donef; ! 37: extern int nc; ! 38: extern int wch; ! 39: extern int dpn; ! 40: extern int ndone; ! 41: extern int lss; ! 42: extern int pto; ! 43: extern int pfrom; ! 44: extern int print; ! 45: extern int nlist[NTRAP]; ! 46: extern int mlist[NTRAP]; ! 47: extern int *pnp; ! 48: extern int nb; ! 49: extern int ic; ! 50: extern int icf; ! 51: extern int ics; ! 52: extern int ne; ! 53: extern int ll; ! 54: extern int un; ! 55: extern int un1; ! 56: extern int in; ! 57: extern int ls; ! 58: extern int spread; ! 59: extern int totout; ! 60: extern int nwd; ! 61: extern int *pendw; ! 62: extern int *linep; ! 63: extern int line[]; ! 64: extern int lastl; ! 65: extern int ch; ! 66: extern int ce; ! 67: extern int fi; ! 68: extern int nlflg; ! 69: extern int pendt; ! 70: extern int sps; ! 71: extern int adsp; ! 72: extern int pendnf; ! 73: extern int over; ! 74: extern int adrem; ! 75: extern int nel; ! 76: extern int ad; ! 77: extern int ohc; ! 78: extern int hyoff; ! 79: extern int nhyp; ! 80: extern int spflg; ! 81: extern int word[]; ! 82: extern int *wordp; ! 83: extern int wne; ! 84: extern int chbits; ! 85: extern int cwidth; ! 86: extern int widthp; ! 87: extern int hyf; ! 88: extern int xbitf; ! 89: extern int vflag; ! 90: extern int ul; ! 91: extern int cu; ! 92: extern int font; ! 93: extern int sfont; ! 94: extern int it; ! 95: extern int itmac; ! 96: extern int *hyptr[NHYP]; ! 97: extern int **hyp; ! 98: extern int *wdstart, *wdend; ! 99: extern int lnmod; ! 100: extern int admod; ! 101: extern int nn; ! 102: extern int nms; ! 103: extern int ndf; ! 104: extern int ni; ! 105: extern int nform; ! 106: extern int lnsize; ! 107: extern int po; ! 108: extern int ulbit; ! 109: extern int *vlist; ! 110: extern int nrbits; ! 111: extern int nmbits; ! 112: extern char trtab[]; ! 113: extern int xxx; ! 114: int brflg; ! 115: ! 116: tbreak(){ ! 117: register *i, j, pad; ! 118: int res; ! 119: ! 120: trap = 0; ! 121: if(nb)return; ! 122: if((dip == d) && (v.nl == -1)){ ! 123: newline(1); ! 124: return; ! 125: } ! 126: if(!nc){ ! 127: setnel(); ! 128: if(!wch)return; ! 129: if(pendw)getword(1); ! 130: movword(); ! 131: }else if(pendw && !brflg){ ! 132: getword(1); ! 133: movword(); ! 134: } ! 135: *linep = dip->nls = 0; ! 136: #ifdef NROFF ! 137: if(dip == d)horiz(po); ! 138: #endif ! 139: if(lnmod)donum(); ! 140: lastl = ne; ! 141: if(brflg != 1){ ! 142: totout = 0; ! 143: }else if(ad){ ! 144: if((lastl = (ll - un)) < ne)lastl = ne; ! 145: } ! 146: if(admod && ad && (brflg != 2)){ ! 147: lastl = ne; ! 148: adsp = adrem = 0; ! 149: #ifdef NROFF ! 150: if(admod == 1)un += quant(nel/2,t.Adj); ! 151: #endif ! 152: #ifndef NROFF ! 153: if(admod == 1)un += nel/2; ! 154: #endif ! 155: else if(admod ==2)un += nel; ! 156: } ! 157: totout++; ! 158: brflg = 0; ! 159: if((lastl+un) > dip->maxl)dip->maxl = (lastl+un); ! 160: horiz(un); ! 161: #ifdef NROFF ! 162: if(adrem%t.Adj)res = t.Hor; else res = t.Adj; ! 163: #endif ! 164: for(i = line;nc > 0;){ ! 165: if(((j = *i++) & CMASK) == ' '){ ! 166: pad = 0; ! 167: do{ ! 168: pad += width(j); ! 169: nc--; ! 170: }while(((j = *i++) & CMASK) == ' '); ! 171: i--; ! 172: pad += adsp; ! 173: --nwd; ! 174: if(adrem){ ! 175: if(adrem < 0){ ! 176: #ifdef NROFF ! 177: pad -= res; ! 178: adrem += res; ! 179: }else if((totout&01) || ! 180: ((adrem/res)>=(nwd))){ ! 181: pad += res; ! 182: adrem -= res; ! 183: #endif ! 184: #ifndef NROFF ! 185: pad--; ! 186: adrem++; ! 187: }else{ ! 188: pad++; ! 189: adrem--; ! 190: #endif ! 191: } ! 192: } ! 193: horiz(pad); ! 194: }else{ ! 195: pchar(j); ! 196: nc--; ! 197: } ! 198: } ! 199: if(ic){ ! 200: if((j = ll - un - lastl + ics) > 0)horiz(j); ! 201: pchar(ic); ! 202: } ! 203: if(icf)icf++; ! 204: else ic = 0; ! 205: ne = nwd = 0; ! 206: un = in; ! 207: setnel(); ! 208: newline(0); ! 209: if(dip != d){if(dip->dnl > dip->hnl)dip->hnl = dip->dnl;} ! 210: else{if(v.nl > dip->hnl)dip->hnl = v.nl;} ! 211: for(j=ls-1; (j >0) && !trap; j--)newline(0); ! 212: spread = 0; ! 213: } ! 214: donum(){ ! 215: register i, nw; ! 216: extern pchar(); ! 217: ! 218: nrbits = nmbits; ! 219: nw = width('1' | nrbits); ! 220: if(nn){ ! 221: nn--; ! 222: goto d1; ! 223: } ! 224: if(v.ln%ndf){ ! 225: v.ln++; ! 226: d1: ! 227: un += nw*(3+nms+ni); ! 228: return; ! 229: } ! 230: i = 0; ! 231: if(v.ln<100)i++; ! 232: if(v.ln<10)i++; ! 233: horiz(nw*(ni+i)); ! 234: nform = 0; ! 235: fnumb(v.ln,pchar); ! 236: un += nw*nms; ! 237: v.ln++; ! 238: } ! 239: text(){ ! 240: register i; ! 241: static int spcnt; ! 242: ! 243: nflush++; ! 244: if((dip == d) && (v.nl == -1)){newline(1); return;} ! 245: setnel(); ! 246: if(ce || !fi){ ! 247: nofill(); ! 248: return; ! 249: } ! 250: if(pendw)goto t4; ! 251: if(pendt)if(spcnt)goto t2; else goto t3; ! 252: pendt++; ! 253: if(spcnt)goto t2; ! 254: while(((i = GETCH()) & CMASK) == ' ')spcnt++; ! 255: if(nlflg){ ! 256: t1: ! 257: nflush = pendt = ch = spcnt = 0; ! 258: callsp(); ! 259: return; ! 260: } ! 261: ch = i; ! 262: if(spcnt){ ! 263: t2: ! 264: tbreak(); ! 265: if(nc || wch)goto rtn; ! 266: un += spcnt*sps; ! 267: spcnt = 0; ! 268: setnel(); ! 269: if(trap)goto rtn; ! 270: if(nlflg)goto t1; ! 271: } ! 272: t3: ! 273: if(spread)goto t5; ! 274: if(pendw || !wch) ! 275: t4: ! 276: if(getword(0))goto t6; ! 277: if(!movword())goto t3; ! 278: t5: ! 279: if(nlflg)pendt = 0; ! 280: adsp = adrem = 0; ! 281: if(ad){ ! 282: /* jfr */ if (nwd==1) adsp=nel; else adsp=nel/(nwd-1); ! 283: #ifdef NROFF ! 284: adsp = (adsp/t.Adj)*t.Adj; ! 285: #endif ! 286: adrem = nel - adsp*(nwd-1); ! 287: } ! 288: brflg = 1; ! 289: tbreak(); ! 290: spread = 0; ! 291: if(!trap)goto t3; ! 292: if(!nlflg)goto rtn; ! 293: t6: ! 294: pendt = 0; ! 295: ckul(); ! 296: rtn: ! 297: nflush = 0; ! 298: } ! 299: nofill(){ ! 300: register i, j; ! 301: ! 302: if(!pendnf){ ! 303: over = 0; ! 304: tbreak(); ! 305: if(trap)goto rtn; ! 306: if(nlflg){ ! 307: ch = nflush = 0; ! 308: callsp(); ! 309: return; ! 310: } ! 311: adsp = adrem = 0; ! 312: nwd = 10000; ! 313: } ! 314: while((j = ((i = GETCH()) & CMASK)) != '\n'){ ! 315: if(j == ohc)continue; ! 316: if(j == CONT){ ! 317: pendnf++; ! 318: nflush = 0; ! 319: flushi(); ! 320: ckul(); ! 321: return; ! 322: } ! 323: storeline(i,-1); ! 324: } ! 325: if(ce){ ! 326: ce--; ! 327: if((i=quant(nel/2,HOR)) > 0)un += i; ! 328: } ! 329: if(!nc)storeline(FILLER,0); ! 330: brflg = 2; ! 331: tbreak(); ! 332: ckul(); ! 333: rtn: ! 334: pendnf = nflush = 0; ! 335: } ! 336: callsp(){ ! 337: register i; ! 338: ! 339: if(flss)i = flss; else i = lss; ! 340: flss = 0; ! 341: casesp(i); ! 342: } ! 343: ckul(){ ! 344: if(ul && (--ul == 0)){ ! 345: cu = 0; ! 346: font = sfont; ! 347: mchbits(); ! 348: } ! 349: if(it && (--it == 0) && itmac)control(itmac,0); ! 350: } ! 351: storeline(c,w){ ! 352: register i; ! 353: ! 354: if((c & CMASK) == JREG){ ! 355: if((i=findr(c>>BYTE)) != -1)vlist[i] = ne; ! 356: return; ! 357: } ! 358: if(linep >= (line + lnsize - 1)){ ! 359: if(!over){ ! 360: prstrfl("Line overflow.\n"); ! 361: over++; ! 362: c = 0343; ! 363: w = -1; ! 364: goto s1; ! 365: } ! 366: return; ! 367: } ! 368: s1: ! 369: if(w == -1)w = width(c); ! 370: ne += w; ! 371: nel -= w; ! 372: /* ! 373: * if( cu && !(c & MOT) && (trtab[(c & CMASK)] == ' ')) ! 374: * c = ((c & ~ulbit) & ~CMASK) | '_'; ! 375: */ ! 376: *linep++ = c; ! 377: nc++; ! 378: } ! 379: newline(a) ! 380: int a; ! 381: { ! 382: register i, j, nlss; ! 383: int opn; ! 384: ! 385: if(a)goto nl1; ! 386: if(dip != d){ ! 387: j = lss; ! 388: pchar1(FLSS); ! 389: if(flss)lss = flss; ! 390: i = lss + dip->blss; ! 391: dip->dnl += i; ! 392: pchar1(i); ! 393: pchar1('\n'); ! 394: lss = j; ! 395: dip->blss = flss = 0; ! 396: if(dip->alss){ ! 397: pchar1(FLSS); ! 398: pchar1(dip->alss); ! 399: pchar1('\n'); ! 400: dip->dnl += dip->alss; ! 401: dip->alss = 0; ! 402: } ! 403: if(dip->ditrap && !dip->ditf && ! 404: (dip->dnl >= dip->ditrap) && dip->dimac) ! 405: if(control(dip->dimac,0)){trap++; dip->ditf++;} ! 406: return; ! 407: } ! 408: j = lss; ! 409: if(flss)lss = flss; ! 410: nlss = dip->alss + dip->blss + lss; ! 411: v.nl += nlss; ! 412: #ifndef NROFF ! 413: if(ascii){dip->alss = dip->blss = 0;} ! 414: #endif ! 415: pchar1('\n'); ! 416: flss = 0; ! 417: lss = j; ! 418: if(v.nl < pl)goto nl2; ! 419: nl1: ! 420: ejf = dip->hnl = v.nl = 0; ! 421: ejl = frame; ! 422: if(donef){ ! 423: if((!nc && !wch) || ndone)done1(0); ! 424: ndone++; ! 425: donef = 0; ! 426: if(frame == stk)nflush++; ! 427: } ! 428: opn = v.pn; ! 429: v.pn++; ! 430: if(npnflg){ ! 431: v.pn = npn; ! 432: npn = npnflg = 0; ! 433: } ! 434: nlpn: ! 435: if(v.pn == pfrom){ ! 436: print++; ! 437: pfrom = -1; ! 438: }else if(opn == pto){ ! 439: print = 0; ! 440: opn = -1; ! 441: chkpn(); ! 442: goto nlpn; ! 443: } ! 444: if(stop && print){ ! 445: dpn++; ! 446: if(dpn >= stop){ ! 447: dpn = 0; ! 448: dostop(); ! 449: } ! 450: } ! 451: nl2: ! 452: trap = 0; ! 453: if(v.nl == 0){ ! 454: if((j = findn(0)) != NTRAP) ! 455: trap = control(mlist[j],0); ! 456: } else if((i = findt(v.nl-nlss)) <= nlss){ ! 457: if((j = findn1(v.nl-nlss+i)) == NTRAP){ ! 458: prstrfl("Trap botch.\n"); ! 459: done2(-5); ! 460: } ! 461: trap = control(mlist[j],0); ! 462: } ! 463: } ! 464: findn1(a) ! 465: int a; ! 466: { ! 467: register i, j; ! 468: ! 469: for(i=0; i<NTRAP; i++){ ! 470: if(mlist[i]){ ! 471: if((j = nlist[i]) < 0)j += pl; ! 472: if(j == a)break; ! 473: } ! 474: } ! 475: return(i); ! 476: } ! 477: chkpn(){ ! 478: pto = *(pnp++); ! 479: pfrom = pto & ~MOT; ! 480: if(pto == -1){ ! 481: flusho(); ! 482: done1(0); ! 483: } ! 484: if(pto & MOT){ ! 485: pto &= ~MOT; ! 486: print++; ! 487: pfrom = 0; ! 488: } ! 489: } ! 490: findt(a) ! 491: int a; ! 492: { ! 493: register i, j, k; ! 494: ! 495: k = 32767; ! 496: if(dip != d){ ! 497: if(dip->dimac && ((i = dip->ditrap -a) > 0))k = i; ! 498: return(k); ! 499: } ! 500: for(i=0; i<NTRAP; i++){ ! 501: if(mlist[i]){ ! 502: if((j = nlist[i]) < 0)j += pl; ! 503: if((j -= a) <= 0)continue; ! 504: if(j < k)k = j; ! 505: } ! 506: } ! 507: i = pl - a; ! 508: if(k > i)k = i; ! 509: return(k); ! 510: } ! 511: findt1(){ ! 512: register i; ! 513: ! 514: if(dip != d)i = dip->dnl; ! 515: else i = v.nl; ! 516: return(findt(i)); ! 517: } ! 518: eject(a) ! 519: struct s *a; ! 520: { ! 521: register savlss; ! 522: ! 523: if(dip != d)return; ! 524: ejf++; ! 525: if(a)ejl = a; ! 526: else ejl = frame; ! 527: if(trap)return; ! 528: e1: ! 529: savlss = lss; ! 530: lss = findt(v.nl); ! 531: newline(0); ! 532: lss = savlss; ! 533: if(v.nl && !trap)goto e1; ! 534: } ! 535: movword(){ ! 536: register i, w, *wp; ! 537: int savwch, hys; ! 538: ! 539: over = 0; ! 540: wp = wordp; ! 541: if(!nwd){ ! 542: while(((i = *wp++) & CMASK) == ' '){ ! 543: wch--; ! 544: wne -= width(i); ! 545: } ! 546: wp--; ! 547: } ! 548: if((wne > nel) && ! 549: !hyoff && hyf && ! 550: (!nwd || (nel > 3*sps)) && ! 551: (!(hyf & 02) || (findt1() > lss)) ! 552: )hyphen(wp); ! 553: savwch = wch; ! 554: hyp = hyptr; ! 555: nhyp = 0; ! 556: while(*hyp && (*hyp <= wp))hyp++; ! 557: while(wch){ ! 558: if((hyoff != 1) && (*hyp == wp)){ ! 559: hyp++; ! 560: if(!wdstart || ! 561: ((wp > (wdstart+1)) && ! 562: (wp < wdend) && ! 563: (!(hyf & 04) || (wp < (wdend-1))) && ! 564: (!(hyf & 010) || (wp > (wdstart+2))) ! 565: ) ! 566: ){ ! 567: nhyp++; ! 568: storeline(IMP,0); ! 569: } ! 570: } ! 571: i = *wp++; ! 572: w = width(i); ! 573: wne -= w; ! 574: wch--; ! 575: storeline(i,w); ! 576: } ! 577: if(nel >= 0){ ! 578: nwd++; ! 579: return(0); ! 580: } ! 581: xbitf = 1; ! 582: hys = width(0200); /*hyphen*/ ! 583: m1: ! 584: if(!nhyp){ ! 585: if(!nwd)goto m3; ! 586: if(wch == savwch)goto m4; ! 587: } ! 588: if(*--linep != IMP)goto m5; ! 589: if(!(--nhyp)) ! 590: if(!nwd)goto m2; ! 591: if(nel < hys){ ! 592: nc--; ! 593: goto m1; ! 594: } ! 595: m2: ! 596: if(((i = *(linep-1) & CMASK) != '-') && ! 597: (i != 0203) ! 598: ){ ! 599: *linep = (*(linep-1) & ~CMASK) | 0200; ! 600: w = width(*linep); ! 601: nel -= w; ! 602: ne += w; ! 603: linep++; ! 604: /* ! 605: hsend(); ! 606: */ ! 607: } ! 608: m3: ! 609: nwd++; ! 610: m4: ! 611: wordp = wp; ! 612: return(1); ! 613: m5: ! 614: nc--; ! 615: w = width(*linep); ! 616: ne -= w; ! 617: nel += w; ! 618: wne += w; ! 619: wch++; ! 620: wp--; ! 621: goto m1; ! 622: } ! 623: horiz(i) ! 624: int i; ! 625: { ! 626: vflag = 0; ! 627: if(i)pchar(makem(i)); ! 628: } ! 629: setnel(){ ! 630: if(!nc){ ! 631: linep = line; ! 632: if(un1 >= 0){ ! 633: un = un1; ! 634: un1 = -1; ! 635: } ! 636: nel = ll - un; ! 637: ne = adsp = adrem = 0; ! 638: } ! 639: } ! 640: getword(x) ! 641: int x; ! 642: { ! 643: register i, j, swp; ! 644: int noword; ! 645: ! 646: noword = 0; ! 647: if(x)if(pendw){ ! 648: *pendw = 0; ! 649: goto rtn; ! 650: } ! 651: if(wordp = pendw)goto g1; ! 652: hyp = hyptr; ! 653: wordp = word; ! 654: over = wne = wch = 0; ! 655: hyoff = 0; ! 656: while(1){ ! 657: j = (i = GETCH()) & CMASK; ! 658: if(j == '\n'){ ! 659: wne = wch = 0; ! 660: noword = 1; ! 661: goto rtn; ! 662: } ! 663: if(j == ohc){ ! 664: hyoff = 1; ! 665: continue; ! 666: } ! 667: if(j == ' '){ ! 668: storeword(i,cwidth); ! 669: continue; ! 670: } ! 671: break; ! 672: } ! 673: swp = widthp; ! 674: storeword(' ' | chbits, -1); ! 675: if(spflg){ ! 676: storeword(' ' | chbits, -1); ! 677: spflg = 0; ! 678: } ! 679: widthp = swp; ! 680: g0: ! 681: if(j == CONT){ ! 682: pendw = wordp; ! 683: nflush = 0; ! 684: flushi(); ! 685: return(1); ! 686: } ! 687: if(hyoff != 1){ ! 688: if(j == ohc){ ! 689: hyoff = 2; ! 690: *hyp++ = wordp; ! 691: if(hyp > (hyptr+NHYP-1))hyp = hyptr+NHYP-1; ! 692: goto g1; ! 693: } ! 694: if((j == '-') || ! 695: (j == 0203) /*3/4 Em dash*/ ! 696: )if(wordp > word+1){ ! 697: hyoff = 2; ! 698: *hyp++ = wordp + 1; ! 699: if(hyp > (hyptr+NHYP-1))hyp = hyptr+NHYP-1; ! 700: } ! 701: } ! 702: storeword(i,cwidth); ! 703: g1: ! 704: j = (i = GETCH()) & CMASK; ! 705: if(j != ' '){ ! 706: if(j != '\n')goto g0; ! 707: j = *(wordp-1) & CMASK; ! 708: if((j == '.') || ! 709: (j == '!') || ! 710: (j == '?'))spflg++; ! 711: } ! 712: *wordp = 0; ! 713: rtn: ! 714: wdstart = 0; ! 715: wordp = word; ! 716: pendw = 0; ! 717: *hyp++ = 0; ! 718: setnel(); ! 719: return(noword); ! 720: } ! 721: storeword(c,w) ! 722: int c, w; ! 723: { ! 724: ! 725: if(wordp >= &word[WDSIZE - 1]){ ! 726: if(!over){ ! 727: prstrfl("Word overflow.\n"); ! 728: over++; ! 729: c = 0343; ! 730: w = -1; ! 731: goto s1; ! 732: } ! 733: return; ! 734: } ! 735: s1: ! 736: if(w == -1)w = width(c); ! 737: wne += w; ! 738: *wordp++ = c; ! 739: wch++; ! 740: } ! 741: #ifdef NROFF ! 742: extern char trtab[]; ! 743: gettch(){ ! 744: register int i, j; ! 745: ! 746: if(!((i = getch()) & MOT) && (i & ulbit)){ ! 747: j = i&CMASK; ! 748: if(cu && (trtab[j] == ' ')) ! 749: i = ((i & ~ulbit)& ~CMASK) | '_'; ! 750: if(!cu && (j>32) && (j<0370) && !(*t.codetab[j-32] & 0200)) ! 751: i &= ~ulbit; ! 752: } ! 753: return(i); ! 754: } ! 755: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.