X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Ftextfilter.c;h=90354c2723bfde29b264a1c1346949c90542437d;hb=6901d0e45dbf77671d86cb9bf9af98c486db97c8;hp=7a58e8036dbd3f3a91e0f01e262f8afee60d086b;hpb=7eed09b34f1d37d8f4e476c82d13b63322ea8185;p=picodrive.git diff --git a/tools/textfilter.c b/tools/textfilter.c index 7a58e80..90354c2 100644 --- a/tools/textfilter.c +++ b/tools/textfilter.c @@ -1,11 +1,13 @@ #include #include +#include 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;