BSD 4 development
[unix-history] / usr / src / cmd / ratfor / rio.c
CommitLineData
44e8ed3b
BJ
1#include "r.h"
2char ibuf[BUFSIZ];
3char *ip = ibuf;
4
5char 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
24gtok(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
159gnbtok(s) char *s; {
160 register c;
161 while ((c = gtok(s)) == ' ' || c == '\t')
162 ;
163 return(c);
164}
165
166getfname() {
167 while (gtok(fcname) == ' ')
168 ;
169 pbstr(fcname);
170 putbak(' ');
171}
172
173peek(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
184pbstr(str)
185register 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
200getchr() {
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}