Commit | Line | Data |
---|---|---|
44e8ed3b BJ |
1 | #include "r.h" |
2 | char ibuf[BUFSIZ]; | |
3 | char *ip = ibuf; | |
4 | ||
5 | char type[] = { | |
6 | 0, CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, | |
7 | CRAP, '\t', '\n', CRAP, CRAP, CRAP, CRAP, CRAP, | |
8 | CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, | |
9 | CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, CRAP, | |
10 | ' ', '!', '"', '#', '$', '%', '&', '\'', | |
11 | '(', ')', '*', '+', ',', '-', '.', '/', | |
12 | DIG, DIG, DIG, DIG, DIG, DIG, DIG, DIG, | |
13 | DIG, DIG, ':', ';', '<', '=', '>', '?', | |
14 | '@', LET, LET, LET, LET, LET, LET, LET, | |
15 | LET, LET, LET, LET, LET, LET, LET, LET, | |
16 | LET, LET, LET, LET, LET, LET, LET, LET, | |
17 | LET, LET, LET, '[', '\\', ']', '^', '_', | |
18 | '`', LET, LET, LET, LET, LET, LET, LET, | |
19 | LET, LET, LET, LET, LET, LET, LET, LET, | |
20 | LET, LET, LET, LET, LET, LET, LET, LET, | |
21 | LET, LET, LET, '{', '|', '}', '~', 0, | |
22 | }; | |
23 | ||
24 | gtok(s) char *s; { /* get token into s */ | |
25 | register c, t; | |
26 | register char *p; | |
27 | struct nlist *q; | |
28 | ||
29 | for(;;) { | |
30 | p = s; | |
31 | *p++ = c = getchr(); | |
32 | switch(t = type[c]) { | |
33 | case 0: | |
34 | if (infptr > 0) { | |
35 | fclose(infile[infptr]); | |
36 | infptr--; | |
37 | continue; | |
38 | } | |
39 | if (svargc > 1) { | |
40 | svargc--; | |
41 | svargv++; | |
42 | if (infile[infptr] != stdin) | |
43 | fclose(infile[infptr]); | |
44 | if( (infile[infptr] = fopen(*svargv,"r")) == NULL ) | |
45 | cant(*svargv); | |
46 | linect[infptr] = 0; | |
47 | curfile[infptr] = *svargv; | |
48 | continue; | |
49 | } | |
50 | return(EOF); /* real eof */ | |
51 | case ' ': | |
52 | case '\t': | |
53 | while ((c = getchr()) == ' ' || c == '\t') | |
54 | ; /* skip others */ | |
55 | if (c == COMMENT || c == '_') { | |
56 | putbak(c); | |
57 | continue; | |
58 | } | |
59 | if (c != '\n') { | |
60 | putbak(c); | |
61 | *p = '\0'; | |
62 | return(' '); | |
63 | } else { | |
64 | *s = '\n'; | |
65 | *(s+1) = '\0'; | |
66 | return(*s); | |
67 | } | |
68 | case '_': | |
69 | while ((c = getchr()) == ' ' || c == '\t') | |
70 | ; | |
71 | if (c == COMMENT) { | |
72 | putbak(c); | |
73 | gtok(s); /* recursive */ | |
74 | } | |
75 | else if (c != '\n') | |
76 | putbak(c); | |
77 | continue; | |
78 | case LET: | |
79 | case DIG: | |
80 | while ((t=type[*p = getchr()]) == LET || t == DIG) | |
81 | p++; | |
82 | putbak(*p); | |
83 | *p = '\0'; | |
84 | if ((q = lookup(s))->name != NULL && q->ydef == 0) { /* found but not keyword */ | |
85 | if (q->def != fcnloc) { /* not "function" */ | |
86 | pbstr(q->def); | |
87 | continue; | |
88 | } | |
89 | getfname(); /* recursive gtok */ | |
90 | } | |
91 | for (p=s; *p; p++) | |
92 | if (*p>='A' && *p<='Z') | |
93 | *p += 'a' - 'A'; | |
94 | for (p=s; *p; p++) | |
95 | if (*p < '0' || *p > '9') | |
96 | return(LET); | |
97 | return(DIG); | |
98 | case '[': | |
99 | *p = '\0'; | |
100 | return('{'); | |
101 | case ']': | |
102 | *p = '\0'; | |
103 | return('}'); | |
104 | case '$': | |
105 | case '\\': | |
106 | if ((*p = getchr()) == '(' || *p == ')') { | |
107 | putbak(*p=='(' ? '{' : '}'); | |
108 | continue; | |
109 | } | |
110 | if (*p == '"' || *p == '\'') | |
111 | p++; | |
112 | else | |
113 | putbak(*p); | |
114 | *p = '\0'; | |
115 | return('$'); | |
116 | case COMMENT: | |
117 | comment[comptr++] = 'c'; | |
118 | while ((comment[comptr++] = getchr()) != '\n') | |
119 | ; | |
120 | flushcom(); | |
121 | *s = '\n'; | |
122 | *(s+1) = '\0'; | |
123 | return(*s); | |
124 | case '"': | |
125 | case '\'': | |
126 | for (; (*p = getchr()) != c; p++) { | |
127 | if (*p == '\\') | |
128 | *++p = getchr(); | |
129 | if (*p == '\n') { | |
130 | error("missing quote"); | |
131 | putbak('\n'); | |
132 | break; | |
133 | } | |
134 | } | |
135 | *p++ = c; | |
136 | *p = '\0'; | |
137 | return(QUOTE); | |
138 | case '%': | |
139 | while ((*p = getchr()) != '\n') | |
140 | p++; | |
141 | putbak(*p); | |
142 | *p = '\0'; | |
143 | return('%'); | |
144 | case '>': case '<': case '=': case '!': case '^': | |
145 | return(peek(p, '=')); | |
146 | case '&': | |
147 | return(peek(p, '&')); | |
148 | case '|': | |
149 | return(peek(p, '|')); | |
150 | case CRAP: | |
151 | continue; | |
152 | default: | |
153 | *p = '\0'; | |
154 | return(*s); | |
155 | } | |
156 | } | |
157 | } | |
158 | ||
159 | gnbtok(s) char *s; { | |
160 | register c; | |
161 | while ((c = gtok(s)) == ' ' || c == '\t') | |
162 | ; | |
163 | return(c); | |
164 | } | |
165 | ||
166 | getfname() { | |
167 | while (gtok(fcname) == ' ') | |
168 | ; | |
169 | pbstr(fcname); | |
170 | putbak(' '); | |
171 | } | |
172 | ||
173 | peek(p, c1) char *p, c1; { | |
174 | register c; | |
175 | c = *(p-1); | |
176 | if ((*p = getchr()) == c1) | |
177 | p++; | |
178 | else | |
179 | putbak(*p); | |
180 | *p = '\0'; | |
181 | return(c); | |
182 | } | |
183 | ||
184 | pbstr(str) | |
185 | register char *str; | |
186 | { | |
187 | register char *p; | |
188 | ||
189 | p = str; | |
190 | while (*p++); | |
191 | --p; | |
192 | if (ip >= &ibuf[BUFSIZ]) { | |
193 | error("pushback overflow"); | |
194 | exit(1); | |
195 | } | |
196 | while (p > str) | |
197 | putbak(*--p); | |
198 | } | |
199 | ||
200 | getchr() { | |
201 | register c; | |
202 | ||
203 | if (ip > ibuf) | |
204 | return(*--ip); | |
205 | c = getc(infile[infptr]); | |
206 | if (c == '\n') | |
207 | linect[infptr]++; | |
208 | if (c == EOF) | |
209 | return(0); | |
210 | return(c); | |
211 | } |