|
|
1.1 ! root 1: #include "tdef.h" ! 2: #include "ext.h" ! 3: #include "fns.h" ! 4: ! 5: /* ! 6: * troff9.c ! 7: * ! 8: * misc functions ! 9: */ ! 10: ! 11: Tchar setz(void) ! 12: { ! 13: Tchar i; ! 14: ! 15: if (!ismot(i = getch())) ! 16: i |= ZBIT; ! 17: return(i); ! 18: } ! 19: ! 20: void setline(void) ! 21: { ! 22: Tchar *i; ! 23: Tchar c; ! 24: int length; ! 25: int j, w, cnt, delim, rem, temp; ! 26: Tchar linebuf[NC]; ! 27: ! 28: if (ismot(c = getch())) ! 29: return; ! 30: delim = cbits(c); ! 31: vflag = 0; ! 32: dfact = EM; ! 33: length = quant(atoi0(), HOR); ! 34: dfact = 1; ! 35: if (!length) { ! 36: eat(delim); ! 37: return; ! 38: } ! 39: s0: ! 40: if ((j = cbits(c = getch())) == delim || j == '\n') { ! 41: ch = c; ! 42: c = RULE | chbits; ! 43: } else if (cbits(c) == FILLER) ! 44: goto s0; ! 45: w = width(c); ! 46: if (w <= 0) { ! 47: ERROR "zero-width underline character ignored" WARN; ! 48: c = RULE | chbits; ! 49: w = width(c); ! 50: } ! 51: i = linebuf; ! 52: if (length < 0) { ! 53: *i++ = makem(length); ! 54: length = -length; ! 55: } ! 56: if (!(cnt = length / w)) { ! 57: *i++ = makem(-(temp = ((w - length) / 2))); ! 58: *i++ = c; ! 59: *i++ = makem(-(w - length - temp)); ! 60: goto s1; ! 61: } ! 62: if (rem = length % w) { ! 63: if (cbits(c) == RULE || cbits(c) == UNDERLINE || cbits(c) == ROOTEN) ! 64: *i++ = c | ZBIT; ! 65: *i++ = makem(rem); ! 66: } ! 67: if (cnt) { ! 68: *i++ = RPT; ! 69: *i++ = cnt; ! 70: *i++ = c; ! 71: } ! 72: s1: ! 73: *i = 0; ! 74: eat(delim); ! 75: pushback(linebuf); ! 76: } ! 77: ! 78: ! 79: eat(int c) ! 80: { ! 81: int i; ! 82: ! 83: while ((i = cbits(getch())) != c && i != '\n') ! 84: ; ! 85: return(i); ! 86: } ! 87: ! 88: ! 89: void setov(void) ! 90: { ! 91: int j, k; ! 92: Tchar i, o[NOV+1]; ! 93: int delim, w[NOV+1]; ! 94: ! 95: if (ismot(i = getch())) ! 96: return; ! 97: delim = cbits(i); ! 98: for (k = 0; k < NOV && (j = cbits(i = getch())) != delim && j != '\n'; k++) { ! 99: o[k] = i; ! 100: w[k] = width(i); ! 101: } ! 102: o[k] = w[k] = 0; ! 103: if (o[0]) ! 104: for (j = 1; j; ) { ! 105: j = 0; ! 106: for (k = 1; o[k] ; k++) { ! 107: if (w[k-1] < w[k]) { ! 108: j++; ! 109: i = w[k]; ! 110: w[k] = w[k-1]; ! 111: w[k-1] = i; ! 112: i = o[k]; ! 113: o[k] = o[k-1]; ! 114: o[k-1] = i; ! 115: } ! 116: } ! 117: } ! 118: else ! 119: return; ! 120: *pbp++ = makem(w[0] / 2); ! 121: for (k = 0; o[k]; k++) ! 122: ; ! 123: while (k>0) { ! 124: k--; ! 125: *pbp++ = makem(-((w[k] + w[k+1]) / 2)); ! 126: *pbp++ = o[k]; ! 127: } ! 128: } ! 129: ! 130: ! 131: void setbra(void) ! 132: { ! 133: int k; ! 134: Tchar i, *j, dwn; ! 135: int cnt, delim; ! 136: Tchar brabuf[NC]; ! 137: ! 138: if (ismot(i = getch())) ! 139: return; ! 140: delim = cbits(i); ! 141: j = brabuf + 1; ! 142: cnt = 0; ! 143: if (NROFF) ! 144: dwn = (2 * t.Halfline) | MOT | VMOT; ! 145: else ! 146: dwn = EM | MOT | VMOT; ! 147: while ((k = cbits(i = getch())) != delim && k != '\n' && j <= brabuf + NC - 4) { ! 148: *j++ = i | ZBIT; ! 149: *j++ = dwn; ! 150: cnt++; ! 151: } ! 152: if (--cnt < 0) ! 153: return; ! 154: else if (!cnt) { ! 155: ch = *(j - 2); ! 156: return; ! 157: } ! 158: *j = 0; ! 159: if (NROFF) ! 160: *--j = *brabuf = (cnt * t.Halfline) | MOT | NMOT | VMOT; ! 161: else ! 162: *--j = *brabuf = (cnt * EM) / 2 | MOT | NMOT | VMOT; ! 163: *--j &= ~ZBIT; ! 164: pushback(brabuf); ! 165: } ! 166: ! 167: ! 168: void setvline(void) ! 169: { ! 170: int i; ! 171: Tchar c, rem, ver, neg; ! 172: int cnt, delim, v; ! 173: Tchar vlbuf[NC]; ! 174: Tchar *vlp; ! 175: ! 176: if (ismot(c = getch())) ! 177: return; ! 178: delim = cbits(c); ! 179: dfact = lss; ! 180: vflag++; ! 181: i = quant(atoi0(), VERT); ! 182: dfact = 1; ! 183: if (!i) { ! 184: eat(delim); ! 185: vflag = 0; ! 186: return; ! 187: } ! 188: if ((cbits(c = getch())) == delim) { ! 189: c = BOXRULE | chbits; /*default box rule*/ ! 190: } else ! 191: getch(); ! 192: c |= ZBIT; ! 193: neg = 0; ! 194: if (i < 0) { ! 195: i = -i; ! 196: neg = NMOT; ! 197: } ! 198: if (NROFF) ! 199: v = 2 * t.Halfline; ! 200: else { ! 201: v = EM; ! 202: if (v < VERT) /* ATT EVK hack: Erik van Konijnenburg, */ ! 203: v = VERT; /* hvlpb!evkonij, ATT NSI Hilversum, Holland */ ! 204: } ! 205: ! 206: cnt = i / v; ! 207: rem = makem(i % v) | neg; ! 208: ver = makem(v) | neg; ! 209: vlp = vlbuf; ! 210: if (!neg) ! 211: *vlp++ = ver; ! 212: if (absmot(rem) != 0) { ! 213: *vlp++ = c; ! 214: *vlp++ = rem; ! 215: } ! 216: while (vlp < vlbuf + NC - 3 && cnt--) { ! 217: *vlp++ = c; ! 218: *vlp++ = ver; ! 219: } ! 220: *(vlp - 2) &= ~ZBIT; ! 221: if (!neg) ! 222: vlp--; ! 223: *vlp = 0; ! 224: pushback(vlbuf); ! 225: vflag = 0; ! 226: } ! 227: ! 228: #define NPAIR (NC/2-6) /* max pairs in spline, etc. */ ! 229: ! 230: void setdraw(void) /* generate internal cookies for a drawing function */ ! 231: { ! 232: int i, j, k, dx[NPAIR], dy[NPAIR], delim, type; ! 233: Tchar c, drawbuf[NC]; ! 234: int drawch = '.'; /* character to draw with */ ! 235: ! 236: /* input is \D'f dx dy dx dy ... c' (or at least it had better be) */ ! 237: /* this does drawing function f with character c and the */ ! 238: /* specified dx,dy pairs interpreted as appropriate */ ! 239: /* pairs are deltas from last point, except for radii */ ! 240: ! 241: /* l dx dy: line from here by dx,dy */ ! 242: /* c x: circle of diameter x, left side here */ ! 243: /* e x y: ellipse of diameters x,y, left side here */ ! 244: /* a dx1 dy1 dx2 dy2: ! 245: ccw arc: ctr at dx1,dy1, then end at dx2,dy2 from there */ ! 246: /* ~ dx1 dy1 dx2 dy2...: ! 247: spline to dx1,dy1 to dx2,dy2 ... */ ! 248: /* b x c: ! 249: built-up character of type c, ht x */ ! 250: /* f dx dy ...: f is any other char: like spline */ ! 251: ! 252: if (ismot(c = getch())) ! 253: return; ! 254: delim = cbits(c); ! 255: type = cbits(getch()); ! 256: if (type == '~') /* head off the .tr ~ problem */ ! 257: type = 's'; ! 258: for (i = 0; i < NPAIR ; i++) { ! 259: skip(); ! 260: vflag = 0; ! 261: dfact = EM; ! 262: dx[i] = quant(atoi0(), HOR); ! 263: if (dx[i] > MAXMOT) ! 264: dx[i] = MAXMOT; ! 265: else if (dx[i] < -MAXMOT) ! 266: dx[i] = -MAXMOT; ! 267: skip(); ! 268: vflag = 1; ! 269: dfact = lss; ! 270: dy[i] = quant(atoi0(), VERT); ! 271: if (dy[i] > MAXMOT) ! 272: dy[i] = MAXMOT; ! 273: else if (dy[i] < -MAXMOT) ! 274: dy[i] = -MAXMOT; ! 275: if (cbits(c = getch()) != ' ') { /* must be the end */ ! 276: if (cbits(c) != delim) { ! 277: drawch = cbits(c); ! 278: getch(); ! 279: } ! 280: i++; ! 281: break; ! 282: } ! 283: } ! 284: dfact = 1; ! 285: vflag = 0; ! 286: if (TROFF) { ! 287: drawbuf[0] = DRAWFCN | chbits | ZBIT; ! 288: drawbuf[1] = type | chbits | ZBIT; ! 289: drawbuf[2] = drawch | chbits | ZBIT; ! 290: for (k = 0, j = 3; k < i; k++) { ! 291: drawbuf[j++] = MOT | ((dx[k] >= 0) ? dx[k] : (NMOT | -dx[k])); ! 292: drawbuf[j++] = MOT | VMOT | ((dy[k] >= 0) ? dy[k] : (NMOT | -dy[k])); ! 293: } ! 294: if (type == DRAWELLIPSE) { ! 295: drawbuf[5] = drawbuf[4] | NMOT; /* so the net vertical is zero */ ! 296: j = 6; ! 297: } else if (type == DRAWBUILD) { ! 298: drawbuf[4] = drawbuf[3] | NMOT; /* net horizontal motion is zero */ ! 299: drawbuf[2] &= ~ZBIT; /* width taken from drawing char */ ! 300: j = 5; ! 301: } ! 302: drawbuf[j++] = DRAWFCN | chbits | ZBIT; /* marks end for ptout */ ! 303: drawbuf[j] = 0; ! 304: pushback(drawbuf); ! 305: } ! 306: } ! 307: ! 308: ! 309: void casefc(void) ! 310: { ! 311: int i; ! 312: Tchar j; ! 313: ! 314: gchtab[fc] &= ~FCBIT; ! 315: fc = IMP; ! 316: padc = ' '; ! 317: if (skip() || ismot(j = getch()) || (i = cbits(j)) == '\n') ! 318: return; ! 319: fc = i; ! 320: gchtab[fc] |= FCBIT; ! 321: if (skip() || ismot(ch) || (ch = cbits(ch)) == fc) ! 322: return; ! 323: padc = ch; ! 324: } ! 325: ! 326: ! 327: Tchar setfield(int x) ! 328: { ! 329: Tchar ii, jj, *fp; ! 330: int i, j; ! 331: int length, ws, npad, temp, type; ! 332: Tchar **pp, *padptr[NPP]; ! 333: Tchar fbuf[FBUFSZ]; ! 334: int savfc, savtc, savlc; ! 335: Tchar rchar; ! 336: int savepos; ! 337: ! 338: if (x == tabch) ! 339: rchar = tabc | chbits; ! 340: else if (x == ldrch) ! 341: rchar = dotc | chbits; ! 342: temp = npad = ws = 0; ! 343: savfc = fc; ! 344: savtc = tabch; ! 345: savlc = ldrch; ! 346: tabch = ldrch = fc = IMP; ! 347: savepos = numtab[HP].val; ! 348: gchtab[tabch] &= ~TABBIT; ! 349: gchtab[ldrch] &= ~LDRBIT; ! 350: gchtab[fc] &= ~FCBIT; ! 351: gchtab[IMP] |= TABBIT|LDRBIT|FCBIT; ! 352: for (j = 0; ; j++) { ! 353: if ((tabtab[j] & TABMASK) == 0) { ! 354: if (x == savfc) ! 355: ERROR "zero field width." WARN; ! 356: jj = 0; ! 357: goto rtn; ! 358: } ! 359: if ((length = ((tabtab[j] & TABMASK) - numtab[HP].val)) > 0 ) ! 360: break; ! 361: } ! 362: type = tabtab[j] & ~TABMASK; ! 363: fp = fbuf; ! 364: pp = padptr; ! 365: if (x == savfc) { ! 366: while (1) { ! 367: j = cbits(ii = getch()); ! 368: jj = width(ii); ! 369: widthp = jj; ! 370: numtab[HP].val += jj; ! 371: if (j == padc) { ! 372: npad++; ! 373: *pp++ = fp; ! 374: if (pp > padptr + NPP - 1) ! 375: break; ! 376: goto s1; ! 377: } else if (j == savfc) ! 378: break; ! 379: else if (j == '\n') { ! 380: temp = j; ! 381: nlflg = 0; ! 382: break; ! 383: } ! 384: ws += jj; ! 385: s1: ! 386: *fp++ = ii; ! 387: if (fp > fbuf + FBUFSZ - 3) ! 388: break; ! 389: } ! 390: if (!npad) { ! 391: npad++; ! 392: *pp++ = fp; ! 393: *fp++ = 0; ! 394: } ! 395: *fp++ = temp; ! 396: *fp = 0; ! 397: temp = i = (j = length - ws) / npad; ! 398: i = (i / HOR) * HOR; ! 399: if ((j -= i * npad) < 0) ! 400: j = -j; ! 401: ii = makem(i); ! 402: if (temp < 0) ! 403: ii |= NMOT; ! 404: for (; npad > 0; npad--) { ! 405: *(*--pp) = ii; ! 406: if (j) { ! 407: j -= HOR; ! 408: (*(*pp)) += HOR; ! 409: } ! 410: } ! 411: pushback(fbuf); ! 412: jj = 0; ! 413: } else if (type == 0) { ! 414: /*plain tab or leader*/ ! 415: if ((j = width(rchar)) > 0) { ! 416: int nchar = length / j; ! 417: while (nchar-->0 && pbp < &pbbuf[NC-3]) { ! 418: numtab[HP].val += j; ! 419: widthp = j; ! 420: *pbp++ = rchar; ! 421: } ! 422: length %= j; ! 423: } ! 424: if (length) ! 425: jj = length | MOT; ! 426: else ! 427: jj = getch0(); ! 428: } else { ! 429: /*center tab*/ ! 430: /*right tab*/ ! 431: while ((j = cbits(ii = getch())) != savtc && j != '\n' && j != savlc) { ! 432: jj = width(ii); ! 433: ws += jj; ! 434: numtab[HP].val += jj; ! 435: widthp = jj; ! 436: *fp++ = ii; ! 437: if (fp > fbuf + FBUFSZ - 3) ! 438: break; ! 439: } ! 440: *fp++ = ii; ! 441: *fp = 0; ! 442: if (type == RTAB) ! 443: length -= ws; ! 444: else ! 445: length -= ws / 2; /*CTAB*/ ! 446: pushback(fbuf); ! 447: if ((j = width(rchar)) != 0 && length > 0) { ! 448: int nchar = length / j; ! 449: while (nchar-- > 0 && pbp < &pbbuf[NC-3]) ! 450: *pbp++ = rchar; ! 451: length %= j; ! 452: } ! 453: length = (length / HOR) * HOR; ! 454: jj = makem(length); ! 455: nlflg = 0; ! 456: } ! 457: rtn: ! 458: gchtab[fc] &= ~FCBIT; ! 459: gchtab[tabch] &= ~TABBIT; ! 460: gchtab[ldrch] &= ~LDRBIT; ! 461: fc = savfc; ! 462: tabch = savtc; ! 463: ldrch = savlc; ! 464: gchtab[fc] |= FCBIT; ! 465: gchtab[tabch] = TABBIT; ! 466: gchtab[ldrch] |= LDRBIT; ! 467: numtab[HP].val = savepos; ! 468: return(jj); ! 469: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.