|
|
1.1 ! root 1: /* C compiler: input processing */ ! 2: ! 3: #include "c.h" ! 4: ! 5: unsigned char *cp; /* current input character */ ! 6: char *file; /* current input file name */ ! 7: char *firstfile; /* first input file */ ! 8: unsigned char *limit; /* points to last character + 1 */ ! 9: char *line; /* current line */ ! 10: int lineno; /* line number of current line */ ! 11: ! 12: static int infd; /* input file descriptor */ ! 13: static int bsize; /* number of chars in last read */ ! 14: static unsigned char buffer[MAXLINE+1 + BUFSIZE+1]; /* input buffer */ ! 15: ! 16: dclproto(static void pragma,(void)); ! 17: dclproto(static void resynch,(void)); ! 18: ! 19: /* inputInit - initialize input processing */ ! 20: void inputInit(fd) { ! 21: limit = cp = &buffer[MAXLINE + 1]; ! 22: lineno = 0; ! 23: file = 0; /* omit */ ! 24: bsize = -1; ! 25: infd = fd; ! 26: nextline(); ! 27: } ! 28: ! 29: /* inputstring - arrange to read str as next input */ ! 30: void inputstring(str) char *str; { ! 31: limit = cp = &buffer[MAXLINE+1]; ! 32: while (*limit++ = *str++) ! 33: ; ! 34: *limit = '\n'; ! 35: bsize = 0; ! 36: } ! 37: ! 38: /* fillbuf - fill the input buffer, moving tail portion if necessary */ ! 39: void fillbuf() { ! 40: if (bsize == 0) ! 41: return; ! 42: if (limit <= cp) ! 43: cp = &buffer[MAXLINE + 1]; ! 44: else { /* move tail portion */ ! 45: int n = limit - cp; ! 46: unsigned char *s = &buffer[MAXLINE + 1] - n; ! 47: assert(s >= buffer); ! 48: line = (char *)s - ((char *)cp - line); ! 49: while (cp < limit) ! 50: *s++ = *cp++; ! 51: cp = &buffer[MAXLINE + 1] - n; ! 52: } ! 53: bsize = read(infd, (char *)&buffer[MAXLINE + 1], BUFSIZE); ! 54: assert(bsize >= 0); ! 55: limit = &buffer[MAXLINE + 1 + bsize]; ! 56: *limit = '\n'; ! 57: } ! 58: ! 59: /* nextline - prepare to read next line */ ! 60: void nextline() { ! 61: if (cp >= limit) { /* refill buffer */ ! 62: fillbuf(); ! 63: if (cp >= limit) { /* signal end of file */ ! 64: cp = limit = &buffer[MAXLINE+1]; ! 65: *limit = '\0'; ! 66: } ! 67: if (lineno > 0) ! 68: return; ! 69: } ! 70: lineno++; ! 71: for (line = (char *)cp; *cp == ' ' || *cp == '\t'; cp++) ! 72: ; ! 73: if (*cp == '#') { /* omit */ ! 74: resynch(); /* omit */ ! 75: nextline(); /* omit */ ! 76: } /* omit */ ! 77: } ! 78: ! 79: /* pragma - handle #pragma ref id... */ ! 80: static void pragma() { ! 81: if ((t = gettok()) == ID && strcmp(token, "ref") == 0) ! 82: for (;;) { ! 83: while (*cp == ' ' || *cp == '\t') ! 84: cp++; ! 85: if (*cp == '\n' || *cp == 0) ! 86: break; ! 87: if ((t = gettok()) == ID && tsym) { ! 88: tsym->ref++; ! 89: use(tsym, src); ! 90: } ! 91: } ! 92: } ! 93: ! 94: /* resynch - set line number/file name in # n [ "file" ] and #pragma ... */ ! 95: static void resynch() { ! 96: for (cp++; *cp == ' ' || *cp == '\t'; ) ! 97: cp++; ! 98: if (limit - cp < MAXLINE) ! 99: fillbuf(); ! 100: if (strncmp((char *)cp, "pragma", 6) == 0) { ! 101: cp += 6; ! 102: pragma(); ! 103: } else if (*cp >= '0' && *cp <= '9') { ! 104: line: for (lineno = 0; *cp >= '0' && *cp <= '9'; ) ! 105: lineno = 10*lineno + *cp++ - '0'; ! 106: lineno--; ! 107: while (*cp == ' ' || *cp == '\t') ! 108: cp++; ! 109: if (*cp == '"') { ! 110: file = (char *)++cp; ! 111: while (*cp && *cp != '"' && *cp != '\n') ! 112: cp++; ! 113: file = stringn(file, (char *)cp - file); ! 114: if (*cp == '\n') ! 115: warning("missing \" in preprocessor line\n"); ! 116: if (firstfile == 0) ! 117: firstfile = file; ! 118: } ! 119: } else if (strncmp((char *)cp, "line", 4) == 0) { ! 120: for (cp += 4; *cp == ' ' || *cp == '\t'; ) ! 121: cp++; ! 122: if (*cp >= '0' && *cp <= '9') ! 123: goto line; ! 124: if (Aflag >= 2) ! 125: warning("unrecognized control line\n"); ! 126: } else if (Aflag >= 2 && *cp != '\n') ! 127: warning("unrecognized control line\n"); ! 128: while (*cp) ! 129: if (*cp++ == '\n') ! 130: if (cp == limit + 1) ! 131: nextline(); ! 132: else ! 133: break; ! 134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.