X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/e031b4f0220432aef6e1864ea6359353dbd8aed3..9c8633f0258d0750fd81387fe826d4522873cd90:/test/crossparse.c diff --git a/test/crossparse.c b/test/crossparse.c index 75344cb..f377c38 100644 --- a/test/crossparse.c +++ b/test/crossparse.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include "test.h" @@ -69,9 +70,44 @@ err: } #define rerender(str, p, r) (rerender(str, #p, p, #r, r)) -int main(int argc, char **argv) +static bool test_crossparse(const char *str, int mode) { char *buf1 = NULL, *buf2 = NULL, *buf3 = NULL; + bool ret = false; + + if (mode == MODE_ENGLISH) { + buf1 = rerender(str, cdecl_parse_english, cdecl_declare); + if (!buf1) + goto out; + buf2 = rerender(buf1, cdecl_parse_decl, cdecl_explain); + if (!buf2) + goto out; + buf3 = rerender(buf2, cdecl_parse_english, cdecl_declare); + if (!buf3) + goto out; + } else { + buf1 = rerender(str, cdecl_parse_decl, cdecl_explain); + if (!buf1) + goto out; + buf2 = rerender(buf1, cdecl_parse_english, cdecl_declare); + if (!buf2) + goto out; + buf3 = rerender(buf2, cdecl_parse_decl, cdecl_explain); + if (!buf3) + goto out; + } + + if (!strcmp(buf1, buf3)) + ret = true; +out: + free(buf1); + free(buf2); + free(buf3); + return ret; +} + +int main(int argc, char **argv) +{ int opt, mode = MODE_CDECL; int ret = EXIT_FAILURE; @@ -103,33 +139,13 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - if (mode == MODE_ENGLISH) { - buf1 = rerender(argv[optind], cdecl_parse_english, cdecl_declare); - if (!buf1) - goto out; - buf2 = rerender(buf1, cdecl_parse_decl, cdecl_explain); - if (!buf2) - goto out; - buf3 = rerender(buf2, cdecl_parse_english, cdecl_declare); - if (!buf3) - goto out; - } else { - buf1 = rerender(argv[optind], cdecl_parse_decl, cdecl_explain); - if (!buf1) - goto out; - buf2 = rerender(buf1, cdecl_parse_english, cdecl_declare); - if (!buf2) - goto out; - buf3 = rerender(buf2, cdecl_parse_decl, cdecl_explain); - if (!buf3) - goto out; + for (int i = optind; i < argc; i++) { + if (!test_crossparse(argv[i], mode)) { + fprintf(stderr, "%s: failed cross-parse check of: %s\n", + progname, argv[i]); + return EXIT_FAILURE; + } } - if (!strcmp(buf1, buf3)) - ret = EXIT_SUCCESS; -out: - free(buf1); - free(buf2); - free(buf3); - return ret; + return EXIT_SUCCESS; }