|
|
1.1 ! root 1: #include "tdef.hd" ! 2: #include "strs.hd" ! 3: #ifdef NROFF ! 4: #include "tw.hd" ! 5: extern struct ttable t; ! 6: #endif ! 7: /* ! 8: troff9.c ! 9: ! 10: misc functions ! 11: */ ! 12: ! 13: #ifndef INCORE ! 14: extern struct envblock eblock; ! 15: #else ! 16: extern struct envblock eblock[NEV]; ! 17: extern int ev; ! 18: #endif ! 19: extern struct datablock dblock; ! 20: ! 21: extern int rptbuf[]; ! 22: extern int *cstk[], cstkl; ! 23: extern int ch_CMASK; ! 24: extern long atoi0(); ! 25: extern int cbuf[]; ! 26: extern int ch; ! 27: extern int dfact; ! 28: extern int vflag; ! 29: extern int fc; ! 30: extern int padc; ! 31: extern int nlflg; ! 32: extern int tabch, ldrch; ! 33: setline(){ ! 34: register *i, length, c; ! 35: int w, cnt, delim, rem, temp; ! 36: ! 37: if((delim = getch()) & MOT)return; ! 38: else delim &= CMASK; ! 39: vflag = 0; ! 40: dfact = EM; ! 41: length = quant(atoi(),HOR); ! 42: dfact = 1; ! 43: if(!length){ ! 44: eat(delim); ! 45: return; ! 46: } ! 47: s0: ! 48: if ((c = getch()) && (ch_CMASK == delim)) { ! 49: ch = c; ! 50: c = 0204 | chbits; } ! 51: else if (ch_CMASK == FILLER) goto s0; ! 52: w = width(c); ! 53: i = cbuf; ! 54: if(length < 0){ ! 55: *i++ = makem(length); ! 56: length = -length; ! 57: } ! 58: if(!(cnt = length/w)){ ! 59: *i++ = makem(-(temp = ((w-length)/2))); ! 60: *i++ = c; ! 61: *i++ = makem(-(w - length - temp)); ! 62: goto s1; ! 63: } ! 64: if(rem = length%w){ ! 65: switch(c & CMASK){ ! 66: case 0204: /*rule*/ ! 67: case 0224: /*underrule*/ ! 68: case 0276: /*root en*/ ! 69: *i++ = c | ZBIT; ! 70: default: ! 71: *i++ = makem(rem); ! 72: } ! 73: } ! 74: while (cnt--) *i++ = c; ! 75: s1: ! 76: *i++ = 0; ! 77: eat(delim); ! 78: setcp(cbuf); ! 79: } ! 80: eat(c) ! 81: int c; ! 82: { ! 83: do getch(); ! 84: while ((ch_CMASK != c) && (ch_CMASK != '\n')); ! 85: } ! 86: setov(){ ! 87: register i, j, k; ! 88: int *p, delim, o[NOV], w[NOV]; ! 89: ! 90: if((delim = getch()) & MOT)return; ! 91: else delim &= CMASK; ! 92: for (k=0; ((k<NOV) && (i = getch()) && (ch_CMASK != delim) && ! 93: (ch_CMASK != '\n')); k++){ ! 94: o[k] = i; ! 95: w[k] = width(i); ! 96: } ! 97: o[k] = w[k] = 0; ! 98: if(o[0]) ! 99: do { ! 100: j = 0; ! 101: for(k=1; o[k] ; k++) ! 102: if(w[k-1] < w[k]){ ! 103: j++; ! 104: i = w[k]; ! 105: w[k] = w[k-1]; ! 106: w[k-1] = i; ! 107: i = o[k]; ! 108: o[k] = o[k-1]; ! 109: o[k-1] = i; }} ! 110: while (j); ! 111: else return; ! 112: p = cbuf; ! 113: for(k=0; o[k]; k++){ ! 114: *p++ = o[k]; ! 115: *p++ = makem(-((w[k]+w[k+1])/2)); ! 116: } ! 117: *p++ = makem(w[0]/2); ! 118: *p = 0; ! 119: setcp(cbuf); ! 120: } ! 121: setbra(){ ! 122: register i, *j; ! 123: int cnt, delim, dwn; ! 124: ! 125: if((delim = getch()) & MOT)return; ! 126: else delim &= CMASK; ! 127: j = cbuf + 1; ! 128: cnt = 0; ! 129: #ifdef NROFF ! 130: dwn = (2*t.Halfline) | MOT | VMOT; ! 131: #endif ! 132: #ifndef NROFF ! 133: dwn = EM | MOT | VMOT; ! 134: #endif ! 135: while ((i = getch()) && (ch_CMASK != delim) && (ch_CMASK != '\n') && ! 136: (j <= (cbuf+NC-4))){ ! 137: *j++ = i | ZBIT; ! 138: *j++ = dwn; ! 139: cnt++; ! 140: } ! 141: if(--cnt < 0)return; ! 142: else if (!cnt){ ! 143: ch = *(j-2); ! 144: return; ! 145: } ! 146: *j = 0; ! 147: #ifdef NROFF ! 148: *--j = *cbuf = (cnt*t.Halfline) | MOT | NMOT | VMOT; ! 149: #endif ! 150: #ifndef NROFF ! 151: *--j = *cbuf = (cnt*EM)/2 | MOT | NMOT | VMOT; ! 152: #endif ! 153: *--j &= ~ZBIT; ! 154: setcp(cbuf); ! 155: } ! 156: setvline(){ ! 157: register i, c, *k; ! 158: int cnt, neg, rem, ver, delim; ! 159: ! 160: if((delim = getch()) & MOT)return; ! 161: else delim &= CMASK; ! 162: dfact = lss; ! 163: vflag++; ! 164: i = quant(atoi(),VERT); ! 165: dfact = 1; ! 166: if(!i){ ! 167: eat(delim); ! 168: vflag = 0; ! 169: return; ! 170: } ! 171: if ((c = getch()) && (ch_CMASK == delim)) { ! 172: c = 0337 | chbits; /*default box rule*/ ! 173: }else getch(); ! 174: c |= ZBIT; ! 175: neg = 0; ! 176: if(i < 0){ ! 177: i = -i; ! 178: neg = NMOT; ! 179: } ! 180: #ifdef NROFF ! 181: ver = 2*t.Halfline; ! 182: #endif ! 183: #ifndef NROFF ! 184: ver = EM; ! 185: #endif ! 186: cnt = i/ver; ! 187: rem = makem(i%ver) | neg; ! 188: ver = makem(ver) | neg; ! 189: k = cbuf; ! 190: if(!neg)*k++ = ver; ! 191: if(rem & ~MOTV){ ! 192: *k++ = c; ! 193: *k++ = rem; ! 194: } ! 195: while((k < (cbuf+NC-3)) && cnt--){ ! 196: *k++ = c; ! 197: *k++ = ver; ! 198: } ! 199: *(k-2) &= ~ZBIT; ! 200: if(!neg)k--; ! 201: *k = 0; ! 202: setcp(cbuf); ! 203: vflag = 0; ! 204: } ! 205: casefc(){ ! 206: ! 207: fc = IMP; ! 208: padc = ' '; ! 209: if (skip() || (getch() & MOT) || (ch_CMASK == '\n')) return; ! 210: fc = ch_CMASK; ! 211: if(skip() || (ch & MOT) || ((ch &= CMASK) == fc))return; ! 212: padc = ch; ! 213: } ! 214: setfield(x) ! 215: int x; ! 216: { ! 217: register i, j, *fp; ! 218: int length, ws, npad, temp, type, rchar; ! 219: int **pp, *padptr[NPP]; ! 220: static int fbuf[FBUFSZ]; ! 221: int savfc, savtc, savlc; ! 222: ! 223: if(x == tabch) rchar = tabc | chbits; ! 224: else if(x == ldrch) rchar = dotc | chbits; ! 225: temp = npad = ws = 0; ! 226: savfc = fc; savtc = tabch; savlc = ldrch; ! 227: tabch = ldrch = fc = IMP; ! 228: for(j=0;1;j++){ ! 229: if((tabtab[j] & TMASK)== 0){ ! 230: if(x==savfc)prstr("Zero field width.\n"); ! 231: j = 0; ! 232: goto rtn; ! 233: } ! 234: if((length = ((tabtab[j] & TMASK) - v_hp)) > 0 )break; ! 235: } ! 236: type = tabtab[j] & (~TMASK); ! 237: fp = fbuf; ! 238: pp = padptr; ! 239: if(x == savfc){while(1){ ! 240: if ((i = getch()) && (ch_CMASK == padc)) { ! 241: npad++; ! 242: *pp++ = fp; ! 243: if(pp > (padptr + NPP - 1))break; ! 244: goto s1; ! 245: }else if(ch_CMASK == savfc) break; ! 246: else if(ch_CMASK == '\n'){ ! 247: temp = ch_CMASK; ! 248: nlflg = 0; ! 249: break; ! 250: } ! 251: ws += width(i); ! 252: s1: ! 253: *fp++ = i; ! 254: if(fp > (fbuf + FBUFSZ -3))break; ! 255: } ! 256: if(!npad){ ! 257: npad++; ! 258: *pp++ = fp; ! 259: *fp++ = 0; ! 260: } ! 261: *fp++ = temp; ! 262: *fp++ = 0; ! 263: temp = i = (j = length-ws)/npad; ! 264: i = (i/HOR)*HOR; ! 265: if((j -= i*npad) <0)j = -j; ! 266: i = makem(i); ! 267: if(temp <0)i |= NMOT; ! 268: for(;npad > 0; npad--){ ! 269: *(*--pp) = i; ! 270: if(j){ ! 271: j -= HOR; ! 272: (*(*pp)) += HOR; ! 273: } ! 274: } ! 275: setcp(fbuf); ! 276: j = 0; ! 277: }else if(type == 0){ ! 278: /*plain tab or leader*/ ! 279: if((j = width(rchar)) != 0) { ! 280: fp = rptbuf; ! 281: i = ((length/j) > (RPTLEN-1)) ? ! 282: RPTLEN - 1 : length / j; ! 283: for (;i;i--) ! 284: *fp++ = rchar; ! 285: *fp = 0; ! 286: setrp(rptbuf); /* setup repeat string */ ! 287: length %= j; } ! 288: if(length)j = length | MOT; ! 289: else j = getch0(); ! 290: }else{ ! 291: /*center tab*/ ! 292: /*right tab*/ ! 293: while ((i = getch()) && (ch_CMASK != savtc) && ! 294: (ch_CMASK != '\n') && (ch_CMASK != savlc)) { ! 295: ws += width(i); ! 296: *fp++ = i; ! 297: if(fp > (fbuf +FBUFSZ - 3)) break; ! 298: } ! 299: *fp++ = i; ! 300: *fp++ = 0; ! 301: if(type == RTAB)length -= ws; ! 302: else length -= ws/2; /*CTAB*/ ! 303: if(((j = width(rchar)) != 0) && (length > 0)) { ! 304: fp = rptbuf; ! 305: i = ((length/j) > (RPTLEN-1)) ? ! 306: RPTLEN - 1 : length / j; ! 307: for (;i;i--) ! 308: *fp++ = rchar; ! 309: *fp = 0; ! 310: setrp(rptbuf); /* setup repeat string */ ! 311: length %= j; } ! 312: length = (length/HOR)*HOR; ! 313: j = makem(length); ! 314: setcp(fbuf); ! 315: nlflg = 0; ! 316: } ! 317: rtn: ! 318: fc = savfc; tabch = savtc; ldrch = savlc; ! 319: return(j); ! 320: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.