diff options
author | Christian Couder <christian.couder@gmail.com> | 2017-12-09 21:40:07 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-12-11 16:10:12 -0800 |
commit | afaef55e230c6fcfb4e8a27c1b970f7e6400a7f6 (patch) | |
tree | 90c784259dffd3f2b0a7fc75997485021bbdfdac /strbuf.c | |
parent | 1a4e40aa5dc16564af879142ba9dfbbb88d1e5ff (diff) | |
download | git-afaef55e230c6fcfb4e8a27c1b970f7e6400a7f6.tar.gz |
git-compat-util: introduce skip_to_optional_arg()
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_optional_arg(arg, "--key", &arg)) {
/* do something with arg */
}
This also introduces skip_to_optional_arg_default() for the few
cases where something different should be done when the first
argument is exactly "--key" than when it is exactly "--key=".
In general it is better for UI consistency and simplicity if
"--key" and "--key=" do the same thing though, so that using
skip_to_optional_arg() should be encouraged compared to
skip_to_optional_arg_default().
Note that these functions 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@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'strbuf.c')
-rw-r--r-- | strbuf.c | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -11,6 +11,28 @@ int starts_with(const char *str, const char *prefix) return 0; } +int skip_to_optional_arg_default(const char *str, const char *prefix, + const char **arg, const char *def) +{ + const char *p; + + if (!skip_prefix(str, prefix, &p)) + return 0; + + if (!*p) { + if (arg) + *arg = def; + return 1; + } + + if (*p != '=') + return 0; + + if (arg) + *arg = p + 1; + return 1; +} + /* * Used as the default ->buf value, so that people can always assume * buf is non NULL and ->buf is NUL terminated even for a freshly |