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