1cda73749Sjaap #ifndef lint
2*19ae5b1dSjaap static char sccsid[] = "@(#)lex.c	2.2 (CWI) 87/04/01";
3246d53efSjaap #endif lint
4cda73749Sjaap #include "e.h"
5*19ae5b1dSjaap #include "y.tab.h"
6cda73749Sjaap #include "ctype.h"
7cda73749Sjaap 
8cda73749Sjaap #define	SSIZE	400
9cda73749Sjaap char	token[SSIZE];
10cda73749Sjaap int	sp;
11cda73749Sjaap 
yylex()12246d53efSjaap yylex()
13cda73749Sjaap {
14cda73749Sjaap 	register int c;
15246d53efSjaap 	tbl *tp;
16cda73749Sjaap 
17246d53efSjaap   begin:
18246d53efSjaap 	while ((c=input()) == ' ' || c == '\n')
19cda73749Sjaap 		;
20cda73749Sjaap 	yylval = c;
21cda73749Sjaap 	switch (c) {
22cda73749Sjaap 	case EOF:
23246d53efSjaap 		error(!FATAL, "unexpected end of input inside equation");
24cda73749Sjaap 		return(EOF);
25cda73749Sjaap 	case '~':
26cda73749Sjaap 		return(SPACE);
27cda73749Sjaap 	case '^':
28cda73749Sjaap 		return(THIN);
29cda73749Sjaap 	case '\t':
30cda73749Sjaap 		return(TAB);
31cda73749Sjaap 	case '{':
32cda73749Sjaap 		return('{');
33cda73749Sjaap 	case '}':
34cda73749Sjaap 		return('}');
35cda73749Sjaap 	case '"':
36246d53efSjaap 		for (sp = 0; (c=input())!='"' && c != '\n'; ) {
37cda73749Sjaap 			if (c == '\\')
38246d53efSjaap 				if ((c = input()) != '"')
39cda73749Sjaap 					token[sp++] = '\\';
40cda73749Sjaap 			token[sp++] = c;
41cda73749Sjaap 			if (sp >= SSIZE)
42cda73749Sjaap 				error(FATAL, "quoted string %.20s... too long", token);
43cda73749Sjaap 		}
44cda73749Sjaap 		token[sp] = '\0';
45cda73749Sjaap 		yylval = (int) &token[0];
46cda73749Sjaap 		if (c == '\n')
47cda73749Sjaap 			error(!FATAL, "missing \" in %.20s", token);
48cda73749Sjaap 		return(QTEXT);
49cda73749Sjaap 	}
50246d53efSjaap 	if (!display && c == righteq)
51cda73749Sjaap 		return(EOF);
52cda73749Sjaap 
53246d53efSjaap 	unput(c);
54cda73749Sjaap 	getstr(token, SSIZE);
55246d53efSjaap 	dprintf(".\tlex token = |%s|\n", token);
56246d53efSjaap 	if ((tp = lookup(deftbl, token, NULL)) != NULL) {	/* defined term */
57246d53efSjaap 		c = input();
58246d53efSjaap 		unput(c);
59246d53efSjaap 		if (c == '(')	/* macro with args */
60246d53efSjaap 			dodef(tp);
61246d53efSjaap 		else {		/* no args */
62246d53efSjaap 			unput(' ');
63cda73749Sjaap 			pbstr(tp->defn);
64246d53efSjaap 			dprintf(".\tfound %s|=%s|\n", token, tp->defn);
65cda73749Sjaap 		}
66246d53efSjaap 		goto begin;
67cda73749Sjaap 	}
68cda73749Sjaap 
69246d53efSjaap 	if ((tp = lookup(keytbl, token, NULL)) == NULL)	/* not a keyword */
70246d53efSjaap 		return CONTIG;
71246d53efSjaap 
72246d53efSjaap 	switch ((int) tp->defn) {		/* some kind of keyword */
73246d53efSjaap 	case DEFINE: case TDEFINE: case NDEFINE:
74246d53efSjaap 		define(tp->defn);
75246d53efSjaap 		break;
76246d53efSjaap 	case IFDEF:
77246d53efSjaap 		ifdef();
78246d53efSjaap 		break;
79246d53efSjaap 	case DELIM:
80246d53efSjaap 		delim();
81246d53efSjaap 		break;
82246d53efSjaap 	case GSIZE:
83246d53efSjaap 		globsize();
84246d53efSjaap 		break;
85246d53efSjaap 	case GFONT:
86246d53efSjaap 		globfont();
87246d53efSjaap 		break;
88246d53efSjaap 	case INCLUDE:
89246d53efSjaap 		include();
90246d53efSjaap 		break;
91246d53efSjaap 	case SPACE:
92246d53efSjaap 		space();
93246d53efSjaap 		break;
94246d53efSjaap 	case DOTEQ:
95246d53efSjaap 			/* .EQ inside equation -- should warn if at bottom level */
96246d53efSjaap 		break;
97246d53efSjaap 	case DOTEN:
98246d53efSjaap 		if (curfile == infile)
99246d53efSjaap 			return EOF;
100246d53efSjaap 		/* else ignore nested .EN */
101246d53efSjaap 		break;
102246d53efSjaap 	default:
103246d53efSjaap 		return (int) tp->defn;
104246d53efSjaap 	}
105246d53efSjaap 	goto begin;
106246d53efSjaap }
107246d53efSjaap 
getstr(s,n)108246d53efSjaap getstr(s, n)
109246d53efSjaap 	char *s;
110246d53efSjaap 	register int n;
111246d53efSjaap {
112cda73749Sjaap 	register int c;
113cda73749Sjaap 	register char *p;
114cda73749Sjaap 
115cda73749Sjaap 	p = s;
116246d53efSjaap 	while ((c = input()) == ' ' || c == '\n')
117cda73749Sjaap 		;
118cda73749Sjaap 	if (c == EOF) {
119cda73749Sjaap 		*s = 0;
120cda73749Sjaap 		return;
121cda73749Sjaap 	}
122cda73749Sjaap 	while (c != ' ' && c != '\t' && c != '\n' && c != '{' && c != '}'
123246d53efSjaap 	    && c != '"' && c != '~' && c != '^') {
124246d53efSjaap 		if (!display && c == righteq)
125246d53efSjaap 			break;
126246d53efSjaap 		if (c == '(' && p > s) {	/* might be defined(...) */
127246d53efSjaap 			*p = '\0';
128246d53efSjaap 			if (lookup(deftbl, s, NULL) != NULL)
129246d53efSjaap 				break;
130246d53efSjaap 		}
131cda73749Sjaap 		if (c == '\\')
132246d53efSjaap 			if ((c = input()) != '"')
133cda73749Sjaap 				*p++ = '\\';
134cda73749Sjaap 		*p++ = c;
135cda73749Sjaap 		if (--n <= 0)
136cda73749Sjaap 			error(FATAL, "token %.20s... too long", s);
137246d53efSjaap 		c = input();
138cda73749Sjaap 	}
139246d53efSjaap 	unput(c);
140cda73749Sjaap 	*p = '\0';
141cda73749Sjaap 	yylval = (int) s;
142cda73749Sjaap }
143cda73749Sjaap 
cstr(s,quote,maxs)144246d53efSjaap cstr(s, quote, maxs)
145246d53efSjaap 	char *s;
146246d53efSjaap 	int quote;
147246d53efSjaap {
148cda73749Sjaap 	int del, c, i;
149cda73749Sjaap 
150cda73749Sjaap 	s[0] = 0;
151246d53efSjaap 	while ((del=input()) == ' ' || del == '\t')
152cda73749Sjaap 		;
153cda73749Sjaap 	if (quote)
154246d53efSjaap 		for (i=0; (c=input()) != del && c != EOF;) {
155cda73749Sjaap 			s[i++] = c;
156cda73749Sjaap 			if (i >= maxs)
157cda73749Sjaap 				return(1);	/* disaster */
158cda73749Sjaap 		}
159cda73749Sjaap 	else {
160cda73749Sjaap 		if (del == '\n')
161cda73749Sjaap 			return(1);
162cda73749Sjaap 		s[0] = del;
163246d53efSjaap 		for (i=1; (c=input())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) {
164cda73749Sjaap 			s[i++] = c;
165cda73749Sjaap 			if (i >= maxs)
166cda73749Sjaap 				return(1);	/* disaster */
167cda73749Sjaap 		}
168cda73749Sjaap 	}
169cda73749Sjaap 	s[i] = '\0';
170cda73749Sjaap 	if (c == EOF)
171cda73749Sjaap 		error(FATAL, "Unexpected end of input at %.20s", s);
172cda73749Sjaap 	return(0);
173cda73749Sjaap }
174cda73749Sjaap 
define(type)175246d53efSjaap define(type)
176246d53efSjaap 	int type;
177246d53efSjaap {
178246d53efSjaap 	char *p1, *p2;
179cda73749Sjaap 
180cda73749Sjaap 	getstr(token, SSIZE);	/* get name */
181cda73749Sjaap 	if (type != DEFINE) {
182cda73749Sjaap 		cstr(token, 1, SSIZE);	/* skip the definition too */
183cda73749Sjaap 		return;
184cda73749Sjaap 	}
185cda73749Sjaap 	p1 = strsave(token);
186cda73749Sjaap 	if (cstr(token, 1, SSIZE))
187cda73749Sjaap 		error(FATAL, "Unterminated definition at %.20s", token);
188cda73749Sjaap 	p2 = strsave(token);
189246d53efSjaap 	lookup(deftbl, p1, p2);
190246d53efSjaap 	dprintf(".\tname %s defined as %s\n", p1, p2);
191246d53efSjaap }
192246d53efSjaap 
ifdef()193246d53efSjaap ifdef()		/* do body if name is defined */
194246d53efSjaap {
195246d53efSjaap 	tbl *tp;
196246d53efSjaap 	char name[100], *p;
197246d53efSjaap 
198246d53efSjaap 	getstr(name, sizeof(name));	/* get name */
199246d53efSjaap 	cstr(token, 1, SSIZE);		/* and body */
200246d53efSjaap 	if ((tp = lookup(deftbl, name, NULL)) != NULL) {	/* found it */
201246d53efSjaap 		p = strsave(token);
202246d53efSjaap 		pushsrc(Free, p);
203246d53efSjaap 		pushsrc(String, p);
204246d53efSjaap 	}
205cda73749Sjaap }
206cda73749Sjaap 
207cda73749Sjaap char	*spaceval	= NULL;
208cda73749Sjaap 
space()209cda73749Sjaap space()	/* collect line of form "space amt" to replace \x in output */
210cda73749Sjaap {
211cda73749Sjaap 	getstr(token, SSIZE);
212cda73749Sjaap 	spaceval = strsave(token);
213246d53efSjaap 	dprintf(".\tsetting spaceval to %s\n", token);
214cda73749Sjaap }
215cda73749Sjaap 
strsave(s)216cda73749Sjaap char *strsave(s)
217cda73749Sjaap 	char *s;
218cda73749Sjaap {
219cda73749Sjaap 	register char *q;
220cda73749Sjaap 
221cda73749Sjaap 	q = malloc(strlen(s)+1);
222cda73749Sjaap 	if (q == NULL)
223cda73749Sjaap 		error(FATAL, "out of space in strsave on %s", s);
224cda73749Sjaap 	strcpy(q, s);
225cda73749Sjaap 	return(q);
226cda73749Sjaap }
227cda73749Sjaap 
include()228246d53efSjaap include()
229246d53efSjaap {
230246d53efSjaap 	char name[100];
231246d53efSjaap 	FILE *fin;
232246d53efSjaap 	int c;
233246d53efSjaap 	extern int errno;
234246d53efSjaap 
235246d53efSjaap 	while ((c = input()) == ' ')
236246d53efSjaap 		;
237246d53efSjaap 	unput(c);
238246d53efSjaap 	cstr(name, c == '"', sizeof(name));	/* gets it quoted or not */
239246d53efSjaap 	if ((fin = fopen(name, "r")) == NULL)
240246d53efSjaap 		fatal("can't open file %s", name);
241246d53efSjaap 	errno = 0;
242246d53efSjaap 	curfile++;
243246d53efSjaap 	curfile->fin = fin;
244246d53efSjaap 	curfile->fname = strsave(name);
245246d53efSjaap 	curfile->lineno = 0;
246246d53efSjaap 	printf(".lf 1 %s\n", curfile->fname);
247246d53efSjaap 	pushsrc(File, curfile);
248cda73749Sjaap }
249cda73749Sjaap 
delim()250246d53efSjaap delim()
251246d53efSjaap {
252cda73749Sjaap 	yyval = eqnreg = 0;
253cda73749Sjaap 	if (cstr(token, 0, SSIZE))
254cda73749Sjaap 		error(FATAL, "Bizarre delimiters");
255cda73749Sjaap 	lefteq = token[0];
256cda73749Sjaap 	righteq = token[1];
257cda73749Sjaap         if (!isprint(lefteq) || !isprint(righteq))
258cda73749Sjaap 		error(FATAL, "Bizarre delimiters");
259cda73749Sjaap 	if (lefteq == 'o' && righteq == 'f')
260cda73749Sjaap 		lefteq = righteq = '\0';
261cda73749Sjaap }
262