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