1: #ifndef lint 2: static char sccsid[] = "@(#)t8.c 4.2 8/11/83"; 3: #endif 4: 5: /* t8.c: write out one line of output table */ 6: # include "t..c" 7: # define realsplit ((ct=='a'||ct=='n') && table[nl][c].rcol) 8: int watchout; 9: int once; 10: int topat[MAXCOL]; 11: putline(i, nl) 12: /* i is line number for deciding format */ 13: /* nl is line number for finding data usually identical */ 14: { 15: int c, lf, ct, form, lwid, vspf, ip, cmidx, exvspen, vforml; 16: int vct, chfont; 17: char *s, *size, *fn; 18: watchout=vspf=exvspen=0; 19: if (i==0) once=0; 20: if (i==0 && ( allflg || boxflg || dboxflg)) 21: fullwide(0, dboxflg? '=' : '-'); 22: if (instead[nl]==0 && fullbot[nl] ==0) 23: for(c=0; c<ncol; c++) 24: { 25: s = table[nl][c].col; 26: if (s==0) continue; 27: if (vspen(s)) 28: { 29: for(ip=nl; ip<nlin; ip=next(ip)) 30: if (!vspen(s=table[ip][c].col)) break; 31: if (s>0 && s<128) 32: fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s); 33: continue; 34: } 35: if (point(s)) continue; 36: fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s); 37: watchout=1; 38: } 39: if (linestop[nl]) 40: fprintf(tabout, ".mk #%c\n", linestop[nl]+'a'-1); 41: lf = prev(nl); 42: if (instead[nl]) 43: { 44: puts(instead[nl]); 45: return; 46: } 47: if (fullbot[nl]) 48: { 49: switch (ct=fullbot[nl]) 50: { 51: case '=': 52: case '-': 53: fullwide(nl,ct); 54: } 55: return; 56: } 57: for(c=0; c<ncol; c++) 58: { 59: if (instead[nl]==0 && fullbot[nl]==0) 60: if (vspen(table[nl][c].col)) vspf=1; 61: if (lf>=0) 62: if (vspen(table[lf][c].col)) vspf=1; 63: } 64: if (vspf) 65: { 66: fprintf(tabout, ".nr #^ \\n(\\*(#du\n"); 67: fprintf(tabout, ".nr #- \\n(#^\n"); /* current line position relative to bottom */ 68: } 69: vspf=0; 70: chfont=0; 71: for(c=0; c<ncol; c++) 72: { 73: s = table[nl][c].col; 74: if (s==0) continue; 75: chfont |= (int)(font[stynum[nl]][c]); 76: if (point(s) ) continue; 77: lf=prev(nl); 78: if (lf>=0 && vspen(table[lf][c].col)) 79: fprintf(tabout, ".if (\\n(%c|+\\n(^%c-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(^%c-\\n(#--1v)\n",s,'a'+c,s,'a'+c); 80: else 81: fprintf(tabout, ".if (\\n(%c|+\\n(#^-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(#^-\\n(#--1v)\n",s,s); 82: } 83: if (allflg && once>0 ) 84: fullwide(i,'-'); 85: once=1; 86: runtabs(i, nl); 87: if (allh(i) && !pr1403) 88: { 89: fprintf(tabout, ".nr %d \\n(.v\n", SVS); 90: fprintf(tabout, ".vs \\n(.vu-\\n(.sp\n"); 91: } 92: if (chfont) 93: fprintf(tabout, ".nr %2d \\n(.f\n", S1); 94: fprintf(tabout, ".nr 35 1m\n"); 95: fprintf(tabout, "\\&"); 96: vct = 0; 97: for(c=0; c<ncol; c++) 98: { 99: if (watchout==0 && i+1<nlin && (lf=left(i,c, &lwid))>=0) 100: { 101: tohcol(c); 102: drawvert(lf, i, c, lwid); 103: vct += 2; 104: } 105: if (rightl && c+1==ncol) continue; 106: vforml=i; 107: for(lf=prev(nl); lf>=0 && vspen(table[lf][c].col); lf=prev(lf)) 108: vforml= lf; 109: form= ctype(vforml,c); 110: if (form != 's') 111: { 112: ct = c+CLEFT; 113: if (form=='a') ct = c+CMID; 114: if (form=='n' && table[nl][c].rcol && lused[c]==0) ct= c+CMID; 115: fprintf(tabout, "\\h'|\\n(%du'", ct); 116: } 117: s= table[nl][c].col; 118: fn = font[stynum[vforml]][c]; 119: size = csize[stynum[vforml]][c]; 120: if (*size==0)size=0; 121: switch(ct=ctype(vforml, c)) 122: { 123: case 'n': 124: case 'a': 125: if (table[nl][c].rcol) 126: { 127: if (lused[c]) /*Zero field width*/ 128: { 129: ip = prev(nl); 130: if (ip>=0) 131: if (vspen(table[ip][c].col)) 132: { 133: if (exvspen==0) 134: { 135: fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a'); 136: if (cmidx) 137: fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a'); 138: vct++; 139: fprintf(tabout, "'"); 140: exvspen=1; 141: } 142: } 143: fprintf(tabout, "%c%c",F1,F2); 144: puttext(s,fn,size); 145: fprintf(tabout, "%c",F1); 146: } 147: s= table[nl][c].rcol; 148: form=1; 149: break; 150: } 151: case 'c': 152: form=3; break; 153: case 'r': 154: form=2; break; 155: case 'l': 156: form=1; break; 157: case '-': 158: case '=': 159: if (real(table[nl][c].col)) 160: fprintf(stderr,"%s: line %d: Data ignored on table line %d\n", ifile, iline-1, i+1); 161: makeline(i,c,ct); 162: continue; 163: default: 164: continue; 165: } 166: if (realsplit ? rused[c]: used[c]) /*Zero field width*/ 167: { 168: /* form: 1 left, 2 right, 3 center adjust */ 169: if (ifline(s)) 170: { 171: makeline(i,c,ifline(s)); 172: continue; 173: } 174: if (filler(s)) 175: { 176: printf("\\l'|\\n(%du\\&%s'", c+CRIGHT, s+2); 177: continue; 178: } 179: ip = prev(nl); 180: cmidx = ctop[stynum[nl]][c]==0; 181: if (ip>=0) 182: if (vspen(table[ip][c].col)) 183: { 184: if (exvspen==0) 185: { 186: fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a'); 187: if (cmidx) 188: fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a'); 189: vct++; 190: fprintf(tabout, "'"); 191: } 192: } 193: fprintf(tabout, "%c", F1); 194: if (form!= 1) 195: fprintf(tabout, "%c", F2); 196: if (vspen(s)) 197: vspf=1; 198: else 199: puttext(s, fn, size); 200: if (form !=2) 201: fprintf(tabout, "%c", F2); 202: fprintf(tabout, "%c", F1); 203: } 204: if (ip>=0) 205: if (vspen(table[ip][c].col)) 206: { 207: exvspen = (c+1 < ncol) && vspen(table[ip][c+1].col) && 208: (topat[c] == topat[c+1]) && 209: (cmidx == (ctop [stynum[nl]][c+1]==0)) && (left(i,c+1,&lwid)<0); 210: if (exvspen==0) 211: { 212: fprintf(tabout, "\\v'(\\n(\\*(#du-\\n(^%cu", c+'a'); 213: if (cmidx) 214: fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a'); 215: vct++; 216: fprintf(tabout, "'"); 217: } 218: } 219: else 220: exvspen=0; 221: /* if lines need to be split for gcos here is the place for a backslash */ 222: if (vct > 7 && c < ncol) 223: { 224: fprintf(tabout, "\n.sp-1\n\\&"); 225: vct=0; 226: } 227: } 228: fprintf(tabout, "\n"); 229: if (allh(i) && !pr1403) fprintf(tabout, ".vs \\n(%du\n", SVS); 230: if (watchout) 231: funnies(i,nl); 232: if (vspf) 233: { 234: for(c=0; c<ncol; c++) 235: if (vspen(table[nl][c].col) && (nl==0 || (lf=prev(nl))<0 || !vspen(table[lf][c].col))) 236: { 237: fprintf(tabout, ".nr ^%c \\n(#^u\n", 'a'+c); 238: topat[c]=nl; 239: } 240: } 241: } 242: puttext(s,fn, size) 243: char *s, *size, *fn; 244: { 245: if (point(s)) 246: { 247: putfont(fn); 248: putsize(size); 249: fprintf(tabout, "%s",s); 250: if (*fn>0) fprintf(tabout, "\\f\\n(%2d", S1); 251: if (size!=0) putsize("0"); 252: } 253: } 254: funnies( stl, lin) 255: { 256: /* write out funny diverted things */ 257: int c, s, pl, lwid, dv, lf, ct; 258: char *fn; 259: fprintf(tabout, ".mk ##\n"); /* rmember current vertical position */ 260: fprintf(tabout, ".nr %d \\n(##\n", S1); /* bottom position */ 261: for(c=0; c<ncol; c++) 262: { 263: s = (int)table[lin][c].col; 264: if (point(s)) continue; 265: if (s==0) continue; 266: fprintf(tabout, ".sp |\\n(##u-1v\n"); 267: fprintf(tabout, ".nr %d ", SIND); 268: for(pl=stl; pl>=0 && !isalpha(ct=ctype(pl,c)); pl=prev(pl)) 269: ; 270: switch (ct) 271: { 272: case 'n': 273: case 'c': 274: fprintf(tabout, "(\\n(%du+\\n(%du-\\n(%c-u)/2u\n",c+CLEFT,c-1+ctspan(lin,c)+CRIGHT, s); 275: break; 276: case 'l': 277: fprintf(tabout, "\\n(%du\n",c+CLEFT); 278: break; 279: case 'a': 280: fprintf(tabout, "\\n(%du\n",c+CMID); 281: break; 282: case 'r': 283: fprintf(tabout, "\\n(%du-\\n(%c-u\n", c+CRIGHT, s); 284: break; 285: } 286: fprintf(tabout, ".in +\\n(%du\n", SIND); 287: fn=font[stynum[stl]][c]; 288: putfont(fn); 289: pl = prev(stl); 290: if (stl>0 && pl>=0 && vspen(table[pl][c].col)) 291: { 292: fprintf(tabout, ".sp |\\n(^%cu\n", 'a'+c); 293: if (ctop[stynum[stl]][c]==0) 294: { 295: fprintf(tabout, ".nr %d \\n(#-u-\\n(^%c-\\n(%c|+1v\n",TMP, 'a'+c, s); 296: fprintf(tabout, ".if \\n(%d>0 .sp \\n(%du/2u\n", TMP, TMP); 297: } 298: } 299: fprintf(tabout, ".%c+\n",s); 300: fprintf(tabout, ".in -\\n(%du\n", SIND); 301: if (*fn>0) putfont("P"); 302: fprintf(tabout, ".mk %d\n", S2); 303: fprintf(tabout, ".if \\n(%d>\\n(%d .nr %d \\n(%d\n", S2, S1, S1, S2); 304: } 305: fprintf(tabout, ".sp |\\n(%du\n", S1); 306: for(c=dv=0; c<ncol; c++) 307: { 308: if (stl+1< nlin && (lf=left(stl,c,&lwid))>=0) 309: { 310: if (dv++ == 0) 311: fprintf(tabout, ".sp -1\n"); 312: tohcol(c); 313: dv++; 314: drawvert(lf, stl, c, lwid); 315: } 316: } 317: if (dv) 318: fprintf(tabout,"\n"); 319: } 320: putfont(fn) 321: char *fn; 322: { 323: if (fn && *fn) 324: fprintf(tabout, fn[1] ? "\\f(%.2s" : "\\f%.2s", fn); 325: } 326: putsize(s) 327: char *s; 328: { 329: if (s && *s) 330: fprintf(tabout, "\\s%s",s); 331: }