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