X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/e031b4f0220432aef6e1864ea6359353dbd8aed3..879d69d46fdf7ddf33beac6c32c7f2646d97d0ca:/test/test.h diff --git a/test/test.h b/test/test.h index 7cf89f1..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; @@ -11,6 +83,7 @@ void *malloc_nofail(size_t size); void *realloc_nofail(void *ptr, size_t size); void test_print_specifiers(struct cdecl_declspec *spec); void test_print_decl(struct cdecl *decl); +void test_explain_decl(struct cdecl *decl); bool strict_strtoul(unsigned long *val, const char *str, int base);