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