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