Blame


1 f08fdedc 2003-11-23 devnull #include "rc.h"
2 f08fdedc 2003-11-23 devnull #include "exec.h"
3 f08fdedc 2003-11-23 devnull #include "io.h"
4 f08fdedc 2003-11-23 devnull #include "getflags.h"
5 f08fdedc 2003-11-23 devnull #include "fns.h"
6 f08fdedc 2003-11-23 devnull int getnext(void);
7 c8f53842 2007-03-26 devnull
8 c8f53842 2007-03-26 devnull int
9 c8f53842 2007-03-26 devnull wordchr(int c)
10 f08fdedc 2003-11-23 devnull {
11 f08fdedc 2003-11-23 devnull return !strchr("\n \t#;&|^$=`'{}()<>", c) && c!=EOF;
12 f08fdedc 2003-11-23 devnull }
13 c8f53842 2007-03-26 devnull
14 c8f53842 2007-03-26 devnull int
15 c8f53842 2007-03-26 devnull idchr(int c)
16 f08fdedc 2003-11-23 devnull {
17 f08fdedc 2003-11-23 devnull /*
18 f08fdedc 2003-11-23 devnull * Formerly:
19 f08fdedc 2003-11-23 devnull * return 'a'<=c && c<='z' || 'A'<=c && c<='Z' || '0'<=c && c<='9'
20 f08fdedc 2003-11-23 devnull * || c=='_' || c=='*';
21 f08fdedc 2003-11-23 devnull */
22 f08fdedc 2003-11-23 devnull return c>' ' && !strchr("!\"#$%&'()+,-./:;<=>?@[\\]^`{|}~", c);
23 f08fdedc 2003-11-23 devnull }
24 c8f53842 2007-03-26 devnull int future = EOF;
25 c8f53842 2007-03-26 devnull int doprompt = 1;
26 f08fdedc 2003-11-23 devnull int inquote;
27 c8f53842 2007-03-26 devnull int incomm;
28 f08fdedc 2003-11-23 devnull /*
29 f08fdedc 2003-11-23 devnull * Look ahead in the input stream
30 f08fdedc 2003-11-23 devnull */
31 c8f53842 2007-03-26 devnull
32 c8f53842 2007-03-26 devnull int
33 c8f53842 2007-03-26 devnull nextc(void)
34 c8f53842 2007-03-26 devnull {
35 c8f53842 2007-03-26 devnull if(future==EOF)
36 c8f53842 2007-03-26 devnull future = getnext();
37 f08fdedc 2003-11-23 devnull return future;
38 f08fdedc 2003-11-23 devnull }
39 f08fdedc 2003-11-23 devnull /*
40 f08fdedc 2003-11-23 devnull * Consume the lookahead character.
41 f08fdedc 2003-11-23 devnull */
42 c8f53842 2007-03-26 devnull
43 c8f53842 2007-03-26 devnull int
44 c8f53842 2007-03-26 devnull advance(void)
45 c8f53842 2007-03-26 devnull {
46 c8f53842 2007-03-26 devnull int c = nextc();
47 c8f53842 2007-03-26 devnull lastc = future;
48 c8f53842 2007-03-26 devnull future = EOF;
49 f08fdedc 2003-11-23 devnull return c;
50 f08fdedc 2003-11-23 devnull }
51 f08fdedc 2003-11-23 devnull /*
52 f08fdedc 2003-11-23 devnull * read a character from the input stream
53 fa325e9b 2020-01-10 cross */
54 c8f53842 2007-03-26 devnull
55 c8f53842 2007-03-26 devnull int
56 c8f53842 2007-03-26 devnull getnext(void)
57 c8f53842 2007-03-26 devnull {
58 c8f53842 2007-03-26 devnull int c;
59 c8f53842 2007-03-26 devnull static int peekc = EOF;
60 f08fdedc 2003-11-23 devnull if(peekc!=EOF){
61 c8f53842 2007-03-26 devnull c = peekc;
62 c8f53842 2007-03-26 devnull peekc = EOF;
63 f08fdedc 2003-11-23 devnull return c;
64 f08fdedc 2003-11-23 devnull }
65 c8f53842 2007-03-26 devnull if(runq->eof)
66 c8f53842 2007-03-26 devnull return EOF;
67 c8f53842 2007-03-26 devnull if(doprompt)
68 c8f53842 2007-03-26 devnull pprompt();
69 c8f53842 2007-03-26 devnull c = rchr(runq->cmdfd);
70 f08fdedc 2003-11-23 devnull if(!inquote && c=='\\'){
71 c8f53842 2007-03-26 devnull c = rchr(runq->cmdfd);
72 c8f53842 2007-03-26 devnull if(c=='\n' && !incomm){ /* don't continue a comment */
73 c8f53842 2007-03-26 devnull doprompt = 1;
74 f08fdedc 2003-11-23 devnull c=' ';
75 f08fdedc 2003-11-23 devnull }
76 f08fdedc 2003-11-23 devnull else{
77 c8f53842 2007-03-26 devnull peekc = c;
78 f08fdedc 2003-11-23 devnull c='\\';
79 f08fdedc 2003-11-23 devnull }
80 f08fdedc 2003-11-23 devnull }
81 c8f53842 2007-03-26 devnull doprompt = doprompt || c=='\n' || c==EOF;
82 c8f53842 2007-03-26 devnull if(c==EOF)
83 c8f53842 2007-03-26 devnull runq->eof++;
84 f08fdedc 2003-11-23 devnull else if(flag['V'] || ndot>=2 && flag['v']) pchr(err, c);
85 f08fdedc 2003-11-23 devnull return c;
86 f08fdedc 2003-11-23 devnull }
87 c8f53842 2007-03-26 devnull
88 c8f53842 2007-03-26 devnull void
89 c8f53842 2007-03-26 devnull pprompt(void)
90 c8f53842 2007-03-26 devnull {
91 f08fdedc 2003-11-23 devnull var *prompt;
92 f08fdedc 2003-11-23 devnull if(runq->iflag){
93 f08fdedc 2003-11-23 devnull pstr(err, promptstr);
94 f08fdedc 2003-11-23 devnull flush(err);
95 c8f53842 2007-03-26 devnull prompt = vlook("prompt");
96 f08fdedc 2003-11-23 devnull if(prompt->val && prompt->val->next)
97 c8f53842 2007-03-26 devnull promptstr = prompt->val->next->word;
98 f08fdedc 2003-11-23 devnull else
99 f08fdedc 2003-11-23 devnull promptstr="\t";
100 f08fdedc 2003-11-23 devnull }
101 f08fdedc 2003-11-23 devnull runq->lineno++;
102 c8f53842 2007-03-26 devnull doprompt = 0;
103 f08fdedc 2003-11-23 devnull }
104 c8f53842 2007-03-26 devnull
105 3caf5c23 2020-05-05 rsc int
106 c8f53842 2007-03-26 devnull skipwhite(void)
107 c8f53842 2007-03-26 devnull {
108 3caf5c23 2020-05-05 rsc int c, skipped;
109 3caf5c23 2020-05-05 rsc skipped = 0;
110 f08fdedc 2003-11-23 devnull for(;;){
111 c8f53842 2007-03-26 devnull c = nextc();
112 c8f53842 2007-03-26 devnull /* Why did this used to be if(!inquote && c=='#') ?? */
113 c8f53842 2007-03-26 devnull if(c=='#'){
114 c8f53842 2007-03-26 devnull incomm = 1;
115 3caf5c23 2020-05-05 rsc skipped = 1;
116 f08fdedc 2003-11-23 devnull for(;;){
117 c8f53842 2007-03-26 devnull c = nextc();
118 c8f53842 2007-03-26 devnull if(c=='\n' || c==EOF) {
119 c8f53842 2007-03-26 devnull incomm = 0;
120 c8f53842 2007-03-26 devnull break;
121 c8f53842 2007-03-26 devnull }
122 f08fdedc 2003-11-23 devnull advance();
123 f08fdedc 2003-11-23 devnull }
124 f08fdedc 2003-11-23 devnull }
125 3caf5c23 2020-05-05 rsc if(c==' ' || c=='\t') {
126 3caf5c23 2020-05-05 rsc skipped = 1;
127 c8f53842 2007-03-26 devnull advance();
128 3caf5c23 2020-05-05 rsc }
129 3caf5c23 2020-05-05 rsc else
130 3caf5c23 2020-05-05 rsc return skipped;
131 f08fdedc 2003-11-23 devnull }
132 f08fdedc 2003-11-23 devnull }
133 c8f53842 2007-03-26 devnull
134 c8f53842 2007-03-26 devnull void
135 c8f53842 2007-03-26 devnull skipnl(void)
136 c8f53842 2007-03-26 devnull {
137 c8f53842 2007-03-26 devnull int c;
138 f08fdedc 2003-11-23 devnull for(;;){
139 f08fdedc 2003-11-23 devnull skipwhite();
140 c8f53842 2007-03-26 devnull c = nextc();
141 c8f53842 2007-03-26 devnull if(c!='\n')
142 c8f53842 2007-03-26 devnull return;
143 f08fdedc 2003-11-23 devnull advance();
144 f08fdedc 2003-11-23 devnull }
145 f08fdedc 2003-11-23 devnull }
146 c8f53842 2007-03-26 devnull
147 c8f53842 2007-03-26 devnull int
148 c8f53842 2007-03-26 devnull nextis(int c)
149 c8f53842 2007-03-26 devnull {
150 f08fdedc 2003-11-23 devnull if(nextc()==c){
151 f08fdedc 2003-11-23 devnull advance();
152 f08fdedc 2003-11-23 devnull return 1;
153 f08fdedc 2003-11-23 devnull }
154 f08fdedc 2003-11-23 devnull return 0;
155 f08fdedc 2003-11-23 devnull }
156 c8f53842 2007-03-26 devnull
157 c8f53842 2007-03-26 devnull char*
158 c8f53842 2007-03-26 devnull addtok(char *p, int val)
159 c8f53842 2007-03-26 devnull {
160 c8f53842 2007-03-26 devnull if(p==0)
161 c8f53842 2007-03-26 devnull return 0;
162 17157e4a 2006-03-20 devnull if(p==&tok[NTOK-1]){
163 c8f53842 2007-03-26 devnull *p = 0;
164 f08fdedc 2003-11-23 devnull yyerror("token buffer too short");
165 f08fdedc 2003-11-23 devnull return 0;
166 f08fdedc 2003-11-23 devnull }
167 f08fdedc 2003-11-23 devnull *p++=val;
168 f08fdedc 2003-11-23 devnull return p;
169 f08fdedc 2003-11-23 devnull }
170 c8f53842 2007-03-26 devnull
171 c8f53842 2007-03-26 devnull char*
172 c8f53842 2007-03-26 devnull addutf(char *p, int c)
173 c8f53842 2007-03-26 devnull {
174 c8f53842 2007-03-26 devnull p = addtok(p, c);
175 f08fdedc 2003-11-23 devnull if(twobyte(c)) /* 2-byte escape */
176 f08fdedc 2003-11-23 devnull return addtok(p, advance());
177 f08fdedc 2003-11-23 devnull if(threebyte(c)){ /* 3-byte escape */
178 c8f53842 2007-03-26 devnull p = addtok(p, advance());
179 f08fdedc 2003-11-23 devnull return addtok(p, advance());
180 f08fdedc 2003-11-23 devnull }
181 0786c964 2011-01-02 rsc if(fourbyte(c)){ /* 4-byte escape */
182 0786c964 2011-01-02 rsc p = addtok(p, advance());
183 0786c964 2011-01-02 rsc p = addtok(p, advance());
184 0786c964 2011-01-02 rsc return addtok(p, advance());
185 0786c964 2011-01-02 rsc }
186 f08fdedc 2003-11-23 devnull return p;
187 f08fdedc 2003-11-23 devnull }
188 f08fdedc 2003-11-23 devnull int lastdol; /* was the last token read '$' or '$#' or '"'? */
189 f08fdedc 2003-11-23 devnull int lastword; /* was the last token read a word or compound word terminator? */
190 c8f53842 2007-03-26 devnull
191 c8f53842 2007-03-26 devnull int
192 c8f53842 2007-03-26 devnull yylex(void)
193 c8f53842 2007-03-26 devnull {
194 c8f53842 2007-03-26 devnull int c, d = nextc();
195 c8f53842 2007-03-26 devnull char *w = tok;
196 47d4646e 2020-05-05 rsc tree *t;
197 c8f53842 2007-03-26 devnull yylval.tree = 0;
198 f08fdedc 2003-11-23 devnull /*
199 f08fdedc 2003-11-23 devnull * Embarassing sneakiness: if the last token read was a quoted or unquoted
200 f08fdedc 2003-11-23 devnull * WORD then we alter the meaning of what follows. If the next character
201 f08fdedc 2003-11-23 devnull * is `(', we return SUB (a subscript paren) and consume the `('. Otherwise,
202 f08fdedc 2003-11-23 devnull * if the next character is the first character of a simple or compound word,
203 f08fdedc 2003-11-23 devnull * we insert a `^' before it.
204 f08fdedc 2003-11-23 devnull */
205 7d6a248f 2020-05-05 rsc if(lastword && flag['Y']){
206 c8f53842 2007-03-26 devnull lastword = 0;
207 f08fdedc 2003-11-23 devnull if(d=='('){
208 f08fdedc 2003-11-23 devnull advance();
209 601e07b6 2020-05-05 rsc strcpy(tok, "(");
210 f08fdedc 2003-11-23 devnull return SUB;
211 f08fdedc 2003-11-23 devnull }
212 f08fdedc 2003-11-23 devnull if(wordchr(d) || d=='\'' || d=='`' || d=='$' || d=='"'){
213 f08fdedc 2003-11-23 devnull strcpy(tok, "^");
214 f08fdedc 2003-11-23 devnull return '^';
215 f08fdedc 2003-11-23 devnull }
216 f08fdedc 2003-11-23 devnull }
217 c8f53842 2007-03-26 devnull inquote = 0;
218 7d6a248f 2020-05-05 rsc if(skipwhite() && !flag['Y'])
219 7d6a248f 2020-05-05 rsc return ' ';
220 c8f53842 2007-03-26 devnull switch(c = advance()){
221 f08fdedc 2003-11-23 devnull case EOF:
222 c8f53842 2007-03-26 devnull lastdol = 0;
223 f08fdedc 2003-11-23 devnull strcpy(tok, "EOF");
224 f08fdedc 2003-11-23 devnull return EOF;
225 f08fdedc 2003-11-23 devnull case '$':
226 c8f53842 2007-03-26 devnull lastdol = 1;
227 f08fdedc 2003-11-23 devnull if(nextis('#')){
228 f08fdedc 2003-11-23 devnull strcpy(tok, "$#");
229 f08fdedc 2003-11-23 devnull return COUNT;
230 f08fdedc 2003-11-23 devnull }
231 f08fdedc 2003-11-23 devnull if(nextis('"')){
232 f08fdedc 2003-11-23 devnull strcpy(tok, "$\"");
233 f08fdedc 2003-11-23 devnull return '"';
234 f08fdedc 2003-11-23 devnull }
235 f08fdedc 2003-11-23 devnull strcpy(tok, "$");
236 f08fdedc 2003-11-23 devnull return '$';
237 f08fdedc 2003-11-23 devnull case '&':
238 c8f53842 2007-03-26 devnull lastdol = 0;
239 f08fdedc 2003-11-23 devnull if(nextis('&')){
240 3caf5c23 2020-05-05 rsc if(flag['Y'])
241 3caf5c23 2020-05-05 rsc skipnl();
242 f08fdedc 2003-11-23 devnull strcpy(tok, "&&");
243 f08fdedc 2003-11-23 devnull return ANDAND;
244 f08fdedc 2003-11-23 devnull }
245 f08fdedc 2003-11-23 devnull strcpy(tok, "&");
246 f08fdedc 2003-11-23 devnull return '&';
247 f08fdedc 2003-11-23 devnull case '|':
248 c8f53842 2007-03-26 devnull lastdol = 0;
249 f08fdedc 2003-11-23 devnull if(nextis(c)){
250 3caf5c23 2020-05-05 rsc if(flag['Y'])
251 3caf5c23 2020-05-05 rsc skipnl();
252 f08fdedc 2003-11-23 devnull strcpy(tok, "||");
253 f08fdedc 2003-11-23 devnull return OROR;
254 f08fdedc 2003-11-23 devnull }
255 f08fdedc 2003-11-23 devnull case '<':
256 f08fdedc 2003-11-23 devnull case '>':
257 c8f53842 2007-03-26 devnull lastdol = 0;
258 f08fdedc 2003-11-23 devnull /*
259 f08fdedc 2003-11-23 devnull * funny redirection tokens:
260 f08fdedc 2003-11-23 devnull * redir: arrow | arrow '[' fd ']'
261 f08fdedc 2003-11-23 devnull * arrow: '<' | '<<' | '>' | '>>' | '|'
262 f08fdedc 2003-11-23 devnull * fd: digit | digit '=' | digit '=' digit
263 f08fdedc 2003-11-23 devnull * digit: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
264 f08fdedc 2003-11-23 devnull * some possibilities are nonsensical and get a message.
265 f08fdedc 2003-11-23 devnull */
266 f08fdedc 2003-11-23 devnull *w++=c;
267 c8f53842 2007-03-26 devnull t = newtree();
268 f08fdedc 2003-11-23 devnull switch(c){
269 f08fdedc 2003-11-23 devnull case '|':
270 c8f53842 2007-03-26 devnull t->type = PIPE;
271 c8f53842 2007-03-26 devnull t->fd0 = 1;
272 c8f53842 2007-03-26 devnull t->fd1 = 0;
273 f08fdedc 2003-11-23 devnull break;
274 f08fdedc 2003-11-23 devnull case '>':
275 c8f53842 2007-03-26 devnull t->type = REDIR;
276 f08fdedc 2003-11-23 devnull if(nextis(c)){
277 c8f53842 2007-03-26 devnull t->rtype = APPEND;
278 f08fdedc 2003-11-23 devnull *w++=c;
279 f08fdedc 2003-11-23 devnull }
280 c8f53842 2007-03-26 devnull else t->rtype = WRITE;
281 c8f53842 2007-03-26 devnull t->fd0 = 1;
282 f08fdedc 2003-11-23 devnull break;
283 f08fdedc 2003-11-23 devnull case '<':
284 c8f53842 2007-03-26 devnull t->type = REDIR;
285 f08fdedc 2003-11-23 devnull if(nextis(c)){
286 c8f53842 2007-03-26 devnull t->rtype = HERE;
287 f08fdedc 2003-11-23 devnull *w++=c;
288 c8f53842 2007-03-26 devnull } else if (nextis('>')){
289 c8f53842 2007-03-26 devnull t->rtype = RDWR;
290 c8f53842 2007-03-26 devnull *w++=c;
291 c8f53842 2007-03-26 devnull } else t->rtype = READ;
292 c8f53842 2007-03-26 devnull t->fd0 = 0;
293 f08fdedc 2003-11-23 devnull break;
294 f08fdedc 2003-11-23 devnull }
295 f08fdedc 2003-11-23 devnull if(nextis('[')){
296 f08fdedc 2003-11-23 devnull *w++='[';
297 c8f53842 2007-03-26 devnull c = advance();
298 c8f53842 2007-03-26 devnull *w++=c;
299 f08fdedc 2003-11-23 devnull if(c<'0' || '9'<c){
300 f08fdedc 2003-11-23 devnull RedirErr:
301 c8f53842 2007-03-26 devnull *w = 0;
302 f08fdedc 2003-11-23 devnull yyerror(t->type==PIPE?"pipe syntax"
303 f08fdedc 2003-11-23 devnull :"redirection syntax");
304 f08fdedc 2003-11-23 devnull return EOF;
305 f08fdedc 2003-11-23 devnull }
306 c8f53842 2007-03-26 devnull t->fd0 = 0;
307 f08fdedc 2003-11-23 devnull do{
308 c8f53842 2007-03-26 devnull t->fd0 = t->fd0*10+c-'0';
309 f08fdedc 2003-11-23 devnull *w++=c;
310 c8f53842 2007-03-26 devnull c = advance();
311 f08fdedc 2003-11-23 devnull }while('0'<=c && c<='9');
312 f08fdedc 2003-11-23 devnull if(c=='='){
313 f08fdedc 2003-11-23 devnull *w++='=';
314 c8f53842 2007-03-26 devnull if(t->type==REDIR)
315 c8f53842 2007-03-26 devnull t->type = DUP;
316 c8f53842 2007-03-26 devnull c = advance();
317 f08fdedc 2003-11-23 devnull if('0'<=c && c<='9'){
318 c8f53842 2007-03-26 devnull t->rtype = DUPFD;
319 c8f53842 2007-03-26 devnull t->fd1 = t->fd0;
320 c8f53842 2007-03-26 devnull t->fd0 = 0;
321 f08fdedc 2003-11-23 devnull do{
322 c8f53842 2007-03-26 devnull t->fd0 = t->fd0*10+c-'0';
323 f08fdedc 2003-11-23 devnull *w++=c;
324 c8f53842 2007-03-26 devnull c = advance();
325 f08fdedc 2003-11-23 devnull }while('0'<=c && c<='9');
326 f08fdedc 2003-11-23 devnull }
327 f08fdedc 2003-11-23 devnull else{
328 c8f53842 2007-03-26 devnull if(t->type==PIPE)
329 c8f53842 2007-03-26 devnull goto RedirErr;
330 c8f53842 2007-03-26 devnull t->rtype = CLOSE;
331 f08fdedc 2003-11-23 devnull }
332 f08fdedc 2003-11-23 devnull }
333 f08fdedc 2003-11-23 devnull if(c!=']'
334 f08fdedc 2003-11-23 devnull || t->type==DUP && (t->rtype==HERE || t->rtype==APPEND))
335 f08fdedc 2003-11-23 devnull goto RedirErr;
336 f08fdedc 2003-11-23 devnull *w++=']';
337 f08fdedc 2003-11-23 devnull }
338 f08fdedc 2003-11-23 devnull *w='\0';
339 c8f53842 2007-03-26 devnull yylval.tree = t;
340 3caf5c23 2020-05-05 rsc if(t->type==PIPE && flag['Y'])
341 c8f53842 2007-03-26 devnull skipnl();
342 47d4646e 2020-05-05 rsc if(t->type==REDIR) {
343 47d4646e 2020-05-05 rsc skipwhite();
344 47d4646e 2020-05-05 rsc if(nextc() == '{')
345 47d4646e 2020-05-05 rsc t->type = REDIRW;
346 47d4646e 2020-05-05 rsc }
347 f08fdedc 2003-11-23 devnull return t->type;
348 f08fdedc 2003-11-23 devnull case '\'':
349 c8f53842 2007-03-26 devnull lastdol = 0;
350 c8f53842 2007-03-26 devnull lastword = 1;
351 c8f53842 2007-03-26 devnull inquote = 1;
352 f08fdedc 2003-11-23 devnull for(;;){
353 c8f53842 2007-03-26 devnull c = advance();
354 c8f53842 2007-03-26 devnull if(c==EOF)
355 c8f53842 2007-03-26 devnull break;
356 f08fdedc 2003-11-23 devnull if(c=='\''){
357 f08fdedc 2003-11-23 devnull if(nextc()!='\'')
358 f08fdedc 2003-11-23 devnull break;
359 f08fdedc 2003-11-23 devnull advance();
360 f08fdedc 2003-11-23 devnull }
361 c8f53842 2007-03-26 devnull w = addutf(w, c);
362 f08fdedc 2003-11-23 devnull }
363 c8f53842 2007-03-26 devnull if(w!=0)
364 c8f53842 2007-03-26 devnull *w='\0';
365 c8f53842 2007-03-26 devnull t = token(tok, WORD);
366 c8f53842 2007-03-26 devnull t->quoted = 1;
367 c8f53842 2007-03-26 devnull yylval.tree = t;
368 f08fdedc 2003-11-23 devnull return t->type;
369 f08fdedc 2003-11-23 devnull }
370 f08fdedc 2003-11-23 devnull if(!wordchr(c)){
371 c8f53842 2007-03-26 devnull lastdol = 0;
372 c8f53842 2007-03-26 devnull tok[0] = c;
373 f08fdedc 2003-11-23 devnull tok[1]='\0';
374 f08fdedc 2003-11-23 devnull return c;
375 f08fdedc 2003-11-23 devnull }
376 f08fdedc 2003-11-23 devnull for(;;){
377 f08fdedc 2003-11-23 devnull /* next line should have (char)c==GLOB, but ken's compiler is broken */
378 f08fdedc 2003-11-23 devnull if(c=='*' || c=='[' || c=='?' || c==(unsigned char)GLOB)
379 c8f53842 2007-03-26 devnull w = addtok(w, GLOB);
380 c8f53842 2007-03-26 devnull w = addutf(w, c);
381 c8f53842 2007-03-26 devnull c = nextc();
382 f08fdedc 2003-11-23 devnull if(lastdol?!idchr(c):!wordchr(c)) break;
383 f08fdedc 2003-11-23 devnull advance();
384 f08fdedc 2003-11-23 devnull }
385 f08fdedc 2003-11-23 devnull
386 c8f53842 2007-03-26 devnull lastword = 1;
387 c8f53842 2007-03-26 devnull lastdol = 0;
388 c8f53842 2007-03-26 devnull if(w!=0)
389 c8f53842 2007-03-26 devnull *w='\0';
390 c8f53842 2007-03-26 devnull t = klook(tok);
391 c8f53842 2007-03-26 devnull if(t->type!=WORD)
392 c8f53842 2007-03-26 devnull lastword = 0;
393 c8f53842 2007-03-26 devnull t->quoted = 0;
394 c8f53842 2007-03-26 devnull yylval.tree = t;
395 f08fdedc 2003-11-23 devnull return t->type;
396 f08fdedc 2003-11-23 devnull }