From 6996a1222c021326ce34ff3ff760e4f4a1c5b4d8 Mon Sep 17 00:00:00 2001 From: George Baltz N3GB Date: Wed, 26 Jun 2024 10:08:40 -0400 Subject: [PATCH] Fix func_chk to do useful things Allow multiple input files Do analysis on function-by-function basis Add 'return' to processing Fix some false positives in comments --- tests/func_chk.c | 105 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 30 deletions(-) diff --git a/tests/func_chk.c b/tests/func_chk.c index 76161f32a..31dfd19ed 100644 --- a/tests/func_chk.c +++ b/tests/func_chk.c @@ -1,48 +1,93 @@ -/* this can change for balanced ENTERFUNC/RETURNFUNC statements */ +/* This can check for balanced ENTERFUNC/RETURNFUNC statements */ /* RETURNFUNC2 is used when ENTERFUNC is not used in a function */ +// +// Still may give false positives for /* */ comments or string literals +// Have to live with them until we can "borrow" a C parser/tokenizer +// that doesn't bloat the build requirements. +// +// Note that this is very dependent on the Hamlib coding style #include #include int main(int argc, const char *argv[]) { char buf[4096]; - char buf2[4096]; - FILE *fp = fopen(argv[1], "r"); - int linenum = 0; - int enterfunc = 0; + const char *fname; + char *s; + FILE *fp; + int idx, inafunc; + int linenum; + int enterfunc; int retval = 0; - retval = 0; - while (fgets(buf, sizeof(buf), fp)) - { - ++linenum; - buf[16] = 0; + for (idx = 1; idx < argc; idx++) + { + fp = fopen(argv[idx], "r"); + if (fp == NULL) { fprintf(stderr, "Can't open %s\n", argv[idx]); continue;} +#if 0 + if (!(fname = strrchr(argv[idx], '/'))) + { + fname = argv[idx]; + } + else + { + fname++; + } +#else + fname = argv[idx]; +#endif + linenum = enterfunc = inafunc = 0; - if (strstr(buf, "ENTERFUNC;")) { enterfunc = 1; } + while (fgets(buf, sizeof(buf), fp)) + { + ++linenum; - if (enterfunc && strstr(buf, "RETURNFUNC2")) - { - printf("Line#%d need RETURNFUNC %s\n", linenum, argv[1]); - retval = 1; - } + if (buf[0] == '{') + { //start of a function definition + inafunc = 1; + enterfunc = 0; + continue; + } + else if (buf[0] == '}') + { // end of function definition; back to comments + inafunc = 0; + } - strcpy(buf2, buf); - buf2[15] = 0; // truncate the string + if (!inafunc) + { // Not in a function, ignore everything + continue; + } - if (!enterfunc && strstr(buf2, "RETURNFUNC(")) - { - printf("Line#%d need RETURNFUNC2 %s\n", linenum, argv[1]); - retval = 1; - } + // Take care of // comments + if ((s = strstr(buf, "//"))) + { + *s = '\0'; + } - if (strstr(buf2, "RETURNFUNC(")) - { - if (enterfunc == 0) { printf("Line#%d no matching ENTERFUNC %s\n", linenum, argv[1]); } + if (strstr(buf, "ENTERFUNC;")) { enterfunc = 1; } - enterfunc = 0; - } - } + if (enterfunc && (strstr(buf, "RETURNFUNC2") || strstr(buf, "return ") + || strstr(buf, "return;"))) + { + printf("%s:%d need RETURNFUNC\n", fname, linenum); + retval = 1; + } - fclose(fp); + //TODO: Fix next to make a better guess at what's missing + if (!enterfunc && strstr(buf, "RETURNFUNC(")) + { + printf("%s:%d need RETURNFUNC2\n", fname, linenum); + retval = 1; + } + + if (strstr(buf, "RETURNFUNC(")) + { + if (enterfunc == 0) { printf("%s:%d no matching ENTERFUNC\n", fname, linenum); } + } + } + + //printf("%s:%d Done\n", fname, linenum); + fclose(fp); + } return retval; }