diff: split off a function for --stat-* option parsing

As an optimization, the diff_opt_parse() switchboard has
a single case for all the --stat-* options.  Split it
off into a separate function so we can enhance it
without bringing code dangerously close to the right
margin.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Nieder 2010-08-05 10:22:53 +02:00 коммит произвёл Junio C Hamano
Родитель dea007fb4c
Коммит 4d7f7a4ae7
1 изменённых файлов: 35 добавлений и 27 удалений

62
diff.c
Просмотреть файл

@ -3029,6 +3029,38 @@ int parse_long_opt(const char *opt, const char **argv,
return 2; return 2;
} }
static int stat_opt(struct diff_options *options, const char **av)
{
const char *arg = av[0];
char *end;
int width = options->stat_width;
int name_width = options->stat_name_width;
arg += strlen("--stat");
end = (char *)arg;
switch (*arg) {
case '-':
if (!prefixcmp(arg, "-width="))
width = strtoul(arg + 7, &end, 10);
else if (!prefixcmp(arg, "-name-width="))
name_width = strtoul(arg + 12, &end, 10);
break;
case '=':
width = strtoul(arg+1, &end, 10);
if (*end == ',')
name_width = strtoul(end+1, &end, 10);
}
/* Important! This checks all the error cases! */
if (*end)
return 0;
options->output_format |= DIFF_FORMAT_DIFFSTAT;
options->stat_name_width = name_width;
options->stat_width = width;
return 1;
}
int diff_opt_parse(struct diff_options *options, const char **av, int ac) int diff_opt_parse(struct diff_options *options, const char **av, int ac)
{ {
const char *arg = av[0]; const char *arg = av[0];
@ -3070,33 +3102,9 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
options->output_format |= DIFF_FORMAT_NAME_STATUS; options->output_format |= DIFF_FORMAT_NAME_STATUS;
else if (!strcmp(arg, "-s")) else if (!strcmp(arg, "-s"))
options->output_format |= DIFF_FORMAT_NO_OUTPUT; options->output_format |= DIFF_FORMAT_NO_OUTPUT;
else if (!prefixcmp(arg, "--stat")) { else if (!prefixcmp(arg, "--stat"))
char *end; /* --stat, --stat-width, or --stat-name-width */
int width = options->stat_width; return stat_opt(options, av);
int name_width = options->stat_name_width;
arg += 6;
end = (char *)arg;
switch (*arg) {
case '-':
if (!prefixcmp(arg, "-width="))
width = strtoul(arg + 7, &end, 10);
else if (!prefixcmp(arg, "-name-width="))
name_width = strtoul(arg + 12, &end, 10);
break;
case '=':
width = strtoul(arg+1, &end, 10);
if (*end == ',')
name_width = strtoul(end+1, &end, 10);
}
/* Important! This checks all the error cases! */
if (*end)
return 0;
options->output_format |= DIFF_FORMAT_DIFFSTAT;
options->stat_name_width = name_width;
options->stat_width = width;
}
/* renames options */ /* renames options */
else if (!prefixcmp(arg, "-B")) { else if (!prefixcmp(arg, "-B")) {