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