plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

t3.c (1830B)


      1 /* t3.c: interpret commands affecting whole table */
      2 # include "t.h"
      3 struct optstr {
      4 	char	*optnam;
      5 	int	*optadd;
      6 } options [] = {
      7 	"expand", &expflg,
      8 	"EXPAND", &expflg,
      9 	"center", &ctrflg,
     10 	"CENTER", &ctrflg,
     11 	"box", &boxflg,
     12 	"BOX", &boxflg,
     13 	"allbox", &allflg,
     14 	"ALLBOX", &allflg,
     15 	"doublebox", &dboxflg,
     16 	"DOUBLEBOX", &dboxflg,
     17 	"frame", &boxflg,
     18 	"FRAME", &boxflg,
     19 	"doubleframe", &dboxflg,
     20 	"DOUBLEFRAME", &dboxflg,
     21 	"tab", &tab,
     22 	"TAB", &tab,
     23 	"linesize", &linsize,
     24 	"LINESIZE", &linsize,
     25 	"delim", &delim1,
     26 	"DELIM", &delim1,
     27 	0, 0};
     28 
     29 
     30 void
     31 getcomm(void)
     32 {
     33 	char	line[200], *cp, nb[25], *t;
     34 	struct optstr *lp;
     35 	int	c, ci, found;
     36 
     37 	for (lp = options; lp->optnam; lp++)
     38 		*(lp->optadd) = 0;
     39 	texname = texstr[texct=0];
     40 	tab = '\t';
     41 	Bprint(&tabout, ".nr %d \\n(.s\n", LSIZE);
     42 	gets1(line, sizeof(line));
     43 	/* see if this is a command line */
     44 	if (strchr(line, ';') == 0) {
     45 		backrest(line);
     46 		return;
     47 	}
     48 	for (cp = line; (c = *cp) != ';'; cp++) {
     49 		if (!letter(c))
     50 			continue;
     51 		found = 0;
     52 		for (lp = options; lp->optadd; lp++) {
     53 			if (prefix(lp->optnam, cp)) {
     54 				*(lp->optadd) = 1;
     55 				cp += strlen(lp->optnam);
     56 				if (letter(*cp))
     57 					error("Misspelled global option");
     58 				while (*cp == ' ')
     59 					cp++;
     60 				t = nb;
     61 				if ( *cp == '(')
     62 					while ((ci = *++cp) != ')')
     63 						*t++ = ci;
     64 				else
     65 					cp--;
     66 				*t++ = 0;
     67 				*t = 0;
     68 				if (lp->optadd == &tab) {
     69 					if (nb[0])
     70 						*(lp->optadd) = nb[0];
     71 				}
     72 				if (lp->optadd == &linsize)
     73 					Bprint(&tabout, ".nr %d %s\n", LSIZE, nb);
     74 				if (lp->optadd == &delim1) {
     75 					delim1 = nb[0];
     76 					delim2 = nb[1];
     77 				}
     78 				found = 1;
     79 				break;
     80 			}
     81 		}
     82 		if (!found)
     83 			error("Illegal option");
     84 	}
     85 	cp++;
     86 	backrest(cp);
     87 	return;
     88 }
     89 
     90 
     91 void
     92 backrest(char *cp)
     93 {
     94 	char	*s;
     95 
     96 	for (s = cp; *s; s++)
     97 		;
     98 	un1getc('\n');
     99 	while (s > cp)
    100 		un1getc(*--s);
    101 	return;
    102 }