xref: /plan9/sys/src/cmd/tbl/t9.c (revision 43af371b8d63420d32d0cb0b58914db16dcd7715)
13e12c5d1SDavid du Colombier /* t9.c: write lines for tables over 200 lines */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier static useln;
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier void
yetmore(void)63e12c5d1SDavid du Colombier yetmore(void)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	for (useln = 0; useln < MAXLIN && table[useln] == 0; useln++)
93e12c5d1SDavid du Colombier 		;
103e12c5d1SDavid du Colombier 	if (useln >= MAXLIN)
113e12c5d1SDavid du Colombier 		error("Wierd.  No data in table.");
123e12c5d1SDavid du Colombier 	table[0] = table[useln];
133e12c5d1SDavid du Colombier 	for (useln = nlin - 1; useln >= 0 && (fullbot[useln] || instead[useln]); useln--)
143e12c5d1SDavid du Colombier 		;
153e12c5d1SDavid du Colombier 	if (useln < 0)
163e12c5d1SDavid du Colombier 		error("Wierd.  No real lines in table.");
173e12c5d1SDavid du Colombier 	domore(leftover);
183e12c5d1SDavid du Colombier 	while (gets1(cstore = cspace, MAXCHS) && domore(cstore))
193e12c5d1SDavid du Colombier 		;
203e12c5d1SDavid du Colombier 	last = cstore;
213e12c5d1SDavid du Colombier }
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier 
243e12c5d1SDavid du Colombier int
domore(char * dataln)253e12c5d1SDavid du Colombier domore(char *dataln)
263e12c5d1SDavid du Colombier {
273e12c5d1SDavid du Colombier 	int	icol, ch;
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier 	if (prefix(".TE", dataln))
303e12c5d1SDavid du Colombier 		return(0);
313e12c5d1SDavid du Colombier 	if (dataln[0] == '.' && !isdigit(dataln[1])) {
32*219b2ee8SDavid du Colombier 		Bprint(&tabout, "%s\n", dataln);
333e12c5d1SDavid du Colombier 		return(1);
343e12c5d1SDavid du Colombier 	}
353e12c5d1SDavid du Colombier 	fullbot[0] = 0;
363e12c5d1SDavid du Colombier 	instead[0] = (char *)0;
373e12c5d1SDavid du Colombier 	if (dataln[1] == 0)
383e12c5d1SDavid du Colombier 		switch (dataln[0]) {
393e12c5d1SDavid du Colombier 		case '_':
403e12c5d1SDavid du Colombier 			fullbot[0] = '-';
413e12c5d1SDavid du Colombier 			putline(useln, 0);
423e12c5d1SDavid du Colombier 			return(1);
433e12c5d1SDavid du Colombier 		case '=':
443e12c5d1SDavid du Colombier 			fullbot[0] = '=';
453e12c5d1SDavid du Colombier 			putline(useln, 0);
463e12c5d1SDavid du Colombier 			return(1);
473e12c5d1SDavid du Colombier 		}
483e12c5d1SDavid du Colombier 	for (icol = 0; icol < ncol; icol++) {
493e12c5d1SDavid du Colombier 		table[0][icol].col = dataln;
503e12c5d1SDavid du Colombier 		table[0][icol].rcol = 0;
513e12c5d1SDavid du Colombier 		for (; (ch = *dataln) != '\0' && ch != tab; dataln++)
523e12c5d1SDavid du Colombier 			;
533e12c5d1SDavid du Colombier 		*dataln++ = '\0';
543e12c5d1SDavid du Colombier 		switch (ctype(useln, icol)) {
553e12c5d1SDavid du Colombier 		case 'n':
563e12c5d1SDavid du Colombier 			table[0][icol].rcol = maknew(table[0][icol].col);
573e12c5d1SDavid du Colombier 			break;
583e12c5d1SDavid du Colombier 		case 'a':
593e12c5d1SDavid du Colombier 			table[0][icol].rcol = table[0][icol].col;
603e12c5d1SDavid du Colombier 			table[0][icol].col = "";
613e12c5d1SDavid du Colombier 			break;
623e12c5d1SDavid du Colombier 		}
633e12c5d1SDavid du Colombier 		while (ctype(useln, icol + 1) == 's') /* spanning */
643e12c5d1SDavid du Colombier 			table[0][++icol].col = "";
653e12c5d1SDavid du Colombier 		if (ch == '\0')
663e12c5d1SDavid du Colombier 			break;
673e12c5d1SDavid du Colombier 	}
683e12c5d1SDavid du Colombier 	while (++icol < ncol)
693e12c5d1SDavid du Colombier 		table[0][icol].col = "";
703e12c5d1SDavid du Colombier 	putline(useln, 0);
713e12c5d1SDavid du Colombier 	exstore = exspace;		 /* reuse space for numerical items */
723e12c5d1SDavid du Colombier 	return(1);
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier 
753e12c5d1SDavid du Colombier 
76