summaryrefslogtreecommitdiff
path: root/src/tc-option.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tc-option.c')
-rw-r--r--src/tc-option.c68
1 files changed, 50 insertions, 18 deletions
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 <libHX/init.h>
#include <libHX/map.h>
#include <libHX/option.h>
+#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;
}