cd: hacks..
[picodrive.git] / tools / textfilter.c
index 7a58e80..90354c2 100644 (file)
@@ -1,11 +1,13 @@
 #include <stdio.h>
 #include <string.h>
+#include <ctype.h>
 
 
 static int check_defines(const char **defs, int defcount, char *tdef)
 {
        int i, len;
 
+       while (isspace(*tdef)) tdef++;
        len = strlen(tdef);
        for (i = 0; i < len; i++)
                if (tdef[i] == ' ' || tdef[i] == '\r' || tdef[i] == '\n') break;
@@ -23,17 +25,19 @@ static int check_defines(const char **defs, int defcount, char *tdef)
 
 static void do_counters(char *str)
 {
-       static int counters[4] = { 1, 1, 1, 1 };
+       static int counter_id = -1, counter;
        char buff[1024];
-       int counter;
        char *s = str;
 
        while ((s = strstr(s, "@@")))
        {
-               if (s[2] < '0' || s[2] > '3') { s++; continue; }
+               if (s[2] < '0' || s[2] > '9') { s++; continue; }
 
-               counter = s[2] - '0';
-               snprintf(buff, sizeof(buff), "%i%s", counters[counter]++, s + 3);
+               if (counter_id != s[2] - '0') {
+                       counter_id = s[2] - '0';
+                       counter = 1;
+               }
+               snprintf(buff, sizeof(buff), "%i%s", counter++, s + 3);
                strcpy(s, buff);
        }
 }
@@ -43,7 +47,7 @@ int main(int argc, char *argv[])
 {
        char buff[1024];
        FILE *fi, *fo;
-       int skip_mode = 0, ifdef_level = 0, line = 0;
+       int skip_mode = 0, ifdef_level = 0, skip_level = 0, line = 0;
 
        if (argc < 3)
        {
@@ -77,16 +81,25 @@ int main(int argc, char *argv[])
                        /* control char */
                        if (strncmp(buff, "#ifdef ", 7) == 0)
                        {
-                               if (!check_defines((void *) &argv[3], argc-3, buff + 7)) skip_mode = 1;
                                ifdef_level++;
+                               if (!skip_mode && !check_defines((void *) &argv[3], argc-3, buff + 7))
+                                       skip_mode = 1, skip_level = ifdef_level;
                        }
                        else if (strncmp(buff, "#ifndef ", 8) == 0)
                        {
-                               if ( check_defines((void *) &argv[3], argc-3, buff + 7)) skip_mode = 1;
                                ifdef_level++;
+                               if (!skip_mode &&  check_defines((void *) &argv[3], argc-3, buff + 8))
+                                       skip_mode = 1, skip_level = ifdef_level;
+                       }
+                       else if (strncmp(buff, "#else", 5) == 0)
+                       {
+                               if (!skip_mode || skip_level == ifdef_level)
+                                       skip_mode ^= 1, skip_level = ifdef_level;
                        }
                        else if (strncmp(buff, "#endif", 6) == 0)
                        {
+                               if (skip_level == ifdef_level)
+                                       skip_mode = 0;
                                ifdef_level--;
                                if (ifdef_level == 0) skip_mode = 0;
                                if (ifdef_level < 0)
@@ -95,6 +108,29 @@ int main(int argc, char *argv[])
                                        ifdef_level = 0;
                                }
                        }
+                       else if (strncmp(buff, "#include ", 9) == 0)
+                       {
+                               char *pe, *p = buff + 9;
+                               FILE *ftmp;
+                               if (skip_mode) continue;
+                               while (*p && (*p == ' ' || *p == '\"')) p++;
+                               for (pe = p + strlen(p) - 1; pe > p; pe--)
+                                       if (isspace(*pe) || *pe == '\"') *pe = 0;
+                                       else break;
+                               ftmp = fopen(p, "r");
+                               if (ftmp == NULL) {
+                                       printf("%i: error: failed to include \"%s\"\n", line, p);
+                                       return 1;
+                               }
+                               while (!feof(ftmp))
+                               {
+                                       fgs = fgets(buff, sizeof(buff), ftmp);
+                                       if (fgs == NULL) break;
+                                       fputs(buff, fo);
+                               }
+                               fclose(ftmp);
+                               continue;
+                       }
 
                        /* skip line */
                        continue;