From: Christian Couder <christian.couder@xxxxxxxxx> We often accept both a "--key" option and a "--key=<val>" option. These options currently are parsed using something like: if (!strcmp(arg, "--key")) { /* do something */ } else if (skip_prefix(arg, "--key=", &arg)) { /* do something with arg */ } which is a bit cumbersome compared to just: if (skip_to_opt_val(arg, "--key", &arg)) { /* do something with arg */ } Note that, when using skip_to_opt_val(), it is not possible any more to do something different when the first argument is exactly "--key" than when it is exactly "--key=", but in most cases we already don't make any difference, which is a good thing. Note that "opt" in the function name actually means "optional" as the function can be used to parse any "key=value" string where "key" is also considered as valid, not just command line options. Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- git-compat-util.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) Another possibility would be to add a "const char *default" argument to the function, and to do: if (!*p) { *val = default; return 1; } This could make the function more useful in some cases. I also wonder if the function is too big to be inlined, and in that case, in which file it should be added. diff --git a/git-compat-util.h b/git-compat-util.h index cedad4d581..7ee040388f 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -534,6 +534,41 @@ static inline int ends_with(const char *str, const char *suffix) return strip_suffix(str, suffix, &len); } +/* + * If the string "str" is the same as the string in "prefix", then the "val" + * parameter is set to the empty string and 1 is returned. + * If the string "str" begins with the string found in "prefix" and then a + * "=" sign, then the "val" parameter is set to "str + strlen(prefix) + 1" + * (i.e., to the point in the string right after the prefix and the "=" sign), + * and 1 is returned. + * + * Otherwise, return 0 and leave "val" untouched. + * + * When we accept both a "--key" and a "--key=<val>" option, this function + * can be used instead of !strcmp(arg, "--key") and then + * skip_prefix(arg, "--key=", &arg) to parse such an option. + */ +static inline int skip_to_opt_val(const char *str, const char *prefix, + const char **val) +{ + const char *p; + + if (!skip_prefix(str, prefix, &p)) + return 0; + + if (!*p) { + *val = ""; + return 1; + } + + if (*p == '=') { + *val = p + 1; + return 1; + } + + return 0; +} + #define SWAP(a, b) do { \ void *_swap_a_ptr = &(a); \ void *_swap_b_ptr = &(b); \ -- 2.15.1.271.g1a4e40aa5d.dirty