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