diff: parse separate options --stat-width n, --stat-name-width n
Part of a campaign for unstuck forms of options. [jn: with some refactoring] Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Matthieu Moy committed
Aug 5, 2010 at 10:22 UTC
1e57208ef0e48d1d852679a72d3128da333d028d
1 file changed
+23
-5
diff.c
+23
-5
@@ -3035,16 +3035,34 @@ static int stat_opt(struct diff_options *options, const char **av)
3035
char *end;
3036
int width = options->stat_width;
3037
int name_width = options->stat_name_width;
3038
+ int argcount = 1;
3039
3040
arg += strlen("--stat");
3041
end = (char *)arg;
3042
3043
switch (*arg) {
3044
case '-':
3044
- if (!prefixcmp(arg, "-width="))
3045
- width = strtoul(arg + 7, &end, 10);
3046
- else if (!prefixcmp(arg, "-name-width="))
3047
- name_width = strtoul(arg + 12, &end, 10);
3045
+ if (!prefixcmp(arg, "-width")) {
3046
+ arg += strlen("-width");
3047
+ if (*arg == '=')
3048
+ width = strtoul(arg + 1, &end, 10);
3049
+ else if (!*arg && !av[1])
3050
+ die("Option '--stat-width' requires a value");
3051
+ else if (!*arg) {
3052
+ width = strtoul(av[1], &end, 10);
3053
+ argcount = 2;
3054
+ }
3055
+ } else if (!prefixcmp(arg, "-name-width")) {
3056
+ arg += strlen("-name-width");
3057
+ if (*arg == '=')
3058
+ name_width = strtoul(arg + 1, &end, 10);
3059
+ else if (!*arg && !av[1])
3060
+ die("Option '--stat-name-width' requires a value");
3061
+ else if (!*arg) {
3062
+ name_width = strtoul(av[1], &end, 10);
3063
+ argcount = 2;
3064
+ }
3065
+ }
3066
break;
3067
case '=':
3068
width = strtoul(arg+1, &end, 10);
@@ -3058,7 +3076,7 @@ static int stat_opt(struct diff_options *options, const char **av)
3076
options->output_format |= DIFF_FORMAT_DIFFSTAT;
3077
options->stat_name_width = name_width;
3078
options->stat_width = width;
3061
- return 1;
3079
+ return argcount;
3080
}
3081
3082
int diff_opt_parse(struct diff_options *options, const char **av, int ac)