|
|
1.1 ! root 1: /* @(#)roff:n3.c 2.7 */ ! 2: /* ! 3: * troff3.c ! 4: * ! 5: * macro and string routines, storage allocation ! 6: */ ! 7: ! 8: ! 9: #include "tdef.h" ! 10: #ifdef NROFF ! 11: #include "tw.h" ! 12: #endif ! 13: #include <sgtty.h> ! 14: #include "ext.h" ! 15: ! 16: #define MHASH(x) ((x>>6)^x)&0177 ! 17: struct contab *mhash[128]; /* 128 == the 0177 on line above */ ! 18: #define blisti(i) (((i)-ENV_BLK*BLK) / BLK) ! 19: filep blist[NBLIST]; ! 20: tchar *argtop; ! 21: int pagech = '%'; ! 22: int strflg; ! 23: ! 24: #ifdef INCORE ! 25: tchar *wbuf; ! 26: tchar corebuf[(ENV_BLK + NBLIST + 1) * BLK]; ! 27: #else ! 28: tchar wbuf[BLK]; ! 29: tchar rbuf[BLK]; ! 30: #endif ! 31: ! 32: caseig() ! 33: { ! 34: register i; ! 35: ! 36: offset = 0; ! 37: if ((i = copyb()) != '.') ! 38: control(i, 1); ! 39: } ! 40: ! 41: ! 42: casern() ! 43: { ! 44: register i, j; ! 45: ! 46: lgf++; ! 47: skip(); ! 48: if ((i = getrq()) == 0 || (oldmn = findmn(i)) < 0) ! 49: return; ! 50: skip(); ! 51: clrmn(findmn(j = getrq())); ! 52: if (j) { ! 53: munhash(&contab[oldmn]); ! 54: contab[oldmn].rq = j; ! 55: maddhash(&contab[oldmn]); ! 56: } ! 57: } ! 58: ! 59: maddhash(rp) ! 60: register struct contab *rp; ! 61: { ! 62: register struct contab **hp; ! 63: ! 64: if (rp->rq == 0) ! 65: return; ! 66: hp = &mhash[MHASH(rp->rq)]; ! 67: rp->link = *hp; ! 68: *hp = rp; ! 69: } ! 70: ! 71: munhash(mp) ! 72: register struct contab *mp; ! 73: { ! 74: register struct contab *p; ! 75: register struct contab **lp; ! 76: ! 77: if (mp->rq == 0) ! 78: return; ! 79: lp = &mhash[MHASH(mp->rq)]; ! 80: p = *lp; ! 81: while (p) { ! 82: if (p == mp) { ! 83: *lp = p->link; ! 84: p->link = 0; ! 85: return; ! 86: } ! 87: lp = &p->link; ! 88: p = p->link; ! 89: } ! 90: } ! 91: ! 92: mrehash() ! 93: { ! 94: register struct contab *p; ! 95: register i; ! 96: ! 97: for (i=0; i<128; i++) ! 98: mhash[i] = 0; ! 99: for (p=contab; p < &contab[NM]; p++) ! 100: p->link = 0; ! 101: for (p=contab; p < &contab[NM]; p++) { ! 102: if (p->rq == 0) ! 103: continue; ! 104: i = MHASH(p->rq); ! 105: p->link = mhash[i]; ! 106: mhash[i] = p; ! 107: } ! 108: } ! 109: ! 110: caserm() ! 111: { ! 112: int j; ! 113: ! 114: lgf++; ! 115: while (!skip() && (j = getrq()) != 0) ! 116: clrmn(findmn(j)); ! 117: lgf--; ! 118: } ! 119: ! 120: ! 121: caseas() ! 122: { ! 123: app++; ! 124: caseds(); ! 125: } ! 126: ! 127: ! 128: caseds() ! 129: { ! 130: ds++; ! 131: casede(); ! 132: } ! 133: ! 134: ! 135: caseam() ! 136: { ! 137: app++; ! 138: casede(); ! 139: } ! 140: ! 141: ! 142: casede() ! 143: { ! 144: register i, req; ! 145: register filep savoff; ! 146: extern filep finds(); ! 147: ! 148: if (dip != d) ! 149: wbfl(); ! 150: req = '.'; ! 151: lgf++; ! 152: skip(); ! 153: if ((i = getrq()) == 0) ! 154: goto de1; ! 155: if ((offset = finds(i)) == 0) ! 156: goto de1; ! 157: if (ds) ! 158: copys(); ! 159: else ! 160: req = copyb(); ! 161: wbfl(); ! 162: clrmn(oldmn); ! 163: if (newmn) { ! 164: if (contab[newmn].rq) ! 165: munhash(&contab[newmn]); ! 166: contab[newmn].rq = i; ! 167: maddhash(&contab[newmn]); ! 168: } ! 169: if (apptr) { ! 170: savoff = offset; ! 171: offset = apptr; ! 172: wbt((tchar) IMP); ! 173: offset = savoff; ! 174: } ! 175: offset = dip->op; ! 176: if (req != '.') ! 177: control(req, 1); ! 178: de1: ! 179: ds = app = 0; ! 180: return; ! 181: } ! 182: ! 183: ! 184: findmn(i) ! 185: register int i; ! 186: { ! 187: register struct contab *p; ! 188: ! 189: for (p = mhash[MHASH(i)]; p; p = p->link) ! 190: if (i == p->rq) ! 191: return(p - contab); ! 192: return(-1); ! 193: } ! 194: ! 195: ! 196: clrmn(i) ! 197: register int i; ! 198: { ! 199: if (i >= 0) { ! 200: if (contab[i].mx) ! 201: ffree((filep)contab[i].mx); ! 202: munhash(&contab[i]); ! 203: contab[i].rq = 0; ! 204: contab[i].mx = 0; ! 205: contab[i].f = 0; ! 206: } ! 207: } ! 208: ! 209: ! 210: filep finds(mn) ! 211: register int mn; ! 212: { ! 213: register i; ! 214: register filep savip; ! 215: extern filep alloc(); ! 216: extern filep incoff(); ! 217: ! 218: oldmn = findmn(mn); ! 219: newmn = 0; ! 220: apptr = (filep)0; ! 221: if (app && oldmn >= 0 && contab[oldmn].mx) { ! 222: savip = ip; ! 223: ip = (filep)contab[oldmn].mx; ! 224: oldmn = -1; ! 225: while ((i = rbf()) != 0) ! 226: ; ! 227: apptr = ip; ! 228: if (!diflg) ! 229: ip = incoff(ip); ! 230: nextb = ip; ! 231: ip = savip; ! 232: } else { ! 233: for (i = 0; i < NM; i++) { ! 234: if (contab[i].rq == 0) ! 235: break; ! 236: } ! 237: if (i == NM || (nextb = alloc()) == 0) { ! 238: app = 0; ! 239: if (macerr++ > 1) ! 240: done2(02); ! 241: errprint("Too many (%d) string/macro names", NM); ! 242: edone(04); ! 243: return(offset = 0); ! 244: } ! 245: contab[i].mx = (unsigned) nextb; ! 246: if (!diflg) { ! 247: newmn = i; ! 248: if (oldmn == -1) ! 249: contab[i].rq = -1; ! 250: } else { ! 251: contab[i].rq = mn; ! 252: maddhash(&contab[i]); ! 253: } ! 254: } ! 255: app = 0; ! 256: return(offset = nextb); ! 257: } ! 258: ! 259: ! 260: skip() ! 261: { ! 262: register tchar i; ! 263: ! 264: while (cbits(i = getch()) == ' ') ! 265: ; ! 266: ch = i; ! 267: return(nlflg); ! 268: } ! 269: ! 270: ! 271: copyb() ! 272: { ! 273: register i, j, state; ! 274: register tchar ii; ! 275: int req, k; ! 276: filep savoff; ! 277: ! 278: if (skip() || !(j = getrq())) ! 279: j = '.'; ! 280: req = j; ! 281: k = j >> BYTE; ! 282: j &= BYTEMASK; ! 283: copyf++; ! 284: flushi(); ! 285: nlflg = 0; ! 286: state = 1; ! 287: while (1) { ! 288: i = cbits(ii = getch()); ! 289: if (state == 3) { ! 290: if (i == k) ! 291: break; ! 292: if (!k) { ! 293: ch = ii; ! 294: i = getach(); ! 295: ch = ii; ! 296: if (!i) ! 297: break; ! 298: } ! 299: state = 0; ! 300: goto c0; ! 301: } ! 302: if (i == '\n') { ! 303: state = 1; ! 304: nlflg = 0; ! 305: goto c0; ! 306: } ! 307: if (state == 1 && i == '.') { ! 308: state++; ! 309: savoff = offset; ! 310: goto c0; ! 311: } ! 312: if ((state == 2) && (i == j)) { ! 313: state++; ! 314: goto c0; ! 315: } ! 316: state = 0; ! 317: c0: ! 318: if (offset) ! 319: wbf(ii); ! 320: } ! 321: if (offset) { ! 322: wbfl(); ! 323: offset = savoff; ! 324: wbt((tchar)0); ! 325: } ! 326: copyf--; ! 327: return(req); ! 328: } ! 329: ! 330: ! 331: copys() ! 332: { ! 333: register tchar i; ! 334: ! 335: copyf++; ! 336: if (skip()) ! 337: goto c0; ! 338: if (cbits(i = getch()) != '"') ! 339: wbf(i); ! 340: while (cbits(i = getch()) != '\n') ! 341: wbf(i); ! 342: c0: ! 343: wbt((tchar)0); ! 344: copyf--; ! 345: } ! 346: ! 347: ! 348: filep alloc() ! 349: { ! 350: register i; ! 351: register filep j; ! 352: ! 353: for (i = 0; i < NBLIST; i++) { ! 354: if (blist[i] == 0) ! 355: break; ! 356: } ! 357: if (i == NBLIST) { ! 358: j = 0; ! 359: } else { ! 360: blist[i] = -1; ! 361: j = (filep)i * BLK + ENV_BLK * BLK; ! 362: } ! 363: return(nextb = j); ! 364: } ! 365: ! 366: ! 367: ffree(i) ! 368: filep i; ! 369: { ! 370: register j; ! 371: ! 372: while (blist[j = blisti(i)] != (unsigned) ~0) { ! 373: i = (filep) blist[j]; ! 374: blist[j] = 0; ! 375: } ! 376: blist[j] = 0; ! 377: } ! 378: ! 379: wbt(i) ! 380: tchar i; ! 381: { ! 382: wbf(i); ! 383: wbfl(); ! 384: } ! 385: ! 386: ! 387: wbf(i) ! 388: register tchar i; ! 389: { ! 390: register j; ! 391: ! 392: if (!offset) ! 393: return; ! 394: if (!woff) { ! 395: woff = offset; ! 396: #ifdef INCORE ! 397: wbuf = &corebuf[woff]; /* INCORE only */ ! 398: #endif ! 399: wbfi = 0; ! 400: } ! 401: wbuf[wbfi++] = i; ! 402: if (!((++offset) & (BLK - 1))) { ! 403: wbfl(); ! 404: j = blisti(--offset); ! 405: if (j < 0 || j >= NBLIST) { ! 406: errprint("Out of temp file space"); ! 407: done2(01); ! 408: } ! 409: if (blist[j] == (unsigned) ~0) { ! 410: if (alloc() == 0) { ! 411: errprint("Out of temp file space"); ! 412: done2(01); ! 413: } ! 414: blist[j] = (unsigned)(nextb); ! 415: } ! 416: offset = ((filep)blist[j]); ! 417: } ! 418: if (wbfi >= BLK) ! 419: wbfl(); ! 420: } ! 421: ! 422: ! 423: wbfl() ! 424: { ! 425: if (woff == 0) ! 426: return; ! 427: #ifndef INCORE ! 428: lseek(ibf, ((long)woff) * sizeof(tchar), 0); ! 429: write(ibf, (char *)wbuf, wbfi * sizeof(tchar)); ! 430: #endif ! 431: if ((woff & (~(BLK - 1))) == (roff & (~(BLK - 1)))) ! 432: roff = -1; ! 433: woff = 0; ! 434: } ! 435: ! 436: ! 437: tchar rbf() ! 438: { ! 439: register tchar i; ! 440: register filep j, p; ! 441: extern filep incoff(); ! 442: ! 443: if (ip == NBLIST*BLK) { /* for rdtty */ ! 444: if (j = rdtty()) ! 445: return(j); ! 446: else ! 447: return(popi()); ! 448: } ! 449: /* this is an inline expansion of rbf0: dirty! */ ! 450: #ifndef INCORE ! 451: j = ip & ~(BLK - 1); ! 452: if (j != roff) { ! 453: roff = j; ! 454: lseek(ibf, (long)j * sizeof(tchar), 0); ! 455: if (read(ibf, (char *)rbuf, BLK * sizeof(tchar)) <= 0) ! 456: i = 0; ! 457: else ! 458: i = rbuf[ip & (BLK-1)]; ! 459: } else ! 460: i = rbuf[ip & (BLK-1)]; ! 461: #else ! 462: i = corebuf[ip]; ! 463: #endif ! 464: /* end of rbf0 */ ! 465: if (i == 0) { ! 466: if (!app) ! 467: i = popi(); ! 468: return(i); ! 469: } ! 470: /* this is an inline expansion of incoff: also dirty */ ! 471: p = ++ip; ! 472: if ((p & (BLK - 1)) == 0) { ! 473: if ((ip = blist[blisti(p-1)]) == (unsigned) ~0) { ! 474: ip = 0; ! 475: errprint("Bad storage allocation"); ! 476: done2(-5); ! 477: } ! 478: /* this was meant to protect against people removing ! 479: /* the macro they were standing on, but it's too ! 480: /* sensitive to block boundaries. ! 481: /* if (ip == 0) { ! 482: /* errprint("Block removed while in use"); ! 483: /* done2(-6); ! 484: /* } ! 485: */ ! 486: } ! 487: return(i); ! 488: } ! 489: ! 490: ! 491: tchar rbf0(p) ! 492: register filep p; ! 493: { ! 494: #ifndef INCORE ! 495: register filep i; ! 496: ! 497: if ((i = p & ~(BLK - 1)) != roff) { ! 498: roff = i; ! 499: lseek(ibf, (long)roff * sizeof(tchar), 0); ! 500: if (read(ibf, (char *)rbuf, BLK * sizeof(tchar)) == 0) ! 501: return(0); ! 502: } ! 503: return(rbuf[p & (BLK-1)]); ! 504: #else ! 505: return(corebuf[p]); ! 506: #endif ! 507: } ! 508: ! 509: ! 510: filep incoff(p) ! 511: register filep p; ! 512: { ! 513: p++; ! 514: if ((p & (BLK - 1)) == 0) { ! 515: if ((p = blist[blisti(p-1)]) == (unsigned) ~0) { ! 516: errprint("Bad storage allocation"); ! 517: done2(-5); ! 518: } ! 519: } ! 520: return(p); ! 521: } ! 522: ! 523: ! 524: tchar popi() ! 525: { ! 526: register struct s *p; ! 527: ! 528: if (frame == stk) ! 529: return(0); ! 530: if (strflg) ! 531: strflg--; ! 532: p = nxf = frame; ! 533: p->nargs = 0; ! 534: frame = p->pframe; ! 535: ip = p->pip; ! 536: pendt = p->ppendt; ! 537: lastpbp = p->lastpbp; ! 538: return(p->pch); ! 539: } ! 540: ! 541: /* ! 542: * test that the end of the allocation is above a certain location ! 543: * in memory ! 544: */ ! 545: #define SPACETEST(base, size) while ((enda - (size)) <= (char *)(base)){setbrk(DELTA);} ! 546: ! 547: pushi(newip, mname) ! 548: filep newip; ! 549: int mname; ! 550: { ! 551: register struct s *p; ! 552: extern char *setbrk(); ! 553: ! 554: SPACETEST(nxf, sizeof(struct s)); ! 555: p = nxf; ! 556: p->pframe = frame; ! 557: p->pip = ip; ! 558: p->ppendt = pendt; ! 559: p->pch = ch; ! 560: p->lastpbp = lastpbp; ! 561: p->mname = mname; ! 562: lastpbp = pbp; ! 563: pendt = ch = 0; ! 564: frame = nxf; ! 565: if (nxf->nargs == 0) ! 566: nxf += 1; ! 567: else ! 568: nxf = (struct s *)argtop; ! 569: return(ip = newip); ! 570: } ! 571: ! 572: ! 573: char *setbrk(x) ! 574: int x; ! 575: { ! 576: register char *i, *k; ! 577: register j; ! 578: char *sbrk(); ! 579: ! 580: if ((i = sbrk(x)) == (char *) -1) { ! 581: errprint("Core limit reached"); ! 582: edone(0100); ! 583: } ! 584: if (j = (unsigned)i % sizeof(int)) { /*check alignment for 3B*/ ! 585: j = sizeof(int) - j; /*only init calls should need this*/ ! 586: if ((k = sbrk(j)) == (char *) -1) { ! 587: errprint("Core limit reached"); ! 588: edone(0100); ! 589: } ! 590: if (k != i + x) { /*there must have been an intervening sbrk*/ ! 591: errprint ("internal error in setbrk: i=%x, j=%d, k=%x", ! 592: i, j, k); ! 593: edone(0100); ! 594: } ! 595: i += j; ! 596: } ! 597: enda = i + x; ! 598: return(i); ! 599: } ! 600: ! 601: ! 602: getsn() ! 603: { ! 604: register i; ! 605: ! 606: if ((i = getach()) == 0) ! 607: return(0); ! 608: if (i == '(') ! 609: return(getrq()); ! 610: else ! 611: return(i); ! 612: } ! 613: ! 614: ! 615: setstr() ! 616: { ! 617: register i, j; ! 618: ! 619: lgf++; ! 620: if ((i = getsn()) == 0 || (j = findmn(i)) == -1 || !contab[j].mx) { ! 621: lgf--; ! 622: return(0); ! 623: } else { ! 624: SPACETEST(nxf, sizeof(struct s)); ! 625: nxf->nargs = 0; ! 626: strflg++; ! 627: lgf--; ! 628: return pushi((filep)contab[j].mx, i); ! 629: } ! 630: } ! 631: ! 632: ! 633: ! 634: collect() ! 635: { ! 636: register j; ! 637: register tchar i; ! 638: register tchar *strp; ! 639: tchar * lim; ! 640: tchar * *argpp, **argppend; ! 641: int quote; ! 642: struct s *savnxf; ! 643: ! 644: copyf++; ! 645: nxf->nargs = 0; ! 646: savnxf = nxf; ! 647: if (skip()) ! 648: goto rtn; ! 649: ! 650: { ! 651: char *memp; ! 652: memp = (char *)savnxf; ! 653: /* ! 654: * 1 s structure for the macro descriptor ! 655: * APERMAC tchar *'s for pointers into the strings ! 656: * space for the tchar's themselves ! 657: */ ! 658: memp += sizeof(struct s); ! 659: /* ! 660: * CPERMAC (the total # of characters for ALL arguments) ! 661: * to a macros, has been carefully chosen ! 662: * so that the distance between stack frames is < DELTA ! 663: */ ! 664: #define CPERMAC 200 ! 665: #define APERMAC 9 ! 666: memp += APERMAC * sizeof(tchar *); ! 667: memp += CPERMAC * sizeof(tchar); ! 668: nxf = (struct s*)memp; ! 669: } ! 670: lim = (tchar *)nxf; ! 671: argpp = (tchar **)(savnxf + 1); ! 672: argppend = &argpp[APERMAC]; ! 673: SPACETEST(argppend, sizeof(tchar *)); ! 674: strp = (tchar *)argppend; ! 675: /* ! 676: * Zero out all the string pointers before filling them in. ! 677: */ ! 678: for (j = 0; j < APERMAC; j++){ ! 679: argpp[j] = (tchar *)0; ! 680: } ! 681: #if 0 ! 682: errprint("savnxf=0x%x,nxf=0x%x,argpp=0x%x,strp=argppend=0x%x,lim=0x%x,enda=0x%x", ! 683: savnxf, nxf, argpp, strp, lim, enda); ! 684: #endif 0 ! 685: strflg = 0; ! 686: while ((argpp != argppend) && (!skip())) { ! 687: *argpp++ = strp; ! 688: quote = 0; ! 689: if (cbits(i = getch()) == '"') ! 690: quote++; ! 691: else ! 692: ch = i; ! 693: while (1) { ! 694: i = getch(); ! 695: if (nlflg || (!quote && cbits(i) == ' ')) ! 696: break; ! 697: if ( quote ! 698: && (cbits(i) == '"') ! 699: && (cbits(i = getch()) != '"')) { ! 700: ch = i; ! 701: break; ! 702: } ! 703: *strp++ = i; ! 704: if (strflg && strp >= lim) { ! 705: #if 0 ! 706: errprint("strp=0x%x, lim = 0x%x", ! 707: strp, lim); ! 708: #endif 0 ! 709: errprint("Macro argument too long"); ! 710: copyf--; ! 711: edone(004); ! 712: } ! 713: SPACETEST(strp, 3 * sizeof(tchar)); ! 714: } ! 715: *strp++ = 0; ! 716: } ! 717: nxf = savnxf; ! 718: nxf->nargs = argpp - (tchar **)(savnxf + 1); ! 719: argtop = strp; ! 720: rtn: ! 721: copyf--; ! 722: } ! 723: ! 724: ! 725: seta() ! 726: { ! 727: register i; ! 728: ! 729: i = cbits(getch()) - '0'; ! 730: if (i > 0 && i <= APERMAC && i <= frame->nargs) ! 731: pushback(*(((tchar **)(frame + 1)) + i - 1)); ! 732: } ! 733: ! 734: ! 735: caseda() ! 736: { ! 737: app++; ! 738: casedi(); ! 739: } ! 740: ! 741: ! 742: casedi() ! 743: { ! 744: register i, j; ! 745: register *k; ! 746: ! 747: lgf++; ! 748: if (skip() || (i = getrq()) == 0) { ! 749: if (dip != d) ! 750: wbt((tchar)0); ! 751: if (dilev > 0) { ! 752: numtab[DN].val = dip->dnl; ! 753: numtab[DL].val = dip->maxl; ! 754: dip = &d[--dilev]; ! 755: offset = dip->op; ! 756: } ! 757: goto rtn; ! 758: } ! 759: if (++dilev == NDI) { ! 760: --dilev; ! 761: errprint("Diversions nested too deep"); ! 762: edone(02); ! 763: } ! 764: if (dip != d) ! 765: wbt((tchar)0); ! 766: diflg++; ! 767: dip = &d[dilev]; ! 768: dip->op = finds(i); ! 769: dip->curd = i; ! 770: clrmn(oldmn); ! 771: k = (int *) & dip->dnl; ! 772: for (j = 0; j < 10; j++) ! 773: k[j] = 0; /*not op and curd*/ ! 774: rtn: ! 775: app = 0; ! 776: diflg = 0; ! 777: } ! 778: ! 779: ! 780: casedt() ! 781: { ! 782: lgf++; ! 783: dip->dimac = dip->ditrap = dip->ditf = 0; ! 784: skip(); ! 785: dip->ditrap = vnumb((int *)0); ! 786: if (nonumb) ! 787: return; ! 788: skip(); ! 789: dip->dimac = getrq(); ! 790: } ! 791: ! 792: ! 793: casetl() ! 794: { ! 795: register j; ! 796: int w[3]; ! 797: tchar buf[LNSIZE]; ! 798: register tchar *tp; ! 799: tchar i, delim; ! 800: ! 801: dip->nls = 0; ! 802: skip(); ! 803: if (ismot(delim = getch())) { ! 804: ch = delim; ! 805: delim = '\''; ! 806: } else ! 807: delim = cbits(delim); ! 808: tp = buf; ! 809: numtab[HP].val = 0; ! 810: w[0] = w[1] = w[2] = 0; ! 811: j = 0; ! 812: while (cbits(i = getch()) != '\n') { ! 813: if (cbits(i) == cbits(delim)) { ! 814: if (j < 3) ! 815: w[j] = numtab[HP].val; ! 816: numtab[HP].val = 0; ! 817: j++; ! 818: *tp++ = 0; ! 819: } else { ! 820: if (cbits(i) == pagech) { ! 821: setn1(numtab[PN].val, numtab[findr('%')].fmt, ! 822: i&SFMASK); ! 823: continue; ! 824: } ! 825: numtab[HP].val += width(i); ! 826: if (tp < &buf[LNSIZE-10]) ! 827: *tp++ = i; ! 828: } ! 829: } ! 830: if (j<3) ! 831: w[j] = numtab[HP].val; ! 832: *tp++ = 0; ! 833: *tp++ = 0; ! 834: *tp++ = 0; ! 835: tp = buf; ! 836: #ifdef NROFF ! 837: horiz(po); ! 838: #endif ! 839: while (i = *tp++) ! 840: pchar(i); ! 841: if (w[1] || w[2]) ! 842: horiz(j = quant((lt - w[1]) / 2 - w[0], HOR)); ! 843: while (i = *tp++) ! 844: pchar(i); ! 845: if (w[2]) { ! 846: horiz(lt - w[0] - w[1] - w[2] - j); ! 847: while (i = *tp++) ! 848: pchar(i); ! 849: } ! 850: newline(0); ! 851: if (dip != d) { ! 852: if (dip->dnl > dip->hnl) ! 853: dip->hnl = dip->dnl; ! 854: } else { ! 855: if (numtab[NL].val > dip->hnl) ! 856: dip->hnl = numtab[NL].val; ! 857: } ! 858: } ! 859: ! 860: ! 861: casepc() ! 862: { ! 863: pagech = chget(IMP); ! 864: } ! 865: ! 866: ! 867: casepm() ! 868: { ! 869: register i, k; ! 870: register char *p; ! 871: int xx, cnt, tcnt, kk, tot; ! 872: filep j; ! 873: char pmline[10]; ! 874: ! 875: kk = cnt = tcnt = 0; ! 876: tot = !skip(); ! 877: for (i = 0; i < NM; i++) { ! 878: if ((xx = contab[i].rq) == 0 || contab[i].mx == 0) ! 879: continue; ! 880: tcnt++; ! 881: p = pmline; ! 882: j = (filep) contab[i].mx; ! 883: k = 1; ! 884: while ((j = blist[blisti(j)]) != (unsigned) ~0) { ! 885: k++; ! 886: } ! 887: cnt++; ! 888: kk += k; ! 889: if (!tot) { ! 890: *p++ = xx & 0177; ! 891: if (!(*p++ = (xx >> BYTE) & 0177)) ! 892: *(p - 1) = ' '; ! 893: *p++ = 0; ! 894: fdprintf(stderr, "%s %d\n", pmline, k); ! 895: } ! 896: } ! 897: fdprintf(stderr, "pm: total %d, macros %d, space %d\n", tcnt, cnt, kk); ! 898: } ! 899: ! 900: stackdump() /* dumps stack of macros in process */ ! 901: { ! 902: struct s *p; ! 903: ! 904: if (p != stk) { ! 905: for (p = frame; p != stk; p = p->pframe) ! 906: fdprintf(stderr, "%c%c ", p->mname&0177, (p->mname>>BYTE)&0177); ! 907: fdprintf(stderr, "\n"); ! 908: } ! 909: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.