xref: /csrg-svn/old/tbl/t8.c (revision 11035)
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