home *** CD-ROM | disk | FTP | other *** search
/ Total Destruction / Total_Destruction.iso / addons / Lccwin32.exe / Lccwin32 / lccpub / src / input.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-11-11  |  4.2 KB  |  153 lines

  1. #include "c.h"
  2. int strcmpi(char *,char *);
  3. static void pragma ARGS((void));
  4. static void resynch ARGS((void));
  5.  
  6. static int      bsize;
  7. static unsigned char buffer[MAXLINE + 1 + BUFSIZE + 1];
  8. int             infd;           /* input file descriptor */
  9. unsigned char  *cp;             /* current input character */
  10. char           *file;           /* current input file name */
  11. char           *firstfile;      /* first input file */
  12. unsigned char  *limit;          /* points to last character + 1 */
  13. char           *line;           /* current line */
  14. int             lineno;         /* line number of current line */
  15.  
  16. void            inputInit(void)
  17. {
  18.     limit = cp = &buffer[MAXLINE + 1];
  19.     bsize = -1;
  20.     lineno = 0;
  21.     file = NULL;
  22.     fillbuf();
  23.     if (cp >= limit)
  24.         cp = limit;
  25.     nextline();
  26. }
  27. void            nextline(void)
  28. {
  29.     do {
  30.         if (cp >= limit) {
  31.             fillbuf();
  32.             if (cp >= limit)
  33.                 cp = limit;
  34.             if (cp == limit)
  35.                 return;
  36.         }
  37.         else
  38.             lineno++;
  39.         for (line = (char *) cp; *cp == ' ' || *cp == '\t'; cp++);
  40.     } while (*cp == '\n' && cp == limit);
  41.     if (*cp == '#') {
  42.         resynch();
  43.         nextline();
  44.     }
  45. }
  46. void            fillbuf(void)
  47. {
  48.     if (bsize == 0)
  49.         return;
  50.     if (cp >= limit)
  51.         cp = &buffer[MAXLINE + 1];
  52.     else {
  53.         int             n = limit - cp;
  54.         unsigned char  *s = &buffer[MAXLINE + 1] - n;
  55.         assert(s >= buffer);
  56.         line = (char *) s - ((char *) cp - line);
  57.         while (cp < limit)
  58.             *s++ = *cp++;
  59.         cp = &buffer[MAXLINE + 1] - n;
  60.     }
  61.     bsize = ReadFromCpp(&buffer[MAXLINE + 1], BUFSIZE);
  62.     if (bsize < 0) {
  63.         error("read error\n");
  64.         exit(1);
  65.     }
  66.     limit = &buffer[MAXLINE + 1 + bsize];
  67.     *limit = '\n';
  68. }
  69. /* inputstring - arrange to read str as next input */
  70. void            inputstring(char *str)
  71. {
  72.     limit = cp = &buffer[MAXLINE + 1];
  73.     while ((*limit++ = *str++) != 0);
  74.     *--limit = '\n';
  75.     bsize = 0;
  76. }
  77.  
  78. /* pragma - handle #pragma ref id... */
  79. static void     pragma(void)
  80. {
  81.     t = gettok();
  82.     if (t != ID) return; /* remain compatible with pragmas for other compilers */
  83.     if (strcmp(token, "ref") == 0) {
  84.         for (;;) {
  85.             while (*cp == ' ' || *cp == '\t')
  86.                 cp++;
  87.             if (*cp == '\n' || *cp == 0)
  88.                 break;
  89.             if ((t = gettok()) == ID && tsym) {
  90.                 tsym->ref++;
  91.                 use(tsym, src);
  92.             }
  93.         }
  94.         return;
  95.     }
  96.     if (strcmpi(token,"pack") == 0) {
  97.         ProcessPragmaPack();
  98.     }
  99.     if (strcmpi(token,"section") == 0) {
  100.         ProcessSection();
  101.     }
  102.     if (strcmpi(token,"optimize") == 0) {
  103.         ProcessOptimize();
  104.     }
  105. }
  106.  
  107. /* resynch - set line number/file name in # n [ "file" ] and #pragma ... */
  108. static void     resynch(void)
  109. {
  110.     for (cp++; *cp == ' ' || *cp == '\t';)
  111.         cp++;
  112.     if (limit - cp < MAXLINE)
  113.         fillbuf();
  114.     if (strncmp((char *) cp, "pragma", 6) == 0) {
  115.         cp += 6;
  116.         pragma();
  117.     }
  118.     else if (*cp >= '0' && *cp <= '9') {
  119. line:  for (lineno = 0; *cp >= '0' && *cp <= '9';)
  120.             lineno = 10 * lineno + *cp++ - '0';
  121.         lineno--;
  122.         while (*cp == ' ' || *cp == '\t')
  123.             cp++;
  124.         if (*cp == '"') {
  125.             file = (char *) ++cp;
  126.             while (*cp && *cp != '"' && *cp != '\n')
  127.                 cp++;
  128.             file = stringn(file, (char *) cp - file);
  129.             if (*cp == '\n')
  130.                 warning("missing \" in preprocessor line\n");
  131.             if (firstfile == 0)
  132.                 firstfile = file;
  133.         }
  134.     }
  135.     else if (strncmp((char *) cp, "line", 4) == 0) {
  136.         for (cp += 4; *cp == ' ' || *cp == '\t';)
  137.             cp++;
  138.         if (*cp >= '0' && *cp <= '9')
  139.             goto line;
  140.         if (Aflag >= 2)
  141.             warning("unrecognized control line\n");
  142.     }
  143.     else if (Aflag >= 2 && *cp != '\n')
  144.         warning("unrecognized control line\n");
  145.     while (*cp)
  146.         if (*cp++ == '\n')
  147.             if (cp == limit + 1)
  148.                 nextline();
  149.             else
  150.                 break;
  151. }
  152.  
  153.