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