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