xref: /csrg-svn/old/ratfor/rio.c (revision 62208)
148064Sbostic /*-
248064Sbostic  * %sccs.include.proprietary.c%
348064Sbostic  */
448064Sbostic 
514503Ssam #ifndef lint
6*62208Sbostic static char sccsid[] = "@(#)rio.c	8.1 (Berkeley) 06/06/93";
748064Sbostic #endif /* not lint */
814503Ssam 
948064Sbostic 
109728Sclemc #include "r.h"
119728Sclemc char	ibuf[BUFSIZ];
129728Sclemc char	*ip = ibuf;
139728Sclemc 
149728Sclemc char	type[] = {
159728Sclemc 	0,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,
169728Sclemc 	CRAP,	'\t',	'\n',	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,
179728Sclemc 	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,
189728Sclemc 	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,	CRAP,
199728Sclemc 	' ',	'!',	'"',	'#',	'$',	'%',	'&',	'\'',
209728Sclemc 	'(',	')',	'*',	'+',	',',	'-',	'.',	'/',
219728Sclemc 	DIG,	DIG,	DIG,	DIG,	DIG,	DIG,	DIG,	DIG,
229728Sclemc 	DIG,	DIG,	':',	';',	'<',	'=',	'>',	'?',
239728Sclemc 	'@',	LET,	LET,	LET,	LET,	LET,	LET,	LET,
249728Sclemc 	LET,	LET,	LET,	LET,	LET,	LET,	LET,	LET,
259728Sclemc 	LET,	LET,	LET,	LET,	LET,	LET,	LET,	LET,
269728Sclemc 	LET,	LET,	LET,	'[',	'\\',	']',	'^',	'_',
279728Sclemc 	'`',	LET,	LET,	LET,	LET,	LET,	LET,	LET,
289728Sclemc 	LET,	LET,	LET,	LET,	LET,	LET,	LET,	LET,
299728Sclemc 	LET,	LET,	LET,	LET,	LET,	LET,	LET,	LET,
309728Sclemc 	LET,	LET,	LET,	'{',	'|',	'}',	'~',	0,
319728Sclemc };
329728Sclemc 
gtok(s)339728Sclemc gtok(s) char *s; {	/* get token into s */
349728Sclemc 	register c, t;
359728Sclemc 	register char *p;
369728Sclemc 	struct nlist *q;
379728Sclemc 
389728Sclemc 	for(;;) {
399728Sclemc 		p = s;
409728Sclemc 		*p++ = c = getchr();
419728Sclemc 		switch(t = type[c]) {
429728Sclemc 		case 0:
439728Sclemc 			if (infptr > 0) {
449728Sclemc 				fclose(infile[infptr]);
459728Sclemc 				infptr--;
469728Sclemc 				continue;
479728Sclemc 			}
489728Sclemc 			if (svargc > 1) {
499728Sclemc 				svargc--;
509728Sclemc 				svargv++;
519728Sclemc 				if (infile[infptr] != stdin)
529728Sclemc 					fclose(infile[infptr]);
539728Sclemc 				if( (infile[infptr] = fopen(*svargv,"r")) == NULL )
549728Sclemc 					cant(*svargv);
559728Sclemc 				linect[infptr] = 0;
569728Sclemc 				curfile[infptr] = *svargv;
579728Sclemc 				continue;
589728Sclemc 			}
599728Sclemc 			return(EOF);	/* real eof */
609728Sclemc 		case ' ':
619728Sclemc 		case '\t':
629728Sclemc 			while ((c = getchr()) == ' ' || c == '\t')
639728Sclemc 				;	/* skip others */
649728Sclemc 			if (c == COMMENT || c == '_') {
659728Sclemc 				putbak(c);
669728Sclemc 				continue;
679728Sclemc 			}
689728Sclemc 			if (c != '\n') {
699728Sclemc 				putbak(c);
709728Sclemc 				*p = '\0';
719728Sclemc 				return(' ');
729728Sclemc 			} else {
739728Sclemc 				*s = '\n';
749728Sclemc 				*(s+1) = '\0';
759728Sclemc 				return(*s);
769728Sclemc 			}
779728Sclemc 		case '_':
789728Sclemc 			while ((c = getchr()) == ' ' || c == '\t')
799728Sclemc 				;
809728Sclemc 			if (c == COMMENT) {
819728Sclemc 				putbak(c);
829728Sclemc 				gtok(s);	/* recursive */
839728Sclemc 			}
849728Sclemc 			else if (c != '\n')
859728Sclemc 				putbak(c);
869728Sclemc 			continue;
879728Sclemc 		case LET:
889728Sclemc 		case DIG:
899728Sclemc 			while ((t=type[*p = getchr()]) == LET || t == DIG)
909728Sclemc 				p++;
919728Sclemc 			putbak(*p);
929728Sclemc 			*p = '\0';
939728Sclemc 			if ((q = lookup(s))->name != NULL && q->ydef == 0) {	/* found but not keyword */
949728Sclemc 				if (q->def != fcnloc) {	/* not "function" */
959728Sclemc 					pbstr(q->def);
969728Sclemc 					continue;
979728Sclemc 				}
989728Sclemc 				getfname();	/* recursive gtok */
999728Sclemc 			}
1009728Sclemc 			for (p=s; *p; p++)
1019728Sclemc 				if (*p>='A' && *p<='Z')
1029728Sclemc 					*p += 'a' - 'A';
1039728Sclemc 			for (p=s; *p; p++)
1049728Sclemc 				if (*p < '0' || *p > '9')
1059728Sclemc 					return(LET);
1069728Sclemc 			return(DIG);
1079728Sclemc 		case '[':
1089728Sclemc 			*p = '\0';
1099728Sclemc 			return('{');
1109728Sclemc 		case ']':
1119728Sclemc 			*p = '\0';
1129728Sclemc 			return('}');
1139728Sclemc 		case '$':
1149728Sclemc 		case '\\':
1159728Sclemc 			if ((*p = getchr()) == '(' || *p == ')') {
1169728Sclemc 				putbak(*p=='(' ? '{' : '}');
1179728Sclemc 				continue;
1189728Sclemc 			}
1199728Sclemc 			if (*p == '"' || *p == '\'')
1209728Sclemc 				p++;
1219728Sclemc 			else
1229728Sclemc 				putbak(*p);
1239728Sclemc 			*p = '\0';
1249728Sclemc 			return('$');
1259728Sclemc 		case COMMENT:
1269728Sclemc 			comment[comptr++] = 'c';
1279728Sclemc 			while ((comment[comptr++] = getchr()) != '\n')
1289728Sclemc 				;
1299728Sclemc 			flushcom();
1309728Sclemc 			*s = '\n';
1319728Sclemc 			*(s+1) = '\0';
1329728Sclemc 			return(*s);
1339728Sclemc 		case '"':
1349728Sclemc 		case '\'':
1359728Sclemc 			for (; (*p = getchr()) != c; p++) {
1369728Sclemc 				if (*p == '\\')
1379728Sclemc 					*++p = getchr();
1389728Sclemc 				if (*p == '\n') {
1399728Sclemc 					error("missing quote");
1409728Sclemc 					putbak('\n');
1419728Sclemc 					break;
1429728Sclemc 				}
1439728Sclemc 			}
1449728Sclemc 			*p++ = c;
1459728Sclemc 			*p = '\0';
1469728Sclemc 			return(QUOTE);
1479728Sclemc 		case '%':
1489728Sclemc 			while ((*p = getchr()) != '\n')
1499728Sclemc 				p++;
1509728Sclemc 			putbak(*p);
1519728Sclemc 			*p = '\0';
1529728Sclemc 			return('%');
1539728Sclemc 		case '>': case '<': case '=': case '!': case '^':
1549728Sclemc 			return(peek(p, '='));
1559728Sclemc 		case '&':
1569728Sclemc 			return(peek(p, '&'));
1579728Sclemc 		case '|':
1589728Sclemc 			return(peek(p, '|'));
1599728Sclemc 		case CRAP:
1609728Sclemc 			continue;
1619728Sclemc 		default:
1629728Sclemc 			*p = '\0';
1639728Sclemc 			return(*s);
1649728Sclemc 		}
1659728Sclemc 	}
1669728Sclemc }
1679728Sclemc 
gnbtok(s)1689728Sclemc gnbtok(s) char *s; {
1699728Sclemc 	register c;
1709728Sclemc 	while ((c = gtok(s)) == ' ' || c == '\t')
1719728Sclemc 		;
1729728Sclemc 	return(c);
1739728Sclemc }
1749728Sclemc 
getfname()1759728Sclemc getfname() {
1769728Sclemc 	while (gtok(fcname) == ' ')
1779728Sclemc 		;
1789728Sclemc 	pbstr(fcname);
1799728Sclemc 	putbak(' ');
1809728Sclemc }
1819728Sclemc 
peek(p,c1)1829728Sclemc peek(p, c1) char *p, c1; {
1839728Sclemc 	register c;
1849728Sclemc 	c = *(p-1);
1859728Sclemc 	if ((*p = getchr()) == c1)
1869728Sclemc 		p++;
1879728Sclemc 	else
1889728Sclemc 		putbak(*p);
1899728Sclemc 	*p = '\0';
1909728Sclemc 	return(c);
1919728Sclemc }
1929728Sclemc 
pbstr(str)1939728Sclemc pbstr(str)
1949728Sclemc register char *str;
1959728Sclemc {
1969728Sclemc 	register char *p;
1979728Sclemc 
1989728Sclemc 	p = str;
1999728Sclemc 	while (*p++);
2009728Sclemc 	--p;
2019728Sclemc 	if (ip >= &ibuf[BUFSIZ]) {
2029728Sclemc 		error("pushback overflow");
2039728Sclemc 		exit(1);
2049728Sclemc 	}
2059728Sclemc 	while (p > str)
2069728Sclemc 		putbak(*--p);
2079728Sclemc }
2089728Sclemc 
getchr()2099728Sclemc getchr() {
2109728Sclemc 	register c;
2119728Sclemc 
2129728Sclemc 	if (ip > ibuf)
2139728Sclemc 		return(*--ip);
2149728Sclemc 	c = getc(infile[infptr]);
2159728Sclemc 	if (c == '\n')
2169728Sclemc 		linect[infptr]++;
2179728Sclemc 	if (c == EOF)
2189728Sclemc 		return(0);
2199728Sclemc 	return(c);
2209728Sclemc }
221