1*14511Ssam #ifndef lint 2*14511Ssam static char sccsid[] = "@(#)t8.c 4.2 08/11/83"; 3*14511Ssam #endif 411035Sshannon 511035Sshannon /* t8.c: write out one line of output table */ 611035Sshannon # include "t..c" 711035Sshannon # define realsplit ((ct=='a'||ct=='n') && table[nl][c].rcol) 811035Sshannon int watchout; 911035Sshannon int once; 1011035Sshannon int topat[MAXCOL]; 1111035Sshannon putline(i, nl) 1211035Sshannon /* i is line number for deciding format */ 1311035Sshannon /* nl is line number for finding data usually identical */ 1411035Sshannon { 1511035Sshannon int c, lf, ct, form, lwid, vspf, ip, cmidx, exvspen, vforml; 1611035Sshannon int vct, chfont; 1711035Sshannon char *s, *size, *fn; 1811035Sshannon watchout=vspf=exvspen=0; 1911035Sshannon if (i==0) once=0; 2011035Sshannon if (i==0 && ( allflg || boxflg || dboxflg)) 2111035Sshannon fullwide(0, dboxflg? '=' : '-'); 2211035Sshannon if (instead[nl]==0 && fullbot[nl] ==0) 2311035Sshannon for(c=0; c<ncol; c++) 2411035Sshannon { 2511035Sshannon s = table[nl][c].col; 2611035Sshannon if (s==0) continue; 2711035Sshannon if (vspen(s)) 2811035Sshannon { 2911035Sshannon for(ip=nl; ip<nlin; ip=next(ip)) 3011035Sshannon if (!vspen(s=table[ip][c].col)) break; 3111035Sshannon if (s>0 && s<128) 3211035Sshannon fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s); 3311035Sshannon continue; 3411035Sshannon } 3511035Sshannon if (point(s)) continue; 3611035Sshannon fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s); 3711035Sshannon watchout=1; 3811035Sshannon } 3911035Sshannon if (linestop[nl]) 4011035Sshannon fprintf(tabout, ".mk #%c\n", linestop[nl]+'a'-1); 4111035Sshannon lf = prev(nl); 4211035Sshannon if (instead[nl]) 4311035Sshannon { 4411035Sshannon puts(instead[nl]); 4511035Sshannon return; 4611035Sshannon } 4711035Sshannon if (fullbot[nl]) 4811035Sshannon { 4911035Sshannon switch (ct=fullbot[nl]) 5011035Sshannon { 5111035Sshannon case '=': 5211035Sshannon case '-': 5311035Sshannon fullwide(nl,ct); 5411035Sshannon } 5511035Sshannon return; 5611035Sshannon } 5711035Sshannon for(c=0; c<ncol; c++) 5811035Sshannon { 5911035Sshannon if (instead[nl]==0 && fullbot[nl]==0) 6011035Sshannon if (vspen(table[nl][c].col)) vspf=1; 6111035Sshannon if (lf>=0) 6211035Sshannon if (vspen(table[lf][c].col)) vspf=1; 6311035Sshannon } 6411035Sshannon if (vspf) 6511035Sshannon { 6611035Sshannon fprintf(tabout, ".nr #^ \\n(\\*(#du\n"); 6711035Sshannon fprintf(tabout, ".nr #- \\n(#^\n"); /* current line position relative to bottom */ 6811035Sshannon } 6911035Sshannon vspf=0; 7011035Sshannon chfont=0; 7111035Sshannon for(c=0; c<ncol; c++) 7211035Sshannon { 7311035Sshannon s = table[nl][c].col; 7411035Sshannon if (s==0) continue; 7511035Sshannon chfont |= (int)(font[stynum[nl]][c]); 7611035Sshannon if (point(s) ) continue; 7711035Sshannon lf=prev(nl); 7811035Sshannon if (lf>=0 && vspen(table[lf][c].col)) 7911035Sshannon fprintf(tabout, ".if (\\n(%c|+\\n(^%c-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(^%c-\\n(#--1v)\n",s,'a'+c,s,'a'+c); 8011035Sshannon else 8111035Sshannon fprintf(tabout, ".if (\\n(%c|+\\n(#^-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(#^-\\n(#--1v)\n",s,s); 8211035Sshannon } 8311035Sshannon if (allflg && once>0 ) 8411035Sshannon fullwide(i,'-'); 8511035Sshannon once=1; 8611035Sshannon runtabs(i, nl); 8711035Sshannon if (allh(i) && !pr1403) 8811035Sshannon { 8911035Sshannon fprintf(tabout, ".nr %d \\n(.v\n", SVS); 9011035Sshannon fprintf(tabout, ".vs \\n(.vu-\\n(.sp\n"); 9111035Sshannon } 9211035Sshannon if (chfont) 9311035Sshannon fprintf(tabout, ".nr %2d \\n(.f\n", S1); 9411035Sshannon fprintf(tabout, ".nr 35 1m\n"); 9511035Sshannon fprintf(tabout, "\\&"); 9611035Sshannon vct = 0; 9711035Sshannon for(c=0; c<ncol; c++) 9811035Sshannon { 9911035Sshannon if (watchout==0 && i+1<nlin && (lf=left(i,c, &lwid))>=0) 10011035Sshannon { 10111035Sshannon tohcol(c); 10211035Sshannon drawvert(lf, i, c, lwid); 10311035Sshannon vct += 2; 10411035Sshannon } 10511035Sshannon if (rightl && c+1==ncol) continue; 10611035Sshannon vforml=i; 10711035Sshannon for(lf=prev(nl); lf>=0 && vspen(table[lf][c].col); lf=prev(lf)) 10811035Sshannon vforml= lf; 10911035Sshannon form= ctype(vforml,c); 11011035Sshannon if (form != 's') 11111035Sshannon { 11211035Sshannon ct = c+CLEFT; 11311035Sshannon if (form=='a') ct = c+CMID; 11411035Sshannon if (form=='n' && table[nl][c].rcol && lused[c]==0) ct= c+CMID; 11511035Sshannon fprintf(tabout, "\\h'|\\n(%du'", ct); 11611035Sshannon } 11711035Sshannon s= table[nl][c].col; 11811035Sshannon fn = font[stynum[vforml]][c]; 11911035Sshannon size = csize[stynum[vforml]][c]; 12011035Sshannon if (*size==0)size=0; 12111035Sshannon switch(ct=ctype(vforml, c)) 12211035Sshannon { 12311035Sshannon case 'n': 12411035Sshannon case 'a': 12511035Sshannon if (table[nl][c].rcol) 12611035Sshannon { 12711035Sshannon if (lused[c]) /*Zero field width*/ 12811035Sshannon { 12911035Sshannon ip = prev(nl); 13011035Sshannon if (ip>=0) 13111035Sshannon if (vspen(table[ip][c].col)) 13211035Sshannon { 13311035Sshannon if (exvspen==0) 13411035Sshannon { 13511035Sshannon fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a'); 13611035Sshannon if (cmidx) 13711035Sshannon fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a'); 13811035Sshannon vct++; 13911035Sshannon fprintf(tabout, "'"); 14011035Sshannon exvspen=1; 14111035Sshannon } 14211035Sshannon } 14311035Sshannon fprintf(tabout, "%c%c",F1,F2); 14411035Sshannon puttext(s,fn,size); 14511035Sshannon fprintf(tabout, "%c",F1); 14611035Sshannon } 14711035Sshannon s= table[nl][c].rcol; 14811035Sshannon form=1; 14911035Sshannon break; 15011035Sshannon } 15111035Sshannon case 'c': 15211035Sshannon form=3; break; 15311035Sshannon case 'r': 15411035Sshannon form=2; break; 15511035Sshannon case 'l': 15611035Sshannon form=1; break; 15711035Sshannon case '-': 15811035Sshannon case '=': 15911035Sshannon if (real(table[nl][c].col)) 16011035Sshannon fprintf(stderr,"%s: line %d: Data ignored on table line %d\n", ifile, iline-1, i+1); 16111035Sshannon makeline(i,c,ct); 16211035Sshannon continue; 16311035Sshannon default: 16411035Sshannon continue; 16511035Sshannon } 16611035Sshannon if (realsplit ? rused[c]: used[c]) /*Zero field width*/ 16711035Sshannon { 16811035Sshannon /* form: 1 left, 2 right, 3 center adjust */ 16911035Sshannon if (ifline(s)) 17011035Sshannon { 17111035Sshannon makeline(i,c,ifline(s)); 17211035Sshannon continue; 17311035Sshannon } 17411035Sshannon if (filler(s)) 17511035Sshannon { 17611035Sshannon printf("\\l'|\\n(%du\\&%s'", c+CRIGHT, s+2); 17711035Sshannon continue; 17811035Sshannon } 17911035Sshannon ip = prev(nl); 18011035Sshannon cmidx = ctop[stynum[nl]][c]==0; 18111035Sshannon if (ip>=0) 18211035Sshannon if (vspen(table[ip][c].col)) 18311035Sshannon { 18411035Sshannon if (exvspen==0) 18511035Sshannon { 18611035Sshannon fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a'); 18711035Sshannon if (cmidx) 18811035Sshannon fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a'); 18911035Sshannon vct++; 19011035Sshannon fprintf(tabout, "'"); 19111035Sshannon } 19211035Sshannon } 19311035Sshannon fprintf(tabout, "%c", F1); 19411035Sshannon if (form!= 1) 19511035Sshannon fprintf(tabout, "%c", F2); 19611035Sshannon if (vspen(s)) 19711035Sshannon vspf=1; 19811035Sshannon else 19911035Sshannon puttext(s, fn, size); 20011035Sshannon if (form !=2) 20111035Sshannon fprintf(tabout, "%c", F2); 20211035Sshannon fprintf(tabout, "%c", F1); 20311035Sshannon } 20411035Sshannon if (ip>=0) 20511035Sshannon if (vspen(table[ip][c].col)) 20611035Sshannon { 20711035Sshannon exvspen = (c+1 < ncol) && vspen(table[ip][c+1].col) && 20811035Sshannon (topat[c] == topat[c+1]) && 20911035Sshannon (cmidx == (ctop [stynum[nl]][c+1]==0)) && (left(i,c+1,&lwid)<0); 21011035Sshannon if (exvspen==0) 21111035Sshannon { 21211035Sshannon fprintf(tabout, "\\v'(\\n(\\*(#du-\\n(^%cu", c+'a'); 21311035Sshannon if (cmidx) 21411035Sshannon fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a'); 21511035Sshannon vct++; 21611035Sshannon fprintf(tabout, "'"); 21711035Sshannon } 21811035Sshannon } 21911035Sshannon else 22011035Sshannon exvspen=0; 22111035Sshannon /* if lines need to be split for gcos here is the place for a backslash */ 22211035Sshannon if (vct > 7 && c < ncol) 22311035Sshannon { 22411035Sshannon fprintf(tabout, "\n.sp-1\n\\&"); 22511035Sshannon vct=0; 22611035Sshannon } 22711035Sshannon } 22811035Sshannon fprintf(tabout, "\n"); 22911035Sshannon if (allh(i) && !pr1403) fprintf(tabout, ".vs \\n(%du\n", SVS); 23011035Sshannon if (watchout) 23111035Sshannon funnies(i,nl); 23211035Sshannon if (vspf) 23311035Sshannon { 23411035Sshannon for(c=0; c<ncol; c++) 23511035Sshannon if (vspen(table[nl][c].col) && (nl==0 || (lf=prev(nl))<0 || !vspen(table[lf][c].col))) 23611035Sshannon { 23711035Sshannon fprintf(tabout, ".nr ^%c \\n(#^u\n", 'a'+c); 23811035Sshannon topat[c]=nl; 23911035Sshannon } 24011035Sshannon } 24111035Sshannon } 24211035Sshannon puttext(s,fn, size) 24311035Sshannon char *s, *size, *fn; 24411035Sshannon { 24511035Sshannon if (point(s)) 24611035Sshannon { 24711035Sshannon putfont(fn); 24811035Sshannon putsize(size); 24911035Sshannon fprintf(tabout, "%s",s); 25011035Sshannon if (*fn>0) fprintf(tabout, "\\f\\n(%2d", S1); 25111035Sshannon if (size!=0) putsize("0"); 25211035Sshannon } 25311035Sshannon } 25411035Sshannon funnies( stl, lin) 25511035Sshannon { 25611035Sshannon /* write out funny diverted things */ 25711035Sshannon int c, s, pl, lwid, dv, lf, ct; 25811035Sshannon char *fn; 25911035Sshannon fprintf(tabout, ".mk ##\n"); /* rmember current vertical position */ 26011035Sshannon fprintf(tabout, ".nr %d \\n(##\n", S1); /* bottom position */ 26111035Sshannon for(c=0; c<ncol; c++) 26211035Sshannon { 26311035Sshannon s = table[lin][c].col; 26411035Sshannon if (point(s)) continue; 26511035Sshannon if (s==0) continue; 26611035Sshannon fprintf(tabout, ".sp |\\n(##u-1v\n"); 26711035Sshannon fprintf(tabout, ".nr %d ", SIND); 26811035Sshannon for(pl=stl; pl>=0 && !isalpha(ct=ctype(pl,c)); pl=prev(pl)) 26911035Sshannon ; 27011035Sshannon switch (ct) 27111035Sshannon { 27211035Sshannon case 'n': 27311035Sshannon case 'c': 27411035Sshannon fprintf(tabout, "(\\n(%du+\\n(%du-\\n(%c-u)/2u\n",c+CLEFT,c-1+ctspan(lin,c)+CRIGHT, s); 27511035Sshannon break; 27611035Sshannon case 'l': 27711035Sshannon fprintf(tabout, "\\n(%du\n",c+CLEFT); 27811035Sshannon break; 27911035Sshannon case 'a': 28011035Sshannon fprintf(tabout, "\\n(%du\n",c+CMID); 28111035Sshannon break; 28211035Sshannon case 'r': 28311035Sshannon fprintf(tabout, "\\n(%du-\\n(%c-u\n", c+CRIGHT, s); 28411035Sshannon break; 28511035Sshannon } 28611035Sshannon fprintf(tabout, ".in +\\n(%du\n", SIND); 28711035Sshannon fn=font[stynum[stl]][c]; 28811035Sshannon putfont(fn); 28911035Sshannon pl = prev(stl); 29011035Sshannon if (stl>0 && pl>=0 && vspen(table[pl][c].col)) 29111035Sshannon { 29211035Sshannon fprintf(tabout, ".sp |\\n(^%cu\n", 'a'+c); 29311035Sshannon if (ctop[stynum[stl]][c]==0) 29411035Sshannon { 29511035Sshannon fprintf(tabout, ".nr %d \\n(#-u-\\n(^%c-\\n(%c|+1v\n",TMP, 'a'+c, s); 29611035Sshannon fprintf(tabout, ".if \\n(%d>0 .sp \\n(%du/2u\n", TMP, TMP); 29711035Sshannon } 29811035Sshannon } 29911035Sshannon fprintf(tabout, ".%c+\n",s); 30011035Sshannon fprintf(tabout, ".in -\\n(%du\n", SIND); 30111035Sshannon if (*fn>0) putfont("P"); 30211035Sshannon fprintf(tabout, ".mk %d\n", S2); 30311035Sshannon fprintf(tabout, ".if \\n(%d>\\n(%d .nr %d \\n(%d\n", S2, S1, S1, S2); 30411035Sshannon } 30511035Sshannon fprintf(tabout, ".sp |\\n(%du\n", S1); 30611035Sshannon for(c=dv=0; c<ncol; c++) 30711035Sshannon { 30811035Sshannon if (stl+1< nlin && (lf=left(stl,c,&lwid))>=0) 30911035Sshannon { 31011035Sshannon if (dv++ == 0) 31111035Sshannon fprintf(tabout, ".sp -1\n"); 31211035Sshannon tohcol(c); 31311035Sshannon dv++; 31411035Sshannon drawvert(lf, stl, c, lwid); 31511035Sshannon } 31611035Sshannon } 31711035Sshannon if (dv) 31811035Sshannon fprintf(tabout,"\n"); 31911035Sshannon } 32011035Sshannon putfont(fn) 32111035Sshannon char *fn; 32211035Sshannon { 32311035Sshannon if (fn && *fn) 32411035Sshannon fprintf(tabout, fn[1] ? "\\f(%.2s" : "\\f%.2s", fn); 32511035Sshannon } 32611035Sshannon putsize(s) 32711035Sshannon char *s; 32811035Sshannon { 32911035Sshannon if (s && *s) 33011035Sshannon fprintf(tabout, "\\s%s",s); 33111035Sshannon } 332