X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/1c3b0c0e6f9339e76e42f6393e554c7dfc58e205..1943156e7ba5c0318a54369a52297f74bad7b5b9:/t/randomdecl.c diff --git a/t/randomdecl.c b/t/randomdecl.c index 9e9271e..f4b00bc 100644 --- a/t/randomdecl.c +++ b/t/randomdecl.c @@ -1,6 +1,6 @@ /* * Generate random C declarations for testing. - * Copyright © 2012, 2020, 2022 Nick Bowler + * Copyright © 2012, 2020, 2022-2024 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,13 +24,13 @@ #include #include #include -#include +#include "cdecl.h" #include "declgen.h" -#include "test.h" #define PROGNAME "randomdecl" -static const char *progname = PROGNAME; +#include "test.h" + static const char sopts[] = "s:n:ECVH"; static const struct option lopts[] = { { "seed", 1, NULL, 's' }, @@ -44,7 +44,7 @@ static const struct option lopts[] = { enum { MODE_CDECL, - MODE_ENGLISH, + MODE_ENGLISH }; static void print_usage(FILE *f) @@ -67,7 +67,7 @@ static struct cdecl *random_decl(struct test_rng *rng) unsigned flags = 0; decl = malloc_nofail(sizeof *decl); - *decl = (struct cdecl) { 0 }; + decl->next = NULL; decl->declarators = gen_declarators(rng); if (decl->declarators->type != CDECL_DECL_FUNCTION) @@ -82,13 +82,30 @@ static struct cdecl *random_decl(struct test_rng *rng) return decl; } +static void +print_decl(struct cdecl *decl, size_t func(char *, size_t, struct cdecl *)) +{ + static size_t printbuf_size; + static char *printbuf; + size_t rc; +retry: + rc = func(printbuf, printbuf_size, decl); + if (rc >= printbuf_size) { + printbuf_size = rc + 1; + printbuf = realloc_nofail(printbuf, printbuf_size); + goto retry; + } + + printf("%s\n", printbuf); +} + int main(int argc, char **argv) { const char *seed = "", *count_str = NULL; + unsigned long i, count = 0; + int opt, mode = MODE_CDECL; struct test_rng *rng; struct cdecl *decl; - unsigned long count = 0; - int opt, mode = MODE_CDECL; if (argc > 0) progname = argv[0]; @@ -119,8 +136,8 @@ int main(int argc, char **argv) } } - if (count_str && !strict_strtoul(&count, count_str, 0)) { - fprintf(stderr, "%s: invalid count: %s\n", progname, count_str); + if (count_str && !test_strtoul(&count, count_str)) { + print_error("invalid count: %s", count_str); return EXIT_FAILURE; } @@ -128,13 +145,13 @@ int main(int argc, char **argv) if (!rng) return EXIT_FAILURE; - for (unsigned long i = 0; !count || i < count; i++) { + for (i = 0; !count || i < count; i++) { decl = random_decl(rng); if (mode == MODE_ENGLISH) { - test_explain_decl(decl); + print_decl(decl, cdecl_explain); } else { - test_print_decl(decl); + print_decl(decl, cdecl_declare); } gen_free_declspecs(decl->specifiers);