From 879d69d46fdf7ddf33beac6c32c7f2646d97d0ca Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Thu, 2 Jul 2020 20:12:25 -0400 Subject: [PATCH] Add better --help text to the test programs. At the very least these test programs can enumerate their own options without requiring us to write any additional documentation. --- test/crossparse.c | 30 +++++++++++++++++++- test/randomdecl.c | 36 +++++++++++++++--------- test/test.h | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 14 deletions(-) diff --git a/test/crossparse.c b/test/crossparse.c index f377c38..05c3095 100644 --- a/test/crossparse.c +++ b/test/crossparse.c @@ -1,3 +1,21 @@ +/* + * Test that libcdecl can parse its own output. + * Copyright © 2012, 2020 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include @@ -25,8 +43,18 @@ static void print_usage(FILE *f) static void print_help(void) { + const struct option *opt; + print_usage(stdout); - puts("Detailed help coming soon."); + puts("Test that libcdecl can parse its own output.\n"); + + puts("Options:"); + for (opt = lopts; opt->val; opt++) { + int w = print_option_start(opt, NULL); + + if (w) + putchar('\n'); + } } enum { diff --git a/test/randomdecl.c b/test/randomdecl.c index 8e40448..a5b5d3c 100644 --- a/test/randomdecl.c +++ b/test/randomdecl.c @@ -1,19 +1,19 @@ /* - * Generate random C declarations for testing. - * Copyright © 2011 Nick Bowler + * Generate random C declarations for testing. + * Copyright © 2012, 2020 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #include @@ -54,8 +54,18 @@ static void print_usage(FILE *f) static void print_help(void) { + const struct option *opt; + print_usage(stdout); - puts("Detailed help coming soon."); + puts("Generate random C declarations for testing.\n"); + + puts("Options:"); + for (opt = lopts; opt->val; opt++) { + int w = print_option_start(opt, NULL); + + if (w) + putchar('\n'); + } } static struct cdecl *random_decl(struct gen_rng *rng) diff --git a/test/test.h b/test/test.h index b8f7ee3..dbf3f82 100644 --- a/test/test.h +++ b/test/test.h @@ -1,8 +1,80 @@ +/* + * Copyright © 2012, 2020 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef CDECL_TEST_H_ #define CDECL_TEST_H_ #include #include +#include +#include +#include + +#ifndef _ +# define _(x) (x) +#endif + +static inline int +print_option_start(const struct option *opt, const char *argname) +{ + int w; + + if (!argname) + argname = _("ARG"); + + if (opt->val >= CHAR_MIN && opt->val <= CHAR_MAX) { + switch (opt->has_arg) { + case 0: + w = printf(_(" -%c, --%s"), opt->val, opt->name); + break; + case 1: + w = printf(_(" -%c, --%s=%s"), + opt->val, opt->name, argname); + break; + case 2: + w = printf(_(" -%c, --%s[=%s]"), + opt->val, opt->name, argname); + break; + default: + assert(0); + } + } else { + switch (opt->has_arg) { + case 0: + w = printf(_(" --%s"), opt->name); + break; + case 1: + w = printf(_(" --%s=%s"), opt->name, argname); + break; + case 2: + w = printf(_(" --%s[=%s]"), opt->name, argname); + break; + default: + assert(0); + } + } + + if (w > 18) { + putchar('\n'); + w = 0; + } + + return w; +} struct cdecl_declspec; struct cdecl; -- 2.43.0