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 5cedca1b 2004-05-15 devnull
5 5cedca1b 2004-05-15 devnull #define SSIZE 1000
6 5cedca1b 2004-05-15 devnull char token[SSIZE];
7 5cedca1b 2004-05-15 devnull int sp;
8 5cedca1b 2004-05-15 devnull
9 5cedca1b 2004-05-15 devnull void space(void);
10 5cedca1b 2004-05-15 devnull void dodef(tbl *);
11 5cedca1b 2004-05-15 devnull void define(int);
12 5cedca1b 2004-05-15 devnull void ifdef(void);
13 5cedca1b 2004-05-15 devnull void include(void);
14 5cedca1b 2004-05-15 devnull void delim(void);
15 5cedca1b 2004-05-15 devnull
16 b237df90 2004-05-16 devnull int
17 5cedca1b 2004-05-15 devnull yylex(void)
18 5cedca1b 2004-05-15 devnull {
19 5cedca1b 2004-05-15 devnull register int c;
20 5cedca1b 2004-05-15 devnull tbl *tp;
21 5cedca1b 2004-05-15 devnull
22 5cedca1b 2004-05-15 devnull begin:
23 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ' || c == '\n' || c == '\t')
24 5cedca1b 2004-05-15 devnull ;
25 5cedca1b 2004-05-15 devnull yylval = c;
26 5cedca1b 2004-05-15 devnull switch (c) {
27 5cedca1b 2004-05-15 devnull case EOF:
28 5cedca1b 2004-05-15 devnull ERROR "unexpected end of input inside equation" WARNING;
29 5cedca1b 2004-05-15 devnull return(EOF);
30 5cedca1b 2004-05-15 devnull case '~':
31 5cedca1b 2004-05-15 devnull return(SPACE);
32 5cedca1b 2004-05-15 devnull case '^':
33 5cedca1b 2004-05-15 devnull return(THIN);
34 5cedca1b 2004-05-15 devnull /* case '\t':
35 5cedca1b 2004-05-15 devnull return(TAB);
36 5cedca1b 2004-05-15 devnull */
37 5cedca1b 2004-05-15 devnull case '{':
38 5cedca1b 2004-05-15 devnull return('{');
39 5cedca1b 2004-05-15 devnull case '}':
40 5cedca1b 2004-05-15 devnull return('}');
41 5cedca1b 2004-05-15 devnull case '"':
42 5cedca1b 2004-05-15 devnull for (sp = 0; (c=input())!='"' && c != '\n'; ) {
43 5cedca1b 2004-05-15 devnull if (c == '\\')
44 5cedca1b 2004-05-15 devnull if ((c = input()) != '"')
45 5cedca1b 2004-05-15 devnull token[sp++] = '\\';
46 5cedca1b 2004-05-15 devnull token[sp++] = c;
47 5cedca1b 2004-05-15 devnull if (sp >= SSIZE)
48 5cedca1b 2004-05-15 devnull ERROR "quoted string %.20s... too long", token FATAL;
49 5cedca1b 2004-05-15 devnull }
50 5cedca1b 2004-05-15 devnull token[sp] = '\0';
51 5cedca1b 2004-05-15 devnull yylval = (int) &token[0];
52 5cedca1b 2004-05-15 devnull if (c == '\n')
53 5cedca1b 2004-05-15 devnull ERROR "missing \" in %.20s", token WARNING;
54 5cedca1b 2004-05-15 devnull return(QTEXT);
55 5cedca1b 2004-05-15 devnull }
56 5cedca1b 2004-05-15 devnull if (!display && c == righteq)
57 5cedca1b 2004-05-15 devnull return(EOF);
58 5cedca1b 2004-05-15 devnull
59 5cedca1b 2004-05-15 devnull unput(c);
60 5cedca1b 2004-05-15 devnull getstr(token, SSIZE);
61 5cedca1b 2004-05-15 devnull dprintf(".\tlex token = |%s|\n", token);
62 5cedca1b 2004-05-15 devnull if ((tp = lookup(deftbl, token)) != NULL) { /* defined term */
63 5cedca1b 2004-05-15 devnull c = input();
64 5cedca1b 2004-05-15 devnull unput(c);
65 5cedca1b 2004-05-15 devnull if (c == '(') /* macro with args */
66 5cedca1b 2004-05-15 devnull dodef(tp);
67 5cedca1b 2004-05-15 devnull else { /* no args */
68 5cedca1b 2004-05-15 devnull unput(' ');
69 5cedca1b 2004-05-15 devnull pbstr(tp->cval);
70 5cedca1b 2004-05-15 devnull dprintf(".\tfound %s|=%s|\n", token, tp->cval);
71 5cedca1b 2004-05-15 devnull }
72 5cedca1b 2004-05-15 devnull goto begin;
73 5cedca1b 2004-05-15 devnull }
74 5cedca1b 2004-05-15 devnull
75 5cedca1b 2004-05-15 devnull if ((tp = lookup(keytbl, token)) == NULL) /* not a keyword */
76 5cedca1b 2004-05-15 devnull return CONTIG;
77 5cedca1b 2004-05-15 devnull
78 5cedca1b 2004-05-15 devnull switch (tp->ival) { /* some kind of keyword */
79 5cedca1b 2004-05-15 devnull case DEFINE: case TDEFINE: case NDEFINE:
80 5cedca1b 2004-05-15 devnull define(tp->ival);
81 5cedca1b 2004-05-15 devnull break;
82 5cedca1b 2004-05-15 devnull case IFDEF:
83 5cedca1b 2004-05-15 devnull ifdef();
84 5cedca1b 2004-05-15 devnull break;
85 5cedca1b 2004-05-15 devnull case DELIM:
86 5cedca1b 2004-05-15 devnull delim();
87 5cedca1b 2004-05-15 devnull break;
88 5cedca1b 2004-05-15 devnull case GSIZE:
89 5cedca1b 2004-05-15 devnull globsize();
90 5cedca1b 2004-05-15 devnull break;
91 5cedca1b 2004-05-15 devnull case GFONT:
92 5cedca1b 2004-05-15 devnull globfont();
93 5cedca1b 2004-05-15 devnull break;
94 5cedca1b 2004-05-15 devnull case INCLUDE:
95 5cedca1b 2004-05-15 devnull include();
96 5cedca1b 2004-05-15 devnull break;
97 5cedca1b 2004-05-15 devnull case SPACE:
98 5cedca1b 2004-05-15 devnull space();
99 5cedca1b 2004-05-15 devnull break;
100 5cedca1b 2004-05-15 devnull case DOTEQ:
101 5cedca1b 2004-05-15 devnull /* .EQ inside equation -- should warn if at bottom level */
102 5cedca1b 2004-05-15 devnull break;
103 5cedca1b 2004-05-15 devnull case DOTEN:
104 5cedca1b 2004-05-15 devnull if (curfile == infile)
105 5cedca1b 2004-05-15 devnull return EOF;
106 5cedca1b 2004-05-15 devnull /* else ignore nested .EN */
107 5cedca1b 2004-05-15 devnull break;
108 5cedca1b 2004-05-15 devnull default:
109 5cedca1b 2004-05-15 devnull return tp->ival;
110 5cedca1b 2004-05-15 devnull }
111 5cedca1b 2004-05-15 devnull goto begin;
112 5cedca1b 2004-05-15 devnull }
113 5cedca1b 2004-05-15 devnull
114 5cedca1b 2004-05-15 devnull void getstr(char *s, int n)
115 5cedca1b 2004-05-15 devnull {
116 5cedca1b 2004-05-15 devnull register int c;
117 5cedca1b 2004-05-15 devnull register char *p;
118 5cedca1b 2004-05-15 devnull
119 5cedca1b 2004-05-15 devnull p = s;
120 5cedca1b 2004-05-15 devnull while ((c = input()) == ' ' || c == '\n')
121 5cedca1b 2004-05-15 devnull ;
122 5cedca1b 2004-05-15 devnull if (c == EOF) {
123 5cedca1b 2004-05-15 devnull *s = 0;
124 5cedca1b 2004-05-15 devnull return;
125 5cedca1b 2004-05-15 devnull }
126 5cedca1b 2004-05-15 devnull while (c != ' ' && c != '\t' && c != '\n' && c != '{' && c != '}'
127 5cedca1b 2004-05-15 devnull && c != '"' && c != '~' && c != '^') {
128 5cedca1b 2004-05-15 devnull if (!display && c == righteq)
129 5cedca1b 2004-05-15 devnull break;
130 5cedca1b 2004-05-15 devnull if (c == '(' && p > s) { /* might be defined(...) */
131 5cedca1b 2004-05-15 devnull *p = '\0';
132 5cedca1b 2004-05-15 devnull if (lookup(deftbl, s) != NULL)
133 5cedca1b 2004-05-15 devnull break;
134 5cedca1b 2004-05-15 devnull }
135 5cedca1b 2004-05-15 devnull if (c == '\\')
136 5cedca1b 2004-05-15 devnull if ((c = input()) != '"')
137 5cedca1b 2004-05-15 devnull *p++ = '\\';
138 5cedca1b 2004-05-15 devnull *p++ = c;
139 5cedca1b 2004-05-15 devnull if (--n <= 0)
140 5cedca1b 2004-05-15 devnull ERROR "token %.20s... too long", s FATAL;
141 5cedca1b 2004-05-15 devnull c = input();
142 5cedca1b 2004-05-15 devnull }
143 5cedca1b 2004-05-15 devnull unput(c);
144 5cedca1b 2004-05-15 devnull *p = '\0';
145 5cedca1b 2004-05-15 devnull yylval = (int) s;
146 5cedca1b 2004-05-15 devnull }
147 5cedca1b 2004-05-15 devnull
148 b237df90 2004-05-16 devnull int
149 5cedca1b 2004-05-15 devnull cstr(char *s, int quote, int maxs)
150 5cedca1b 2004-05-15 devnull {
151 5cedca1b 2004-05-15 devnull int del, c, i;
152 5cedca1b 2004-05-15 devnull
153 5cedca1b 2004-05-15 devnull s[0] = 0;
154 5cedca1b 2004-05-15 devnull while ((del=input()) == ' ' || del == '\t')
155 5cedca1b 2004-05-15 devnull ;
156 5cedca1b 2004-05-15 devnull if (quote)
157 5cedca1b 2004-05-15 devnull for (i=0; (c=input()) != del && c != EOF;) {
158 5cedca1b 2004-05-15 devnull s[i++] = c;
159 5cedca1b 2004-05-15 devnull if (i >= maxs)
160 5cedca1b 2004-05-15 devnull return(1); /* disaster */
161 5cedca1b 2004-05-15 devnull }
162 5cedca1b 2004-05-15 devnull else {
163 5cedca1b 2004-05-15 devnull if (del == '\n')
164 5cedca1b 2004-05-15 devnull return(1);
165 5cedca1b 2004-05-15 devnull s[0] = del;
166 5cedca1b 2004-05-15 devnull for (i=1; (c=input())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) {
167 5cedca1b 2004-05-15 devnull s[i++] = c;
168 5cedca1b 2004-05-15 devnull if (i >= maxs)
169 5cedca1b 2004-05-15 devnull return(1); /* disaster */
170 5cedca1b 2004-05-15 devnull }
171 5cedca1b 2004-05-15 devnull }
172 5cedca1b 2004-05-15 devnull s[i] = '\0';
173 5cedca1b 2004-05-15 devnull if (c == EOF)
174 5cedca1b 2004-05-15 devnull ERROR "Unexpected end of input at %.20s", s FATAL;
175 5cedca1b 2004-05-15 devnull return(0);
176 5cedca1b 2004-05-15 devnull }
177 5cedca1b 2004-05-15 devnull
178 5cedca1b 2004-05-15 devnull void define(int type)
179 5cedca1b 2004-05-15 devnull {
180 5cedca1b 2004-05-15 devnull char *p1, *p2;
181 5cedca1b 2004-05-15 devnull extern int ftune(char *, char *);
182 5cedca1b 2004-05-15 devnull
183 5cedca1b 2004-05-15 devnull getstr(token, SSIZE); /* get name */
184 5cedca1b 2004-05-15 devnull if (type != DEFINE) {
185 5cedca1b 2004-05-15 devnull cstr(token, 1, SSIZE); /* skip the definition too */
186 5cedca1b 2004-05-15 devnull return;
187 5cedca1b 2004-05-15 devnull }
188 5cedca1b 2004-05-15 devnull p1 = strsave(token);
189 5cedca1b 2004-05-15 devnull if (cstr(token, 1, SSIZE))
190 5cedca1b 2004-05-15 devnull ERROR "Unterminated definition at %.20s", token FATAL;
191 5cedca1b 2004-05-15 devnull if (lookup(ftunetbl, p1) != NULL) { /* double tuning param */
192 5cedca1b 2004-05-15 devnull dprintf(".\ttune %s %s\n", p1, token);
193 5cedca1b 2004-05-15 devnull ftune(p1, token);
194 5cedca1b 2004-05-15 devnull } else {
195 5cedca1b 2004-05-15 devnull p2 = strsave(token);
196 5cedca1b 2004-05-15 devnull install(deftbl, p1, p2, 0);
197 5cedca1b 2004-05-15 devnull dprintf(".\tname %s defined as %s\n", p1, p2);
198 5cedca1b 2004-05-15 devnull }
199 5cedca1b 2004-05-15 devnull }
200 5cedca1b 2004-05-15 devnull
201 5cedca1b 2004-05-15 devnull void ifdef(void) /* do body if name is defined */
202 5cedca1b 2004-05-15 devnull {
203 5cedca1b 2004-05-15 devnull char name[100], *p;
204 5cedca1b 2004-05-15 devnull
205 5cedca1b 2004-05-15 devnull getstr(name, sizeof(name)); /* get name */
206 5cedca1b 2004-05-15 devnull cstr(token, 1, SSIZE); /* and body */
207 5cedca1b 2004-05-15 devnull if (lookup(deftbl, name) != NULL) { /* found it */
208 5cedca1b 2004-05-15 devnull p = strsave(token);
209 5cedca1b 2004-05-15 devnull pushsrc(Free, p);
210 5cedca1b 2004-05-15 devnull pushsrc(String, p);
211 5cedca1b 2004-05-15 devnull }
212 5cedca1b 2004-05-15 devnull }
213 5cedca1b 2004-05-15 devnull
214 5cedca1b 2004-05-15 devnull char *spaceval = NULL;
215 5cedca1b 2004-05-15 devnull
216 5cedca1b 2004-05-15 devnull void space(void) /* collect line of form "space amt" to replace \x in output */
217 5cedca1b 2004-05-15 devnull {
218 5cedca1b 2004-05-15 devnull getstr(token, SSIZE);
219 5cedca1b 2004-05-15 devnull spaceval = strsave(token);
220 5cedca1b 2004-05-15 devnull dprintf(".\tsetting spaceval to %s\n", token);
221 5cedca1b 2004-05-15 devnull }
222 5cedca1b 2004-05-15 devnull
223 5cedca1b 2004-05-15 devnull char *strsave(char *s)
224 5cedca1b 2004-05-15 devnull {
225 5cedca1b 2004-05-15 devnull register char *q;
226 5cedca1b 2004-05-15 devnull
227 5cedca1b 2004-05-15 devnull q = malloc(strlen(s)+1);
228 5cedca1b 2004-05-15 devnull if (q == NULL)
229 5cedca1b 2004-05-15 devnull ERROR "out of space in strsave on %s", s FATAL;
230 5cedca1b 2004-05-15 devnull strcpy(q, s);
231 5cedca1b 2004-05-15 devnull return(q);
232 5cedca1b 2004-05-15 devnull }
233 5cedca1b 2004-05-15 devnull
234 5cedca1b 2004-05-15 devnull void include(void)
235 5cedca1b 2004-05-15 devnull {
236 5cedca1b 2004-05-15 devnull char name[100];
237 5cedca1b 2004-05-15 devnull FILE *fin;
238 5cedca1b 2004-05-15 devnull int c;
239 5cedca1b 2004-05-15 devnull extern int errno;
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 5cedca1b 2004-05-15 devnull 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 }