From eece9692d707ccb20356ec06955f8308c4e59ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sun, 17 Dec 2023 14:18:48 +0100 Subject: New upstream version 4.19 --- src/tc-option.c | 68 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 18 deletions(-) (limited to 'src/tc-option.c') diff --git a/src/tc-option.c b/src/tc-option.c index 83271e0..8e99b19 100644 --- a/src/tc-option.c +++ b/src/tc-option.c @@ -11,6 +11,7 @@ #include #include #include +#include "internal.h" static int opt_v = 0, opt_mask = 0; static char *opt_kstr = NULL; @@ -64,45 +65,69 @@ static struct HXoption table[] = { HXOPT_TABLEEND, }; -static void dump_argv(const char **v) +static void dump_argv(char **v) { while (*v != NULL) printf("[%s] ", *v++); printf("\n"); } -static void t_pthru(void) +static int t_pthru(void) { const char *argv[] = { "ARGV0", "-Zomg", "-GZfoo", "bar", "--unknown-f=13.37", "--unknown-a", "foo", "bar", NULL }; - const char **argp = argv; - int argc = ARRAY_SIZE(argv) - 1; + char **nargv = nullptr; + int nargc = 0; printf("PTHRU test:\n"); - HX_getopt(table, &argc, &argp, HXOPT_USAGEONERR | HXOPT_PTHRU); - dump_argv(argp); + if (HX_getopt5(table, const_cast(char **, argv), &nargc, &nargv, + HXOPT_USAGEONERR | HXOPT_PTHRU) != HXOPT_ERR_SUCCESS) + return EXIT_FAILURE; + printf("argc = %d\n", nargc); + dump_argv(nargv); printf("\n"); + HX_zvecfree(nargv); + return EXIT_SUCCESS; } -static void t_empty_argv(void) +static int t_empty_argv(void) { - const char *zero_argv[] = {NULL}, **zero_argp = zero_argv; - int zero_argc = 0; + char *zero_argv[] = {nullptr}; + char **new_argv = nullptr; printf("Testing argv={NULL}\n"); - HX_getopt(table, &zero_argc, &zero_argp, HXOPT_USAGEONERR); + if (HX_getopt5(table, zero_argv, nullptr, &new_argv, + HXOPT_USAGEONERR) != HXOPT_ERR_SUCCESS) + return EXIT_FAILURE; + HX_zvecfree(new_argv); + return EXIT_SUCCESS; } -int main(int argc, const char **argv) +static int t_keep_argv(void) { - if (HX_init() <= 0) + static const char *const one_argv[] = {"what", nullptr}; + const char **argv = const_cast2(const char **, one_argv); + if (HX_getopt(table, nullptr, &argv, HXOPT_KEEP_ARGV) != HXOPT_ERR_SUCCESS) return EXIT_FAILURE; - printf("Return value of HX_getopt: %d\n", - HX_getopt(table, &argc, &argv, HXOPT_USAGEONERR)); - t_empty_argv(); + return argv == one_argv ? EXIT_SUCCESS : EXIT_FAILURE; +} + +static int runner(int argc, char **argv) +{ + char **nargv = nullptr; + int ret = HX_getopt5(table, argv, &argc, &nargv, HXOPT_USAGEONERR); + printf("Return value of HX_getopt: %d\n", ret); + if (ret == EXIT_SUCCESS) + HX_zvecfree(nargv); + ret = t_empty_argv(); + if (ret != EXIT_SUCCESS) + return ret; + ret = t_keep_argv(); + if (ret != EXIT_SUCCESS) + return ret; printf("Either-or is: %s\n", opt_eitheror[opt_dst]); printf("values: D=%lf I=%d L=%ld S=%s\n", @@ -110,9 +135,16 @@ int main(int argc, const char **argv) printf("Verbosity level: %d\n", opt_v); printf("Mask: 0x%08X\n", opt_mask); printf("mcstr: >%s<\n", opt_mcstr); + return t_pthru(); +} - t_pthru(); - +int main(int argc, char **argv) +{ + if (HX_init() <= 0) + return EXIT_FAILURE; + int ret = runner(argc, argv); + if (ret != EXIT_SUCCESS) + printf("FAILED\n"); HX_exit(); - return EXIT_SUCCESS; + return ret; } -- cgit v1.2.3