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