00001 #include "c.h"
00002
00003
00004 static void pragma(void);
00005 static void resynch(void);
00006
00007 static int bsize;
00008 static unsigned char buffer[MAXLINE+1 + BUFSIZE+1];
00009 unsigned char *cp;
00010 char *file;
00011 char *firstfile;
00012 unsigned char *limit;
00013 char *line;
00014 int lineno;
00015
00016 void nextline(void) {
00017 do {
00018 if (cp >= limit) {
00019 fillbuf();
00020 if (cp >= limit)
00021 cp = limit;
00022 if (cp == limit)
00023 return;
00024 } else {
00025 lineno++;
00026 for (line = (char *)cp; *cp==' ' || *cp=='\t'; cp++)
00027 ;
00028 if (*cp == '#') {
00029 resynch();
00030 nextline();
00031 }
00032 }
00033 } while (*cp == '\n' && cp == limit);
00034 }
00035 void fillbuf(void) {
00036 if (bsize == 0)
00037 return;
00038 if (cp >= limit)
00039 cp = &buffer[MAXLINE+1];
00040 else
00041 {
00042 int n = limit - cp;
00043 unsigned char *s = &buffer[MAXLINE+1] - n;
00044 assert(s >= buffer);
00045 line = (char *)s - ((char *)cp - line);
00046 while (cp < limit)
00047 *s++ = *cp++;
00048 cp = &buffer[MAXLINE+1] - n;
00049 }
00050 if (feof(stdin))
00051 bsize = 0;
00052 else
00053 bsize = fread(&buffer[MAXLINE+1], 1, BUFSIZE, stdin);
00054 if (bsize < 0) {
00055 error("read error\n");
00056 exit(EXIT_FAILURE);
00057 }
00058 limit = &buffer[MAXLINE+1+bsize];
00059 *limit = '\n';
00060 }
00061 void input_init(int argc, char *argv[]) {
00062 static int inited;
00063
00064 if (inited)
00065 return;
00066 inited = 1;
00067 main_init(argc, argv);
00068 limit = cp = &buffer[MAXLINE+1];
00069 bsize = -1;
00070 lineno = 0;
00071 file = NULL;
00072 fillbuf();
00073 if (cp >= limit)
00074 cp = limit;
00075 nextline();
00076 }
00077
00078
00079 static void pragma(void) {
00080 if ((t = gettok()) == ID && strcmp(token, "ref") == 0)
00081 for (;;) {
00082 while (*cp == ' ' || *cp == '\t')
00083 cp++;
00084 if (*cp == '\n' || *cp == 0)
00085 break;
00086 if ((t = gettok()) == ID && tsym) {
00087 tsym->ref++;
00088 use(tsym, src);
00089 }
00090 }
00091 }
00092
00093
00094 static void resynch(void) {
00095 for (cp++; *cp == ' ' || *cp == '\t'; )
00096 cp++;
00097 if (limit - cp < MAXLINE)
00098 fillbuf();
00099 if (strncmp((char *)cp, "pragma", 6) == 0) {
00100 cp += 6;
00101 pragma();
00102 } else if (*cp >= '0' && *cp <= '9') {
00103 line: for (lineno = 0; *cp >= '0' && *cp <= '9'; )
00104 lineno = 10*lineno + *cp++ - '0';
00105 lineno--;
00106 while (*cp == ' ' || *cp == '\t')
00107 cp++;
00108 if (*cp == '"') {
00109 file = (char *)++cp;
00110 while (*cp && *cp != '"' && *cp != '\n')
00111 cp++;
00112 file = stringn(file, (char *)cp - file);
00113 if (*cp == '\n')
00114 warning("missing \" in preprocessor line\n");
00115 if (firstfile == 0)
00116 firstfile = file;
00117 }
00118 } else if (strncmp((char *)cp, "line", 4) == 0) {
00119 for (cp += 4; *cp == ' ' || *cp == '\t'; )
00120 cp++;
00121 if (*cp >= '0' && *cp <= '9')
00122 goto line;
00123 if (Aflag >= 2)
00124 warning("unrecognized control line\n");
00125 } else if (Aflag >= 2 && *cp != '\n')
00126 warning("unrecognized control line\n");
00127 while (*cp)
00128 if (*cp++ == '\n')
00129 if (cp == limit + 1)
00130 nextline();
00131 else
00132 break;
00133 }
00134