aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/tbl/t3.c
blob: 5429e5289c9e748dc546d3f56c1d32c83f859666 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* t3.c: interpret commands affecting whole table */
# include "t.h"
struct optstr {
	char	*optnam; 
	int	*optadd;
} options [] = {
	{ "expand", &expflg },
	{ "EXPAND", &expflg },
	{ "center", &ctrflg },
	{ "CENTER", &ctrflg },
	{ "box", &boxflg },
	{ "BOX", &boxflg },
	{ "allbox", &allflg },
	{ "ALLBOX", &allflg },
	{ "doublebox", &dboxflg },
	{ "DOUBLEBOX", &dboxflg },
	{ "frame", &boxflg },
	{ "FRAME", &boxflg },
	{ "doubleframe", &dboxflg },
	{ "DOUBLEFRAME", &dboxflg },
	{ "tab", &tab },
	{ "TAB", &tab },
	{ "linesize", &linsize },
	{ "LINESIZE", &linsize },
	{ "delim", &delim1 },
	{ "DELIM", &delim1 },
	{ 0, 0}
};


void
getcomm(void)
{
	char	line[200], *cp, nb[25], *t;
	struct optstr *lp;
	int	c, ci, found;

	for (lp = options; lp->optnam; lp++)
		*(lp->optadd) = 0;
	texname = texstr[texct=0];
	tab = '\t';
	fprintf(tabout, ".nr %d \\n(.s\n", LSIZE);
	gets1(line, sizeof(line));
	/* see if this is a command line */
	if (strchr(line, ';') == 0) {
		backrest(line);
		return;
	}
	for (cp = line; (c = *cp) != ';'; cp++) {
		if (!letter(c)) 
			continue;
		found = 0;
		for (lp = options; lp->optadd; lp++) {
			if (prefix(lp->optnam, cp)) {
				*(lp->optadd) = 1;
				cp += strlen(lp->optnam);
				if (letter(*cp))
					error("Misspelled global option");
				while (*cp == ' ')
					cp++;
				t = nb;
				if ( *cp == '(')
					while ((ci = *++cp) != ')')
						*t++ = ci;
				else 
					cp--;
				*t++ = 0; 
				*t = 0;
				if (lp->optadd == &tab) {
					if (nb[0])
						*(lp->optadd) = nb[0];
				}
				if (lp->optadd == &linsize)
					fprintf(tabout, ".nr %d %s\n", LSIZE, nb);
				if (lp->optadd == &delim1) {
					delim1 = nb[0];
					delim2 = nb[1];
				}
				found = 1;
				break;
			}
		}
		if (!found)
			error("Illegal option");
	}
	cp++;
	backrest(cp);
	return;
}


void
backrest(char *cp)
{
	char	*s;

	for (s = cp; *s; s++)
		;
	un1getc('\n');
	while (s > cp)
		un1getc(*--s);
	return;
}