home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / CLISP / CLISPSRC.TAR / clisp-1995-01-01 / utils / deelif.d < prev    next >
Encoding:
Text File  |  1994-07-23  |  6.0 KB  |  177 lines

  1. # Programm zum Eliminieren von '#elif'-PrΣprozessor-Anweisungen in C-Programmen
  2. # Bruno Haible 30.8.1991
  3.  
  4. # Methode:
  5. # Erkenne die PrΣprozessor-Anweisungen #if, #else, #endif, #elif, #line.
  6. # Bei '#if' wird ein neuer ZΣhler aufgemacht und auf 1 gesetzt.
  7. # Bei '#elif' wird '#else #if' ausgegeben und der letzte ZΣhler um 1 erh÷ht.
  8. # Bei '#endif' werden so viele '#endif's ausgegeben, wie der ZΣhler angibt.
  9.  
  10. #define local static
  11. #define global
  12. #define var
  13. #define loop  while (1)
  14. #define until(exp)  while (!(exp))
  15. typedef unsigned char  uintB;
  16. typedef unsigned short  uintW;
  17. typedef unsigned long  uintL;
  18. typedef int  boolean;
  19. #define FALSE 0
  20. #define TRUE 1
  21.  
  22. #include <stdio.h>
  23.  
  24. typedef unsigned char Char;
  25.  
  26. global int main(argc,argv)
  27.   var int argc;
  28.   var char** argv;
  29. { var FILE* infile = stdin;
  30.   var FILE* outfile = stdout;
  31.   #define get() getc(infile)
  32.   #define put(x) putc(x,outfile)
  33.   #define puts(x) fputs(x,outfile)
  34.   register int c;
  35.   var long line_number = 0;
  36.   var int counterstack[1000];
  37.   var int* counterptr = &counterstack[0];
  38.   L1: # zu Beginn einer Zeile
  39.       line_number++;
  40.       c = get(); if (c==EOF) goto L3;
  41.       if (!(c=='#'))
  42.         { put(c); if (c=='\n') goto L1;
  43.           L2a:# innerhalb einer Zeile
  44.               c = get();
  45.           L2: if (c==EOF) goto L3;
  46.               put(c);
  47.               if (c=='\n') goto L1; else goto L2a;
  48.         }
  49.       # innerhalb einer PrΣprozessor-Anweisung
  50.       # Whitespace innerhalb der Zeile ⁿberlesen:
  51.       #define read_whitespace()  \
  52.         loop                                     \
  53.           { put(c);                              \
  54.             c = get();                           \
  55.             if (c==EOF) goto L3;                 \
  56.             if (!((c==' ') || (c=='\t'))) break; \
  57.           }
  58.       read_whitespace();
  59.       # Token lesen:
  60.       #define MAXTOKENLEN 1000
  61.       #define alphanumericp(c)  \
  62.         (((c>='0') && (c<='9')) || ((c>='A') && (c<='Z')) || ((c>='a') && (c<='z')) || (c=='_'))
  63.       { var Char token_buffer[MAXTOKENLEN+1];
  64.         var int token_length;
  65.         #define flush_token_buffer()  \
  66.           {var int i = 0; until (i==token_length) { put(token_buffer[i++]); } }
  67.         #define read_token()  \
  68.           { token_length = 0;                                      \
  69.             while (alphanumericp(c) && (token_length<MAXTOKENLEN)) \
  70.               { token_buffer[token_length++] = c; c = get(); }     \
  71.           }
  72.         read_token();
  73.         if ((token_length >= 1) && (token_buffer[0]>='0') && (token_buffer[0]<='9'))
  74.           goto line; # Zeilennummern-Angabe
  75.         if ((token_length == 4)
  76.             && (token_buffer[0]=='l')
  77.             && (token_buffer[1]=='i')
  78.             && (token_buffer[2]=='n')
  79.             && (token_buffer[3]=='e')
  80.            )
  81.           # '#line' -Anweisung
  82.           { flush_token_buffer();
  83.             read_whitespace();
  84.             read_token();
  85.             line:
  86.             if (token_length>0)
  87.               { token_buffer[token_length] = '\0';
  88.                {var long token_value = atol(token_buffer);
  89.                 if (token_value>0)
  90.                   { line_number = token_value - 1; } # Zeilennummer neu setzen
  91.               }}
  92.             flush_token_buffer();
  93.             goto L2;
  94.           }
  95.         if (   ((token_length == 2)
  96.                 && (token_buffer[0]=='i')
  97.                 && (token_buffer[1]=='f')
  98.                )
  99.             || ((token_length == 5)
  100.                 && (token_buffer[0]=='i')
  101.                 && (token_buffer[1]=='f')
  102.                 && (token_buffer[2]=='d')
  103.                 && (token_buffer[3]=='e')
  104.                 && (token_buffer[4]=='f')
  105.                )
  106.             || ((token_length == 6)
  107.                 && (token_buffer[0]=='i')
  108.                 && (token_buffer[1]=='f')
  109.                 && (token_buffer[2]=='n')
  110.                 && (token_buffer[3]=='d')
  111.                 && (token_buffer[4]=='e')
  112.                 && (token_buffer[5]=='f')
  113.                )
  114.            )
  115.           # '#if' oder '#ifdef' oder '#ifndef' -Anweisung
  116.           { *++counterptr = 1; flush_token_buffer(); goto L2; }
  117.         if ((token_length == 4)
  118.             && (token_buffer[0]=='e')
  119.             && (token_buffer[1]=='l')
  120.             && (token_buffer[2]=='s')
  121.             && (token_buffer[3]=='e')
  122.            )
  123.           # '#else' -Anweisung
  124.           { if (counterptr == &counterstack[0])
  125.               { fprintf(stderr,"#else ohne #if in Zeile %ld\n",line_number); }
  126.             flush_token_buffer(); goto L2;
  127.           }
  128.         if ((token_length == 5)
  129.             && (token_buffer[0]=='e')
  130.             && (token_buffer[1]=='n')
  131.             && (token_buffer[2]=='d')
  132.             && (token_buffer[3]=='i')
  133.             && (token_buffer[4]=='f')
  134.            )
  135.           # '#endif' -Anweisung
  136.           { flush_token_buffer();
  137.             if (counterptr == &counterstack[0])
  138.               { fprintf(stderr,"#endif ohne #if in Zeile %ld\n",line_number); }
  139.               else
  140.               {var int count = *counterptr-- - 1;
  141.                if (count > 0)
  142.                  { sprintf(token_buffer,"#line %ld\n",line_number);
  143.                    do { put('\n'); puts(token_buffer); puts("#endif"); count--; }
  144.                       until (count == 0);
  145.               }  }
  146.             goto L2;
  147.           }
  148.         if ((token_length == 4)
  149.             && (token_buffer[0]=='e')
  150.             && (token_buffer[1]=='l')
  151.             && (token_buffer[2]=='i')
  152.             && (token_buffer[3]=='f')
  153.            )
  154.           # '#elif' -Anweisung
  155.           { if (counterptr == &counterstack[0])
  156.               { fprintf(stderr,"#elif ohne #if in Zeile %ld\n",line_number); }
  157.               else
  158.               { (*counterptr)++; }
  159.             puts("else"); put('\n');
  160.             sprintf(token_buffer,"#line %ld\n",line_number);
  161.             puts(token_buffer);
  162.             puts("#if");
  163.             goto L2;
  164.           }
  165.         flush_token_buffer();
  166.         goto L2;
  167.       }
  168.   L3: # am File-Ende
  169.   # Files schlie▀en:
  170.   if (ferror(infile) || ferror(outfile))
  171.     { fclose(infile); fclose(outfile); exit(1); }
  172.   fclose(infile);
  173.   fclose(outfile);
  174.   exit(0); # alles OK
  175. }
  176.  
  177.