We allow keyword lists in the argument parser. The parser returns a bitfield of the arguments present which is the union of the specified bitfields for each option. Since it is the union the parser could allow things like
--output-headers=default,reply-to to get the default headers with reply-to added. --- command-line-arguments.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ command-line-arguments.h | 3 +- 2 files changed, 49 insertions(+), 1 deletions(-) diff --git a/command-line-arguments.c b/command-line-arguments.c index b0a0dab..d322f9e 100644 --- a/command-line-arguments.c +++ b/command-line-arguments.c @@ -37,6 +37,50 @@ _process_keyword_arg (const notmuch_opt_desc_t *arg_desc, char next, const char } static notmuch_bool_t +_process_keyword_list (const notmuch_opt_desc_t *arg_desc, const char *arg_str) { + + char *key_str, *final; + unsigned int matched_keys = 0; + notmuch_bool_t matched; + const notmuch_keyword_t *keywords; + + key_str = strdup (arg_str); + + do { + keywords = arg_desc->keywords; + matched = FALSE; + + final = strrchr (key_str, ','); + + if (final) { + *final = '\0'; + final++; + } else { + final = key_str; + } + + while (keywords->name && !matched) { + if (strcmp (final, keywords->name) == 0) { + matched_keys |= keywords->value; + matched = TRUE; + } + keywords++; + } + if (!matched) { + fprintf (stderr, "unknown keyword: \'%s\' in list %s\n", final, arg_str); + goto DONE; + } + } while (final != key_str); + + if (arg_desc->output_var) { + *((unsigned int *)arg_desc->output_var) = matched_keys; + } +DONE: + free (key_str); + return matched; +} + +static notmuch_bool_t _process_boolean_arg (const notmuch_opt_desc_t *arg_desc, char next, const char *arg_str) { if (next == 0) { @@ -121,6 +165,9 @@ parse_option (const char *arg, case NOTMUCH_OPT_KEYWORD: return _process_keyword_arg (try, next, value); break; + case NOTMUCH_OPT_KEYWORD_LIST: + return _process_keyword_list (try, value); + break; case NOTMUCH_OPT_BOOLEAN: return _process_boolean_arg (try, next, value); break; diff --git a/command-line-arguments.h b/command-line-arguments.h index de1734a..f2b2275 100644 --- a/command-line-arguments.h +++ b/command-line-arguments.h @@ -9,7 +9,8 @@ enum notmuch_opt_type { NOTMUCH_OPT_INT, /* --frob=8 */ NOTMUCH_OPT_KEYWORD, /* --format=raw|json|text */ NOTMUCH_OPT_STRING, /* --file=/tmp/gnarf.txt */ - NOTMUCH_OPT_POSITION /* notmuch dump pos_arg */ + NOTMUCH_OPT_POSITION, /* notmuch dump pos_arg */ + NOTMUCH_OPT_KEYWORD_LIST /* --output=header,body */ }; /* -- 1.7.9.1