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