|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.