X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Ftextfilter.c;h=bcac83882495379fa4452f04d08541d0dd29d93f;hb=02ba8788a0a15cd76fefc777908738cc27e78e6c;hp=212555b0c3fce9c4fbc422b503a7ef072067ea31;hpb=4a6a96035db9c20ae0c724955a001dbb990e5489;p=picodrive.git diff --git a/tools/textfilter.c b/tools/textfilter.c index 212555b..bcac838 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; @@ -43,7 +45,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,20 +79,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) { - skip_mode ^= 1; + 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) @@ -99,6 +106,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;