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