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