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