Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

input.c

Go to the documentation of this file.
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;  /* current input character */
00010 char *file;     /* current input file name */
00011 char *firstfile;    /* first input file */
00012 unsigned char *limit;   /* points to last character + 1 */
00013 char *line;     /* current line */
00014 int lineno;     /* line number of current line */
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 /* pragma - handle #pragma ref id... */
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 /* resynch - set line number/file name in # n [ "file" ] and #pragma ... */
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 

Generated on Thu Aug 25 12:38:14 2005 for Quake III Arena by  doxygen 1.3.9.1