From b113114c7498fc6c48065a8c4816c610c6f08198 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 6 Feb 2024 14:53:59 +0100 Subject: argparser: Implement a command mode. * src/gpg-error.h.in (ARGPARSE_FLAG_COMMAND): New. * src/argparse.c (struct _gpgrt_argparse_internal_s): Add flags explicit_cmd_mode, cmd_mode, and command_seen. (initialize): Init them. Mark default commands as commands. (handle_meta_command): New. (handle_metacmd): Add "command-mode" and "-command-mode". (find_long_option): Add arg only_commands. (arg_parse): Factor some code out to ... (handle_special_commands): new. (arg_parse): Implement the command-mode. * tests/t-argparse.c (main): Add some testing code. -- GnuPG-bug-id: 6978 --- tests/t-argparse.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'tests/t-argparse.c') diff --git a/tests/t-argparse.c b/tests/t-argparse.c index 4d24e5f..6085066 100644 --- a/tests/t-argparse.c +++ b/tests/t-argparse.c @@ -68,6 +68,9 @@ main (int argc, char **argv) { gpgrt_opt_t opts[] = { ARGPARSE_verbatim("Now for the options:\n"), + ARGPARSE_c (601, "foo", "Command FOO"), + ARGPARSE_c (602, "bar", "Command BAR"), + ARGPARSE_c (603, "foobar", "Command FOOBAR"), ARGPARSE_x ('v', "verbose", NONE, 0, "Laut sein"), ARGPARSE_s_n('e', "echo" , ("Zeile ausgeben, damit wir sehen, " "was wir eingegeben haben")), @@ -96,6 +99,10 @@ main (int argc, char **argv) int i; const char *srcdir; int any_warn = 0; + int command = -1; + + if (getenv ("argparse_flag_command")) + pargs.flags |= ARGPARSE_FLAG_COMMAND; gpgrt_set_strusage (my_strusage); srcdir = getenv ("srcdir"); @@ -139,11 +146,20 @@ main (int argc, char **argv) case 'M': opt.myopt = 0; break; case 's': opt.street = pargs.r.ret_str; break; case 500: opt.a_long_one++; break; + + case 601: + case 602: + case 603: + command = pargs.r_opt; + break; + default : pargs.err = ARGPARSE_PRINT_WARNING; any_warn = 1; break; } } for (i=0; i < argc; i++ ) printf ("%3d -> (%s)\n", i, argv[i] ); + if (command >= 0) + printf ("Command: %d\n", command); if (opt.verbose) puts ("Options:"); if (opt.verbose) -- cgit v1.2.3