125079Sjaap #ifndef lint
2*25093Sjaap static char sccsid[] = "@(#)write1line.c 1.2 (CWI) 85/10/02";
325079Sjaap #endif lint
425079Sjaap
5*25093Sjaap /*
6*25093Sjaap * write out one line of output table
7*25093Sjaap */
825079Sjaap
925079Sjaap #include "defs.h"
1025079Sjaap #include "ext.h"
1125079Sjaap
1225079Sjaap #define realsplit ((ct == 'a' || ct == 'n') && table[nl][c].rcol)
1325079Sjaap
1425079Sjaap int watchout;
1525079Sjaap int once;
1625079Sjaap int topat[MAXCOL];
1725079Sjaap
1825079Sjaap /*
1925079Sjaap * i is line number for deciding format
2025079Sjaap * nl is line number for finding data
2125079Sjaap * usually identical
2225079Sjaap */
putline(i,nl)2325079Sjaap putline(i, nl){
2425079Sjaap int c, lf, ct, form, lwid, vspf, ip, cmidx, exvspen, vforml;
2525079Sjaap int vct, chfont, uphalf;
2625079Sjaap char *s, *size, *fn;
2725079Sjaap
28*25093Sjaap dprint(".\\\" -- putline( %d, %d)\n", i, nl);
2925079Sjaap
3025079Sjaap watchout = vspf = exvspen = 0;
3125079Sjaap if(i == 0)
3225079Sjaap once = 0;
3325079Sjaap if(i == 0 && (allflg || boxflg || dboxflg))
3425079Sjaap fullwide(0, dboxflg ? '=' : '-');
3525079Sjaap if(instead[nl] == 0 && fullbot[nl] == 0){
3625079Sjaap for(c = 0; c < ncol; c++){
3725079Sjaap s = table[nl][c].col;
3825079Sjaap if(s == 0)
3925079Sjaap continue;
4025079Sjaap if(vspen(s)){
4125079Sjaap for(ip = nl; ip < nlin; ip = next(ip))
4225079Sjaap if(!vspen(s = table[ip][c].col))
4325079Sjaap break;
4425079Sjaap if((int) s > 0 && (int) s < 128)
4525079Sjaap printf(".ne \\n(%c|u+\\n(.Vu\n", s);
4625079Sjaap continue;
4725079Sjaap }
4825079Sjaap if(point(s))
4925079Sjaap continue;
5025079Sjaap printf(".ne \\n(%c|u+\\n(.Vu\n", s);
5125079Sjaap watchout = 1;
5225079Sjaap }
5325079Sjaap }
5425079Sjaap if(linestop[nl])
5525079Sjaap printf(".mk #%c\n", linestop[nl] + 'a' - 1);
5625079Sjaap lf = prev(nl);
5725079Sjaap if(instead[nl]){
5825079Sjaap puts(instead[nl]);
5925079Sjaap return;
6025079Sjaap }
6125079Sjaap if(fullbot[nl]){
6225079Sjaap switch(ct = fullbot[nl]){
6325079Sjaap case '=':
6425079Sjaap case '-':
6525079Sjaap fullwide(nl, ct);
6625079Sjaap }
6725079Sjaap return;
6825079Sjaap }
6925079Sjaap for(c = 0; c < ncol; c++){
7025079Sjaap if(instead[nl] == 0 && fullbot[nl] == 0){
7125079Sjaap if(vspen(table[nl][c].col))
7225079Sjaap vspf = 1;
7325079Sjaap }
7425079Sjaap if(lf >= 0){
7525079Sjaap if(vspen(table[lf][c].col))
7625079Sjaap vspf = 1;
7725079Sjaap }
7825079Sjaap }
7925079Sjaap if(vspf){
8025079Sjaap printf(".nr #^ \\n(\\*(#du\n");
8125079Sjaap /*
8225079Sjaap * current line position relative to bottom
8325079Sjaap */
8425079Sjaap printf(".nr #- \\n(#^\n");
8525079Sjaap }
8625079Sjaap vspf = 0;
8725079Sjaap chfont = 0;
8825079Sjaap for(c = 0; c < ncol; c++){
8925079Sjaap s = table[nl][c].col;
9025079Sjaap if(s == 0)
9125079Sjaap continue;
9225079Sjaap chfont |= (int) (font[stynum[nl]][c]);
9325079Sjaap if(point(s))
9425079Sjaap continue;
9525079Sjaap lf = prev(nl);
9625079Sjaap if(lf >= 0 && vspen(table[lf][c].col))
9725079Sjaap printf(
9825079Sjaap ".if (\\n(%c|+\\n(^%c-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(^%c-\\n(#--1v)\n",
9925079Sjaap s, 'a' + c, s, 'a' + c);
10025079Sjaap else
10125079Sjaap printf(
10225079Sjaap ".if (\\n(%c|+\\n(#^-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(#^-\\n(#--1v)\n",
10325079Sjaap s, s);
10425079Sjaap }
10525079Sjaap if(allflg && once > 0)
10625079Sjaap fullwide(i, '-');
10725079Sjaap once = 1;
10825079Sjaap runtabs(i, nl);
10925079Sjaap if(allh(i) && !pr1403){
11025079Sjaap printf(".nr %d \\n(.v\n", SVS);
11125079Sjaap printf(".vs \\n(.vu-\\n(.sp\n");
11225079Sjaap }
11325079Sjaap if(chfont)
11425079Sjaap printf(".nr %2d \\n(.f\n", S1);
11525079Sjaap printf(".nr 35 1m\n");
11625079Sjaap printf("\\&");
11725079Sjaap vct = 0;
11825079Sjaap for(c = 0; c < ncol; c++){
11925079Sjaap uphalf = 0;
12025079Sjaap if(watchout == 0 && i + 1 < nlin
12125079Sjaap && (lf = left(i, c, &lwid)) >= 0){
12225079Sjaap tohcol(c);
12325079Sjaap drawvert(lf, i, c, lwid);
12425079Sjaap vct += 2;
12525079Sjaap }
12625079Sjaap if(rightl && c + 1 == ncol)
12725079Sjaap continue;
12825079Sjaap vforml = i;
12925079Sjaap for(lf = prev(nl); lf >= 0 && vspen (table[lf][c].col);
13025079Sjaap lf = prev (lf))
13125079Sjaap vforml = lf;
13225079Sjaap form = ctype(vforml, c);
13325079Sjaap if(form != 's'){
13425079Sjaap ct = (int) reg(c, CLEFT);
13525079Sjaap if(form == 'a')
13625079Sjaap ct = (int) reg(c, CMID);
13725079Sjaap if(form == 'n' && table[nl][c].rcol && lused[c] == 0)
13825079Sjaap ct = (int) reg(c, CMID);
13925079Sjaap printf("\\h'|\\n(%2su'", ct);
14025079Sjaap }
14125079Sjaap s = table[nl][c].col;
14225079Sjaap fn = font[stynum[vforml]][c];
14325079Sjaap size = csize[stynum[vforml]][c];
14425079Sjaap if(*size == 0)
14525079Sjaap size = 0;
14625079Sjaap if((ctop[stynum[nl]][c] & HALFUP) != 0 && pr1403 == 0)
14725079Sjaap uphalf = 1;
14825079Sjaap switch(ct = ctype(vforml, c)){
14925079Sjaap
15025079Sjaap case 'n':
15125079Sjaap case 'a':
15225079Sjaap if(table[nl][c].rcol){
15325079Sjaap if(lused[c]){
15425079Sjaap /*
15525079Sjaap * Zero field width
15625079Sjaap */
15725079Sjaap ip = prev(nl);
15825079Sjaap if(ip >= 0){
15925079Sjaap /*
16025079Sjaap * Indentation is getting complete out of hand here, let's shift to
16125079Sjaap * the left
16225079Sjaap */
16325079Sjaap if(vspen(table[ip][c].col)){
16425079Sjaap if(exvspen == 0){
16525079Sjaap printf("\\v'-(\\n(\\*(#du-\\n(^%cu", c + 'a');
16625079Sjaap if(cmidx)
16725079Sjaap printf("-((\\n(#-u-\\n(^%cu)/2u)", c + 'a');
16825079Sjaap
16925079Sjaap vct++;
17025079Sjaap if(pr1403){
17125079Sjaap /*
17225079Sjaap * Must round to whole lines (bwk?)
17325079Sjaap */
17425079Sjaap printf("/1v*1v");
17525079Sjaap }
17625079Sjaap printf("'");
17725079Sjaap exvspen = 1;
17825079Sjaap }
17925079Sjaap }
18025079Sjaap /*
18125079Sjaap * Restore layout of this source
18225079Sjaap */
18325079Sjaap }
18425079Sjaap printf("%c%c", F1, F2);
18525079Sjaap if(uphalf)
18625079Sjaap printf("\\u");
18725079Sjaap puttext(s, fn, size);
18825079Sjaap if(uphalf)
18925079Sjaap printf("\\d");
19025079Sjaap printf("%c", F1);
19125079Sjaap }
19225079Sjaap s = table[nl][c].rcol;
19325079Sjaap form = 1;
19425079Sjaap break;
19525079Sjaap }
19625079Sjaap case 'c':
19725079Sjaap form = 3;
19825079Sjaap break;
19925079Sjaap case 'r':
20025079Sjaap form = 2;
20125079Sjaap break;
20225079Sjaap case 'l':
20325079Sjaap form = 1;
20425079Sjaap break;
20525079Sjaap case '-':
20625079Sjaap case '=':
20725079Sjaap if(real(table[nl][c].col)){
20825079Sjaap fprintf(stderr,
20925079Sjaap "%s: line %d: Data ignored on table line %d\n",
21025079Sjaap ifile, iline - 1, i + 1);
21125079Sjaap }
21225079Sjaap makeline(i, c, ct);
21325079Sjaap continue;
21425079Sjaap default:
21525079Sjaap continue;
21625079Sjaap }
21725079Sjaap if(realsplit ? rused[c] : used[c]){
21825079Sjaap /*
21925079Sjaap * Zero field width
22025079Sjaap */
22125079Sjaap /*
22225079Sjaap * form: 1 left, 2 right, 3 center adjust
22325079Sjaap */
22425079Sjaap if(ifline(s)){
22525079Sjaap makeline(i, c, ifline (s));
22625079Sjaap continue;
22725079Sjaap }
22825079Sjaap if(filler(s)){
22925079Sjaap printf("\\l'|\\n(%2su\\&%s'", reg(c, CRIGHT),
23025079Sjaap s + 2);
23125079Sjaap continue;
23225079Sjaap }
23325079Sjaap ip = prev(nl);
23425079Sjaap cmidx = (ctop[stynum[nl]][c] & (CTOP | CDOWN)) == 0;
23525079Sjaap if(ip >= 0)
23625079Sjaap if(vspen(table[ip][c].col)){
23725079Sjaap if(exvspen == 0){
23825079Sjaap printf(
23925079Sjaap "\\v'-(\\n(\\*(#du-\\n(^%cu",
24025079Sjaap c + 'a');
24125079Sjaap if(cmidx)
24225079Sjaap printf(
24325079Sjaap "-((\\n(#-u-\\n(^%cu)/2u)", c + 'a');
24425079Sjaap vct++;
24525079Sjaap if(pr1403){
24625079Sjaap /*
24725079Sjaap * Round to
24825079Sjaap * whole lines
24925079Sjaap */
25025079Sjaap printf("/1v*1v");
25125079Sjaap }
25225079Sjaap printf("'");
25325079Sjaap }
25425079Sjaap }
25525079Sjaap printf("%c", F1);
25625079Sjaap if(form != 1)
25725079Sjaap printf("%c", F2);
25825079Sjaap if(vspen(s))
25925079Sjaap vspf = 1;
26025079Sjaap else
26125079Sjaap puttext(s, fn, size);
26225079Sjaap if(form != 2)
26325079Sjaap printf("%c", F2);
26425079Sjaap printf("%c", F1);
26525079Sjaap }
26625079Sjaap ip = prev(nl); /*
26725079Sjaap * Julian Onion mod (system III)
26825079Sjaap */
26925079Sjaap if(ip >= 0){
27025079Sjaap if(vspen(table[ip][c].col)){
27125079Sjaap exvspen = (c + 1 < ncol)
27225079Sjaap && vspen(table[ip][c + 1].col)
27325079Sjaap && (topat[c] == topat[c + 1])
27425079Sjaap && (cmidx == ((ctop[stynum[nl]][c+1]
27525079Sjaap & (CTOP|CDOWN)) == 0))
27625079Sjaap && (left(i, c + 1, &lwid) < 0);
27725079Sjaap /*
27825079Sjaap * IS THIS WRONG? SHOULD IT BE
27925079Sjaap * (cmidx = ...
28025079Sjaap && (cmidx = (ctop[stynum[nl]][c+1] &(CTOP|CDOWN) == 0))
28125079Sjaap */
28225079Sjaap if(exvspen == 0){
28325079Sjaap printf("\\v'(\\n(\\*(#du-\\n(^%cu",
28425079Sjaap c + 'a');
28525079Sjaap if(cmidx)
28625079Sjaap printf(
28725079Sjaap "-((\\n(#-u-\\n(^%cu)/2u)",
28825079Sjaap c + 'a');
28925079Sjaap vct++;
29025079Sjaap if(pr1403){
29125079Sjaap /*
29225079Sjaap * Round to
29325079Sjaap * whole lines
29425079Sjaap */
29525079Sjaap printf("/1v*1v");
29625079Sjaap }
29725079Sjaap printf("'");
29825079Sjaap }
29925079Sjaap }
30025079Sjaap else
30125079Sjaap exvspen = 0;
30225079Sjaap }
30325079Sjaap /*
30425079Sjaap * if lines need to be split for gcos
30525079Sjaap * here is the place for a backslash
30625079Sjaap */
30725079Sjaap if(vct > 7 && c < ncol){
30825079Sjaap printf("\n.sp-1\n\\&");
30925079Sjaap vct = 0;
31025079Sjaap }
31125079Sjaap }
31225079Sjaap printf("\n");
31325079Sjaap if(allh(i) && !pr1403)
31425079Sjaap printf(".vs \\n(%du\n", SVS);
31525079Sjaap if(watchout)
31625079Sjaap funnies(i, nl);
31725079Sjaap if(vspf){
31825079Sjaap for(c = 0; c < ncol; c++){
31925079Sjaap if(vspen(table[nl][c].col)
32025079Sjaap && (nl == 0 || (lf = prev (nl)) < 0
32125079Sjaap || !vspen(table[lf][c].col
32225079Sjaap ) )){
32325079Sjaap printf(".nr ^%c \\n(#^u\n", 'a' + c);
32425079Sjaap topat[c] = nl;
32525079Sjaap }
32625079Sjaap }
32725079Sjaap }
32825079Sjaap }
32925079Sjaap
puttext(s,fn,size)33025079Sjaap puttext(s, fn, size)
33125079Sjaap char *s, *size, *fn;
33225079Sjaap {
33325079Sjaap if(point(s)){
33425079Sjaap putfont(fn);
33525079Sjaap putsize(size);
33625079Sjaap printf("%s", s);
33725079Sjaap if(*fn > 0)
33825079Sjaap printf("\\f\\n(%2d", S1);
33925079Sjaap if(size != 0)
34025079Sjaap putsize("0");
34125079Sjaap }
34225079Sjaap }
34325079Sjaap
34425079Sjaap /*
34525079Sjaap * write out funny diverted things
34625079Sjaap */
funnies(stl,lin)34725079Sjaap funnies(stl, lin){
34825079Sjaap int c, s, pl, lwid, dv, lf, ct;
34925079Sjaap char *fn;
35025079Sjaap extern char *reg();
35125079Sjaap
352*25093Sjaap dprint(".\\\" -- funnies\n");
35325079Sjaap /*
35425079Sjaap * remember current vertical position
35525079Sjaap */
35625079Sjaap printf(".mk ##\n");
35725079Sjaap /*
35825079Sjaap * bottom position
35925079Sjaap */
36025079Sjaap printf(".nr %d \\n(##\n", S1);
36125079Sjaap for(c = 0; c < ncol; c++){
36225079Sjaap s = (int)table[lin][c].col;
36325079Sjaap if(point(s))
36425079Sjaap continue;
36525079Sjaap if(s == 0)
36625079Sjaap continue;
36725079Sjaap printf(".sp |\\n(##u-1v\n");
36825079Sjaap printf(".nr %d ", SIND);
36925079Sjaap for(pl = stl; pl >= 0 && !isalpha(ct = ctype (pl, c));
37025079Sjaap pl = prev (pl))
37125079Sjaap ;
37225079Sjaap switch(ct){
37325079Sjaap
37425079Sjaap case 'n':
37525079Sjaap case 'c':
37625079Sjaap printf("(\\n(%2su+\\n(%2su-\\n(%c-u)/2u\n",reg(c,CLEFT),
37725079Sjaap reg(c - 1 + ctspan(lin, c), CRIGHT), s);
37825079Sjaap break;
37925079Sjaap case 'l':
38025079Sjaap printf("\\n(%2su\n", reg(c, CLEFT));
38125079Sjaap break;
38225079Sjaap case 'a':
38325079Sjaap printf("\\n(%2su\n", reg(c, CMID));
38425079Sjaap break;
38525079Sjaap case 'r':
38625079Sjaap printf("\\n(%2su-\\n(%c-u\n", reg(c, CRIGHT), s);
38725079Sjaap break;
38825079Sjaap }
38925079Sjaap printf(".in +\\n(%du\n", SIND);
39025079Sjaap fn = font[stynum[stl]][c];
39125079Sjaap putfont(fn);
39225079Sjaap pl = prev(stl);
39325079Sjaap if(stl > 0 && pl >= 0 && vspen(table[pl][c].col)){
39425079Sjaap printf(".sp |\\n(^%cu\n", 'a' + c);
39525079Sjaap if((ctop[stynum[stl]][c]&(CTOP|CDOWN)) == 0){
39625079Sjaap printf(".nr %d \\n(#-u-\\n(^%c-\\n(%c|+1v\n",
39725079Sjaap TMP, 'a' + c, s);
39825079Sjaap printf(".if \\n(%d>0 .sp \\n(%du/2u",TMP,TMP);
39925079Sjaap /*
40025079Sjaap * Round
40125079Sjaap */
40225079Sjaap if(pr1403)
40325079Sjaap printf("/1v*1v");
40425079Sjaap printf("\n");
40525079Sjaap }
40625079Sjaap }
40725079Sjaap printf(".%c+\n", s);
40825079Sjaap printf(".in -\\n(%du\n", SIND);
40925079Sjaap if(*fn > 0)
41025079Sjaap putfont("P");
41125079Sjaap printf(".mk %d\n", S2);
41225079Sjaap printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", S2, S1, S1, S2);
41325079Sjaap }
41425079Sjaap printf(".sp |\\n(%du\n", S1);
41525079Sjaap for(c = dv = 0; c < ncol; c++){
41625079Sjaap if(stl + 1 < nlin && (lf = left(stl, c, &lwid)) >= 0){
41725079Sjaap if(dv++ == 0)
41825079Sjaap printf(".sp -1\n");
41925079Sjaap tohcol(c);
42025079Sjaap dv++;
42125079Sjaap drawvert(lf, stl, c, lwid);
42225079Sjaap }
42325079Sjaap }
42425079Sjaap if(dv)
42525079Sjaap printf("\n");
42625079Sjaap }
42725079Sjaap
putfont(fn)42825079Sjaap putfont(fn)
42925079Sjaap char *fn;
43025079Sjaap {
43125079Sjaap if(fn && *fn)
43225079Sjaap printf(fn[1] ? "\\f(%.2s" : "\\f%.2s", fn);
43325079Sjaap }
43425079Sjaap
putsize(s)43525079Sjaap putsize(s)
43625079Sjaap char *s;
43725079Sjaap {
43825079Sjaap if(s && *s)
43925079Sjaap printf("\\s%s", s);
44025079Sjaap }
441