[rfc patch 1/2] cli: change api of parse_option

David Bremner david at tethera.net
Tue Mar 28 05:00:41 PDT 2017


The idea is to allow it (in a future commit) advance to the next argv
element to get a value
---
 command-line-arguments.c       | 37 ++++++++++++++++++++-----------------
 command-line-arguments.h       |  4 ++--
 test/T690-command-line-args.sh | 11 +++++++++++
 3 files changed, 33 insertions(+), 19 deletions(-)
 create mode 100755 test/T690-command-line-args.sh

diff --git a/command-line-arguments.c b/command-line-arguments.c
index de6b4536..72b950e9 100644
--- a/command-line-arguments.c
+++ b/command-line-arguments.c
@@ -121,18 +121,24 @@ parse_position_arg (const char *arg_str, int pos_arg_index,
  * parse a possible value, and assign to *output_var
  */
 
-notmuch_bool_t
-parse_option (const char *_arg, const notmuch_opt_desc_t *options)
+int
+parse_option (int argc, char **argv, const notmuch_opt_desc_t *options, int opt_index)
 {
+    assert(argv);
+
+    const char *_arg = argv[opt_index];
+
     assert(_arg);
     assert(options);
 
     const char *arg = _arg + 2; /* _arg starts with -- */
     const notmuch_opt_desc_t *try;
     for (try = options; try->opt_type != NOTMUCH_OPT_END; try++) {
-	if (try->opt_type == NOTMUCH_OPT_INHERIT &&
-	    parse_option (_arg, try->output_var))
-	    return TRUE;
+	if (try->opt_type == NOTMUCH_OPT_INHERIT) {
+	    int new_index = parse_option (argc, argv, try->output_var, opt_index);
+	    if (new_index >= 0)
+		return new_index;
+	}
 
 	if (! try->name)
 	    continue;
@@ -158,13 +164,13 @@ parse_option (const char *_arg, const notmuch_opt_desc_t *options)
 	switch (try->opt_type) {
 	case NOTMUCH_OPT_KEYWORD:
 	case NOTMUCH_OPT_KEYWORD_FLAGS:
-	    return _process_keyword_arg (try, next, value);
+	    return _process_keyword_arg (try, next, value) ? opt_index + 1 : (-1);
 	case NOTMUCH_OPT_BOOLEAN:
-	    return _process_boolean_arg (try, next, value);
+	    return _process_boolean_arg (try, next, value) ? opt_index + 1 : (-1);
 	case NOTMUCH_OPT_INT:
-	    return _process_int_arg (try, next, value);
+	    return _process_int_arg (try, next, value) ? opt_index + 1 : (-1);
 	case NOTMUCH_OPT_STRING:
-	    return _process_string_arg (try, next, value);
+	    return _process_string_arg (try, next, value) ? opt_index + 1 : (-1);
 	case NOTMUCH_OPT_POSITION:
 	case NOTMUCH_OPT_END:
 	default:
@@ -172,7 +178,7 @@ parse_option (const char *_arg, const notmuch_opt_desc_t *options)
 	    /*UNREACHED*/
 	}
     }
-    return FALSE;
+    return -1;
 }
 
 /* See command-line-arguments.h for description */
@@ -194,18 +200,15 @@ parse_arguments (int argc, char **argv,
 	    }
 
 	} else {
-
 	    if (strlen (argv[opt_index]) == 2)
 		return opt_index+1;
 
-	    more_args = parse_option (argv[opt_index], options);
-	    if (more_args) {
-		opt_index++;
-	    } else {
+	    opt_index = parse_option (argc, argv, options, opt_index);
+	    /* this is currently broken as -1 is never returned */
+	    if (opt_index < 0) {
 		fprintf (stderr, "Unrecognized option: %s\n", argv[opt_index]);
-		opt_index = -1;
+		more_args = FALSE;
 	    }
-
 	}
     }
 
diff --git a/command-line-arguments.h b/command-line-arguments.h
index 309aaf2b..4c4d240e 100644
--- a/command-line-arguments.h
+++ b/command-line-arguments.h
@@ -70,8 +70,8 @@ parse_arguments (int argc, char **argv, const notmuch_opt_desc_t *options, int o
  * functions.
  */
 
-notmuch_bool_t
-parse_option (const char *arg, const notmuch_opt_desc_t* options);
+int
+parse_option (int argc, char **argv, const notmuch_opt_desc_t* options, int opt_index);
 
 notmuch_bool_t
 parse_position_arg (const char *arg,
diff --git a/test/T690-command-line-args.sh b/test/T690-command-line-args.sh
new file mode 100755
index 00000000..01592749
--- /dev/null
+++ b/test/T690-command-line-args.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+test_description="command line arguments"
+. ./test-lib.sh || exit 1
+
+NOTMUCH_NEW > /dev/null
+
+test_begin_subtest 'bad option to show'
+test_expect_code 1 'notmuch show --this-is-not-an-option'
+
+test_done
-- 
2.11.0



More information about the notmuch mailing list