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