Blame


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>
5 5cedca1b 2004-05-15 devnull
6 5cedca1b 2004-05-15 devnull #define SSIZE 1000
7 5cedca1b 2004-05-15 devnull char token[SSIZE];
8 5cedca1b 2004-05-15 devnull int sp;
9 5cedca1b 2004-05-15 devnull
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);
16 5cedca1b 2004-05-15 devnull
17 b237df90 2004-05-16 devnull int
18 5cedca1b 2004-05-15 devnull yylex(void)
19 5cedca1b 2004-05-15 devnull {
20 5cedca1b 2004-05-15 devnull register int c;
21 5cedca1b 2004-05-15 devnull tbl *tp;
22 5cedca1b 2004-05-15 devnull
23 20035ed4 2014-02-28 minux.ma begin:
24 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ' || c == '\n' || c == '\t')
25 5cedca1b 2004-05-15 devnull ;
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);
37 5cedca1b 2004-05-15 devnull */
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;
50 5cedca1b 2004-05-15 devnull }
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);
56 5cedca1b 2004-05-15 devnull }
57 5cedca1b 2004-05-15 devnull if (!display && c == righteq)
58 5cedca1b 2004-05-15 devnull return(EOF);
59 5cedca1b 2004-05-15 devnull
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);
72 5cedca1b 2004-05-15 devnull }
73 5cedca1b 2004-05-15 devnull goto begin;
74 5cedca1b 2004-05-15 devnull }
75 5cedca1b 2004-05-15 devnull
76 5cedca1b 2004-05-15 devnull if ((tp = lookup(keytbl, token)) == NULL) /* not a keyword */
77 5cedca1b 2004-05-15 devnull return CONTIG;
78 5cedca1b 2004-05-15 devnull
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);
82 5cedca1b 2004-05-15 devnull break;
83 5cedca1b 2004-05-15 devnull case IFDEF:
84 5cedca1b 2004-05-15 devnull ifdef();
85 5cedca1b 2004-05-15 devnull break;
86 5cedca1b 2004-05-15 devnull case DELIM:
87 5cedca1b 2004-05-15 devnull delim();
88 5cedca1b 2004-05-15 devnull break;
89 5cedca1b 2004-05-15 devnull case GSIZE:
90 5cedca1b 2004-05-15 devnull globsize();
91 5cedca1b 2004-05-15 devnull break;
92 5cedca1b 2004-05-15 devnull case GFONT:
93 5cedca1b 2004-05-15 devnull globfont();
94 5cedca1b 2004-05-15 devnull break;
95 5cedca1b 2004-05-15 devnull case INCLUDE:
96 5cedca1b 2004-05-15 devnull include();
97 5cedca1b 2004-05-15 devnull break;
98 5cedca1b 2004-05-15 devnull case SPACE:
99 5cedca1b 2004-05-15 devnull space();
100 5cedca1b 2004-05-15 devnull break;
101 5cedca1b 2004-05-15 devnull case DOTEQ:
102 5cedca1b 2004-05-15 devnull /* .EQ inside equation -- should warn if at bottom level */
103 5cedca1b 2004-05-15 devnull break;
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 */
108 5cedca1b 2004-05-15 devnull break;
109 5cedca1b 2004-05-15 devnull default:
110 5cedca1b 2004-05-15 devnull return tp->ival;
111 5cedca1b 2004-05-15 devnull }
112 5cedca1b 2004-05-15 devnull goto begin;
113 5cedca1b 2004-05-15 devnull }
114 5cedca1b 2004-05-15 devnull
115 5cedca1b 2004-05-15 devnull void getstr(char *s, int n)
116 5cedca1b 2004-05-15 devnull {
117 5cedca1b 2004-05-15 devnull register int c;
118 5cedca1b 2004-05-15 devnull register char *p;
119 5cedca1b 2004-05-15 devnull
120 5cedca1b 2004-05-15 devnull p = s;
121 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ' || c == '\n')
122 5cedca1b 2004-05-15 devnull ;
123 5cedca1b 2004-05-15 devnull if (c == EOF) {
124 5cedca1b 2004-05-15 devnull *s = 0;
125 5cedca1b 2004-05-15 devnull return;
126 5cedca1b 2004-05-15 devnull }
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)
130 5cedca1b 2004-05-15 devnull break;
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)
134 5cedca1b 2004-05-15 devnull break;
135 5cedca1b 2004-05-15 devnull }
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();
143 5cedca1b 2004-05-15 devnull }
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;
147 5cedca1b 2004-05-15 devnull }
148 5cedca1b 2004-05-15 devnull
149 b237df90 2004-05-16 devnull int
150 5cedca1b 2004-05-15 devnull cstr(char *s, int quote, int maxs)
151 5cedca1b 2004-05-15 devnull {
152 5cedca1b 2004-05-15 devnull int del, c, i;
153 5cedca1b 2004-05-15 devnull
154 5cedca1b 2004-05-15 devnull s[0] = 0;
155 5cedca1b 2004-05-15 devnull while ((del=input()) == ' ' || del == '\t')
156 5cedca1b 2004-05-15 devnull ;
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 */
162 5cedca1b 2004-05-15 devnull }
163 5cedca1b 2004-05-15 devnull else {
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 */
171 5cedca1b 2004-05-15 devnull }
172 5cedca1b 2004-05-15 devnull }
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);
177 5cedca1b 2004-05-15 devnull }
178 5cedca1b 2004-05-15 devnull
179 5cedca1b 2004-05-15 devnull void define(int type)
180 5cedca1b 2004-05-15 devnull {
181 5cedca1b 2004-05-15 devnull char *p1, *p2;
182 5cedca1b 2004-05-15 devnull extern int ftune(char *, char *);
183 5cedca1b 2004-05-15 devnull
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 */
187 5cedca1b 2004-05-15 devnull return;
188 5cedca1b 2004-05-15 devnull }
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);
199 5cedca1b 2004-05-15 devnull }
200 5cedca1b 2004-05-15 devnull }
201 5cedca1b 2004-05-15 devnull
202 5cedca1b 2004-05-15 devnull void ifdef(void) /* do body if name is defined */
203 5cedca1b 2004-05-15 devnull {
204 5cedca1b 2004-05-15 devnull char name[100], *p;
205 5cedca1b 2004-05-15 devnull
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);
212 5cedca1b 2004-05-15 devnull }
213 5cedca1b 2004-05-15 devnull }
214 5cedca1b 2004-05-15 devnull
215 5cedca1b 2004-05-15 devnull char *spaceval = NULL;
216 5cedca1b 2004-05-15 devnull
217 5cedca1b 2004-05-15 devnull void space(void) /* collect line of form "space amt" to replace \x in output */
218 5cedca1b 2004-05-15 devnull {
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);
222 5cedca1b 2004-05-15 devnull }
223 5cedca1b 2004-05-15 devnull
224 5cedca1b 2004-05-15 devnull char *strsave(char *s)
225 5cedca1b 2004-05-15 devnull {
226 5cedca1b 2004-05-15 devnull register char *q;
227 5cedca1b 2004-05-15 devnull
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);
233 5cedca1b 2004-05-15 devnull }
234 5cedca1b 2004-05-15 devnull
235 5cedca1b 2004-05-15 devnull void include(void)
236 5cedca1b 2004-05-15 devnull {
237 5cedca1b 2004-05-15 devnull char name[100];
238 5cedca1b 2004-05-15 devnull FILE *fin;
239 5cedca1b 2004-05-15 devnull int c;
240 5cedca1b 2004-05-15 devnull
241 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ')
242 5cedca1b 2004-05-15 devnull ;
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);
254 5cedca1b 2004-05-15 devnull }
255 5cedca1b 2004-05-15 devnull
256 5cedca1b 2004-05-15 devnull void delim(void)
257 5cedca1b 2004-05-15 devnull {
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';
267 5cedca1b 2004-05-15 devnull }