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