date and time created 83/08/05 13:34:37 by sam
[unix-history] / usr / src / old / ratfor / rio.c
CommitLineData
3d12707d
CC
1Original BTL Ratfor System for 4.2
2/* @(#)rio.c 1.1 (Berkeley) %G% */
3#include "r.h"
4char ibuf[BUFSIZ];
5char *ip = ibuf;
6
7char 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
26gtok(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
161gnbtok(s) char *s; {
162 register c;
163 while ((c = gtok(s)) == ' ' || c == '\t')
164 ;
165 return(c);
166}
167
168getfname() {
169 while (gtok(fcname) == ' ')
170 ;
171 pbstr(fcname);
172 putbak(' ');
173}
174
175peek(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
186pbstr(str)
187register 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
202getchr() {
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}