1 5cedca1b 2004-05-15 devnull #include "e.h"
2 5cedca1b 2004-05-15 devnull #include "y.tab.h"
3 5cedca1b 2004-05-15 devnull #include <ctype.h>
4 20035ed4 2014-02-28 minux.ma #include <errno.h>
6 5cedca1b 2004-05-15 devnull #define SSIZE 1000
7 5cedca1b 2004-05-15 devnull char token[SSIZE];
10 5cedca1b 2004-05-15 devnull void space(void);
11 5cedca1b 2004-05-15 devnull void dodef(tbl *);
12 5cedca1b 2004-05-15 devnull void define(int);
13 5cedca1b 2004-05-15 devnull void ifdef(void);
14 5cedca1b 2004-05-15 devnull void include(void);
15 5cedca1b 2004-05-15 devnull void delim(void);
18 5cedca1b 2004-05-15 devnull yylex(void)
20 5cedca1b 2004-05-15 devnull register int c;
24 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ' || c == '\n' || c == '\t')
26 5cedca1b 2004-05-15 devnull yylval = c;
27 5cedca1b 2004-05-15 devnull switch (c) {
28 5cedca1b 2004-05-15 devnull case EOF:
29 5cedca1b 2004-05-15 devnull ERROR "unexpected end of input inside equation" WARNING;
30 5cedca1b 2004-05-15 devnull return(EOF);
31 5cedca1b 2004-05-15 devnull case '~':
32 5cedca1b 2004-05-15 devnull return(SPACE);
33 5cedca1b 2004-05-15 devnull case '^':
34 5cedca1b 2004-05-15 devnull return(THIN);
35 5cedca1b 2004-05-15 devnull /* case '\t':
36 5cedca1b 2004-05-15 devnull return(TAB);
38 5cedca1b 2004-05-15 devnull case '{':
39 5cedca1b 2004-05-15 devnull return('{');
40 5cedca1b 2004-05-15 devnull case '}':
41 5cedca1b 2004-05-15 devnull return('}');
42 5cedca1b 2004-05-15 devnull case '"':
43 5cedca1b 2004-05-15 devnull for (sp = 0; (c=input())!='"' && c != '\n'; ) {
44 5cedca1b 2004-05-15 devnull if (c == '\\')
45 5cedca1b 2004-05-15 devnull if ((c = input()) != '"')
46 5cedca1b 2004-05-15 devnull token[sp++] = '\\';
47 5cedca1b 2004-05-15 devnull token[sp++] = c;
48 5cedca1b 2004-05-15 devnull if (sp >= SSIZE)
49 5cedca1b 2004-05-15 devnull ERROR "quoted string %.20s... too long", token FATAL;
51 5cedca1b 2004-05-15 devnull token[sp] = '\0';
52 c42f7f42 2008-03-06 rsc yylval = (intptr_t)&token[0];
53 5cedca1b 2004-05-15 devnull if (c == '\n')
54 5cedca1b 2004-05-15 devnull ERROR "missing \" in %.20s", token WARNING;
55 5cedca1b 2004-05-15 devnull return(QTEXT);
57 5cedca1b 2004-05-15 devnull if (!display && c == righteq)
58 5cedca1b 2004-05-15 devnull return(EOF);
60 5cedca1b 2004-05-15 devnull unput(c);
61 5cedca1b 2004-05-15 devnull getstr(token, SSIZE);
62 5cedca1b 2004-05-15 devnull dprintf(".\tlex token = |%s|\n", token);
63 5cedca1b 2004-05-15 devnull if ((tp = lookup(deftbl, token)) != NULL) { /* defined term */
64 5cedca1b 2004-05-15 devnull c = input();
65 5cedca1b 2004-05-15 devnull unput(c);
66 5cedca1b 2004-05-15 devnull if (c == '(') /* macro with args */
67 5cedca1b 2004-05-15 devnull dodef(tp);
68 5cedca1b 2004-05-15 devnull else { /* no args */
69 5cedca1b 2004-05-15 devnull unput(' ');
70 5cedca1b 2004-05-15 devnull pbstr(tp->cval);
71 5cedca1b 2004-05-15 devnull dprintf(".\tfound %s|=%s|\n", token, tp->cval);
73 5cedca1b 2004-05-15 devnull goto begin;
76 5cedca1b 2004-05-15 devnull if ((tp = lookup(keytbl, token)) == NULL) /* not a keyword */
77 5cedca1b 2004-05-15 devnull return CONTIG;
79 5cedca1b 2004-05-15 devnull switch (tp->ival) { /* some kind of keyword */
80 5cedca1b 2004-05-15 devnull case DEFINE: case TDEFINE: case NDEFINE:
81 5cedca1b 2004-05-15 devnull define(tp->ival);
83 5cedca1b 2004-05-15 devnull case IFDEF:
86 5cedca1b 2004-05-15 devnull case DELIM:
89 5cedca1b 2004-05-15 devnull case GSIZE:
90 5cedca1b 2004-05-15 devnull globsize();
92 5cedca1b 2004-05-15 devnull case GFONT:
93 5cedca1b 2004-05-15 devnull globfont();
95 5cedca1b 2004-05-15 devnull case INCLUDE:
96 5cedca1b 2004-05-15 devnull include();
98 5cedca1b 2004-05-15 devnull case SPACE:
101 5cedca1b 2004-05-15 devnull case DOTEQ:
102 5cedca1b 2004-05-15 devnull /* .EQ inside equation -- should warn if at bottom level */
104 5cedca1b 2004-05-15 devnull case DOTEN:
105 5cedca1b 2004-05-15 devnull if (curfile == infile)
106 5cedca1b 2004-05-15 devnull return EOF;
107 5cedca1b 2004-05-15 devnull /* else ignore nested .EN */
109 5cedca1b 2004-05-15 devnull default:
110 5cedca1b 2004-05-15 devnull return tp->ival;
112 5cedca1b 2004-05-15 devnull goto begin;
115 5cedca1b 2004-05-15 devnull void getstr(char *s, int n)
117 5cedca1b 2004-05-15 devnull register int c;
118 5cedca1b 2004-05-15 devnull register char *p;
121 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ' || c == '\n')
123 5cedca1b 2004-05-15 devnull if (c == EOF) {
127 5cedca1b 2004-05-15 devnull while (c != ' ' && c != '\t' && c != '\n' && c != '{' && c != '}'
128 5cedca1b 2004-05-15 devnull && c != '"' && c != '~' && c != '^') {
129 5cedca1b 2004-05-15 devnull if (!display && c == righteq)
131 5cedca1b 2004-05-15 devnull if (c == '(' && p > s) { /* might be defined(...) */
132 5cedca1b 2004-05-15 devnull *p = '\0';
133 5cedca1b 2004-05-15 devnull if (lookup(deftbl, s) != NULL)
136 5cedca1b 2004-05-15 devnull if (c == '\\')
137 5cedca1b 2004-05-15 devnull if ((c = input()) != '"')
138 5cedca1b 2004-05-15 devnull *p++ = '\\';
139 5cedca1b 2004-05-15 devnull *p++ = c;
140 5cedca1b 2004-05-15 devnull if (--n <= 0)
141 5cedca1b 2004-05-15 devnull ERROR "token %.20s... too long", s FATAL;
142 5cedca1b 2004-05-15 devnull c = input();
144 5cedca1b 2004-05-15 devnull unput(c);
145 5cedca1b 2004-05-15 devnull *p = '\0';
146 85b8545e 2006-04-20 devnull yylval = (uintptr_t)s;
150 5cedca1b 2004-05-15 devnull cstr(char *s, int quote, int maxs)
152 5cedca1b 2004-05-15 devnull int del, c, i;
154 5cedca1b 2004-05-15 devnull s[0] = 0;
155 5cedca1b 2004-05-15 devnull while ((del=input()) == ' ' || del == '\t')
157 5cedca1b 2004-05-15 devnull if (quote)
158 5cedca1b 2004-05-15 devnull for (i=0; (c=input()) != del && c != EOF;) {
159 5cedca1b 2004-05-15 devnull s[i++] = c;
160 5cedca1b 2004-05-15 devnull if (i >= maxs)
161 5cedca1b 2004-05-15 devnull return(1); /* disaster */
164 5cedca1b 2004-05-15 devnull if (del == '\n')
165 5cedca1b 2004-05-15 devnull return(1);
166 5cedca1b 2004-05-15 devnull s[0] = del;
167 5cedca1b 2004-05-15 devnull for (i=1; (c=input())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) {
168 5cedca1b 2004-05-15 devnull s[i++] = c;
169 5cedca1b 2004-05-15 devnull if (i >= maxs)
170 5cedca1b 2004-05-15 devnull return(1); /* disaster */
173 5cedca1b 2004-05-15 devnull s[i] = '\0';
174 5cedca1b 2004-05-15 devnull if (c == EOF)
175 5cedca1b 2004-05-15 devnull ERROR "Unexpected end of input at %.20s", s FATAL;
176 5cedca1b 2004-05-15 devnull return(0);
179 5cedca1b 2004-05-15 devnull void define(int type)
181 5cedca1b 2004-05-15 devnull char *p1, *p2;
182 5cedca1b 2004-05-15 devnull extern int ftune(char *, char *);
184 5cedca1b 2004-05-15 devnull getstr(token, SSIZE); /* get name */
185 5cedca1b 2004-05-15 devnull if (type != DEFINE) {
186 5cedca1b 2004-05-15 devnull cstr(token, 1, SSIZE); /* skip the definition too */
189 5cedca1b 2004-05-15 devnull p1 = strsave(token);
190 5cedca1b 2004-05-15 devnull if (cstr(token, 1, SSIZE))
191 5cedca1b 2004-05-15 devnull ERROR "Unterminated definition at %.20s", token FATAL;
192 5cedca1b 2004-05-15 devnull if (lookup(ftunetbl, p1) != NULL) { /* double tuning param */
193 5cedca1b 2004-05-15 devnull dprintf(".\ttune %s %s\n", p1, token);
194 5cedca1b 2004-05-15 devnull ftune(p1, token);
195 5cedca1b 2004-05-15 devnull } else {
196 5cedca1b 2004-05-15 devnull p2 = strsave(token);
197 5cedca1b 2004-05-15 devnull install(deftbl, p1, p2, 0);
198 5cedca1b 2004-05-15 devnull dprintf(".\tname %s defined as %s\n", p1, p2);
202 5cedca1b 2004-05-15 devnull void ifdef(void) /* do body if name is defined */
204 5cedca1b 2004-05-15 devnull char name[100], *p;
206 5cedca1b 2004-05-15 devnull getstr(name, sizeof(name)); /* get name */
207 5cedca1b 2004-05-15 devnull cstr(token, 1, SSIZE); /* and body */
208 5cedca1b 2004-05-15 devnull if (lookup(deftbl, name) != NULL) { /* found it */
209 5cedca1b 2004-05-15 devnull p = strsave(token);
210 5cedca1b 2004-05-15 devnull pushsrc(Free, p);
211 5cedca1b 2004-05-15 devnull pushsrc(String, p);
215 5cedca1b 2004-05-15 devnull char *spaceval = NULL;
217 5cedca1b 2004-05-15 devnull void space(void) /* collect line of form "space amt" to replace \x in output */
219 5cedca1b 2004-05-15 devnull getstr(token, SSIZE);
220 5cedca1b 2004-05-15 devnull spaceval = strsave(token);
221 5cedca1b 2004-05-15 devnull dprintf(".\tsetting spaceval to %s\n", token);
224 5cedca1b 2004-05-15 devnull char *strsave(char *s)
226 5cedca1b 2004-05-15 devnull register char *q;
228 5cedca1b 2004-05-15 devnull q = malloc(strlen(s)+1);
229 5cedca1b 2004-05-15 devnull if (q == NULL)
230 5cedca1b 2004-05-15 devnull ERROR "out of space in strsave on %s", s FATAL;
231 5cedca1b 2004-05-15 devnull strcpy(q, s);
232 5cedca1b 2004-05-15 devnull return(q);
235 5cedca1b 2004-05-15 devnull void include(void)
237 5cedca1b 2004-05-15 devnull char name[100];
238 5cedca1b 2004-05-15 devnull FILE *fin;
241 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ')
243 5cedca1b 2004-05-15 devnull unput(c);
244 5cedca1b 2004-05-15 devnull cstr(name, c == '"', sizeof(name)); /* gets it quoted or not */
245 5cedca1b 2004-05-15 devnull if ((fin = fopen(name, "r")) == NULL)
246 5cedca1b 2004-05-15 devnull ERROR "can't open file %s", name FATAL;
247 5cedca1b 2004-05-15 devnull errno = 0;
248 5cedca1b 2004-05-15 devnull curfile++;
249 5cedca1b 2004-05-15 devnull curfile->fin = fin;
250 5cedca1b 2004-05-15 devnull curfile->fname = strsave(name);
251 5cedca1b 2004-05-15 devnull curfile->lineno = 0;
252 5cedca1b 2004-05-15 devnull printf(".lf 1 %s\n", curfile->fname);
253 5cedca1b 2004-05-15 devnull pushsrc(File, curfile->fname);
256 5cedca1b 2004-05-15 devnull void delim(void)
258 5cedca1b 2004-05-15 devnull yyval = eqnreg = 0;
259 5cedca1b 2004-05-15 devnull if (cstr(token, 0, SSIZE))
260 5cedca1b 2004-05-15 devnull ERROR "Bizarre delimiters" FATAL;
261 5cedca1b 2004-05-15 devnull lefteq = token[0];
262 5cedca1b 2004-05-15 devnull righteq = token[1];
263 20035ed4 2014-02-28 minux.ma if (!isprint(lefteq) || !isprint(righteq))
264 5cedca1b 2004-05-15 devnull ERROR "Bizarre delimiters" FATAL;
265 5cedca1b 2004-05-15 devnull if (lefteq == 'o' && righteq == 'f')
266 5cedca1b 2004-05-15 devnull lefteq = righteq = '\0';