xref: /plan9/sys/src/cmd/tbl/t3.c (revision 43af371b8d63420d32d0cb0b58914db16dcd7715)
13e12c5d1SDavid du Colombier /* t3.c: interpret commands affecting whole table */
23e12c5d1SDavid du Colombier # include "t.h"
3*43af371bSDavid du Colombier 
43e12c5d1SDavid du Colombier struct optstr {
53e12c5d1SDavid du Colombier 	char	*optnam;
63e12c5d1SDavid du Colombier 	int	*optadd;
73e12c5d1SDavid du Colombier } options [] = {
83e12c5d1SDavid du Colombier 	"expand", &expflg,
93e12c5d1SDavid du Colombier 	"EXPAND", &expflg,
103e12c5d1SDavid du Colombier 	"center", &ctrflg,
113e12c5d1SDavid du Colombier 	"CENTER", &ctrflg,
123e12c5d1SDavid du Colombier 	"box", &boxflg,
133e12c5d1SDavid du Colombier 	"BOX", &boxflg,
143e12c5d1SDavid du Colombier 	"allbox", &allflg,
153e12c5d1SDavid du Colombier 	"ALLBOX", &allflg,
163e12c5d1SDavid du Colombier 	"doublebox", &dboxflg,
173e12c5d1SDavid du Colombier 	"DOUBLEBOX", &dboxflg,
183e12c5d1SDavid du Colombier 	"frame", &boxflg,
193e12c5d1SDavid du Colombier 	"FRAME", &boxflg,
203e12c5d1SDavid du Colombier 	"doubleframe", &dboxflg,
213e12c5d1SDavid du Colombier 	"DOUBLEFRAME", &dboxflg,
223e12c5d1SDavid du Colombier 	"tab", &tab,
233e12c5d1SDavid du Colombier 	"TAB", &tab,
243e12c5d1SDavid du Colombier 	"linesize", &linsize,
253e12c5d1SDavid du Colombier 	"LINESIZE", &linsize,
263e12c5d1SDavid du Colombier 	"delim", &delim1,
273e12c5d1SDavid du Colombier 	"DELIM", &delim1,
28*43af371bSDavid du Colombier 	0, 0
29*43af371bSDavid du Colombier };
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier void
getcomm(void)323e12c5d1SDavid du Colombier getcomm(void)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 	char	line[200], *cp, nb[25], *t;
353e12c5d1SDavid du Colombier 	struct optstr *lp;
363e12c5d1SDavid du Colombier 	int	c, ci, found;
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier 	for (lp = options; lp->optnam; lp++)
393e12c5d1SDavid du Colombier 		*(lp->optadd) = 0;
403e12c5d1SDavid du Colombier 	texname = texstr[texct=0];
413e12c5d1SDavid du Colombier 	tab = '\t';
42219b2ee8SDavid du Colombier 	Bprint(&tabout, ".nr %d \\n(.s\n", LSIZE);
433e12c5d1SDavid du Colombier 	gets1(line, sizeof(line));
443e12c5d1SDavid du Colombier 	/* see if this is a command line */
45219b2ee8SDavid du Colombier 	if (strchr(line, ';') == 0) {
463e12c5d1SDavid du Colombier 		backrest(line);
473e12c5d1SDavid du Colombier 		return;
483e12c5d1SDavid du Colombier 	}
493e12c5d1SDavid du Colombier 	for (cp = line; (c = *cp) != ';'; cp++) {
503e12c5d1SDavid du Colombier 		if (!letter(c))
513e12c5d1SDavid du Colombier 			continue;
523e12c5d1SDavid du Colombier 		found = 0;
533e12c5d1SDavid du Colombier 		for (lp = options; lp->optadd; lp++) {
543e12c5d1SDavid du Colombier 			if (prefix(lp->optnam, cp)) {
553e12c5d1SDavid du Colombier 				*(lp->optadd) = 1;
563e12c5d1SDavid du Colombier 				cp += strlen(lp->optnam);
573e12c5d1SDavid du Colombier 				if (letter(*cp))
583e12c5d1SDavid du Colombier 					error("Misspelled global option");
593e12c5d1SDavid du Colombier 				while (*cp == ' ')
603e12c5d1SDavid du Colombier 					cp++;
613e12c5d1SDavid du Colombier 				t = nb;
623e12c5d1SDavid du Colombier 				if ( *cp == '(')
633e12c5d1SDavid du Colombier 					while ((ci = *++cp) != ')')
643e12c5d1SDavid du Colombier 						*t++ = ci;
653e12c5d1SDavid du Colombier 				else
663e12c5d1SDavid du Colombier 					cp--;
673e12c5d1SDavid du Colombier 				*t++ = 0;
683e12c5d1SDavid du Colombier 				*t = 0;
693e12c5d1SDavid du Colombier 				if (lp->optadd == &tab) {
703e12c5d1SDavid du Colombier 					if (nb[0])
713e12c5d1SDavid du Colombier 						*(lp->optadd) = nb[0];
723e12c5d1SDavid du Colombier 				}
733e12c5d1SDavid du Colombier 				if (lp->optadd == &linsize)
74219b2ee8SDavid du Colombier 					Bprint(&tabout, ".nr %d %s\n", LSIZE, nb);
753e12c5d1SDavid du Colombier 				if (lp->optadd == &delim1) {
763e12c5d1SDavid du Colombier 					delim1 = nb[0];
773e12c5d1SDavid du Colombier 					delim2 = nb[1];
783e12c5d1SDavid du Colombier 				}
793e12c5d1SDavid du Colombier 				found = 1;
803e12c5d1SDavid du Colombier 				break;
813e12c5d1SDavid du Colombier 			}
823e12c5d1SDavid du Colombier 		}
833e12c5d1SDavid du Colombier 		if (!found)
843e12c5d1SDavid du Colombier 			error("Illegal option");
853e12c5d1SDavid du Colombier 	}
863e12c5d1SDavid du Colombier 	cp++;
873e12c5d1SDavid du Colombier 	backrest(cp);
883e12c5d1SDavid du Colombier }
893e12c5d1SDavid du Colombier 
903e12c5d1SDavid du Colombier void
backrest(char * cp)913e12c5d1SDavid du Colombier backrest(char *cp)
923e12c5d1SDavid du Colombier {
933e12c5d1SDavid du Colombier 	char	*s;
943e12c5d1SDavid du Colombier 
953e12c5d1SDavid du Colombier 	for (s = cp; *s; s++)
963e12c5d1SDavid du Colombier 		;
973e12c5d1SDavid du Colombier 	un1getc('\n');
983e12c5d1SDavid du Colombier 	while (s > cp)
993e12c5d1SDavid du Colombier 		un1getc(*--s);
1003e12c5d1SDavid du Colombier }
101