]> git.draconx.ca Git - cdecl99.git/blobdiff - t/randomdecl.c
tests: Consolidate error messaging a bit.
[cdecl99.git] / t / randomdecl.c
index 1fbd2d913b360114649b310a9e4983449024954c..156e51c4842ba4ea4e375cc92651b97eb9c8e761 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Generate random C declarations for testing.
- * Copyright © 2012, 2020, 2022-2023 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
 #include <stdbool.h>
 #include <errno.h>
 #include <getopt.h>
-#include <cdecl.h>
 
+#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' },
@@ -82,6 +82,23 @@ 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;
@@ -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;
        }
 
@@ -132,9 +149,9 @@ int main(int argc, char **argv)
                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);