Re: [PATCH 1/4] Allow detached form (e.g. "-S foo" instead of "-Sfoo") for diff options
> +++ b/diff.c
> @@ -2990,9 +2990,23 @@ static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *va
Show 11 quoted lines
> +#define IF_SHORT_OPT(optname) \
> + ((!strcmp(arg, "-" #optname) \
> + && (argv[1] || (die("Option `" #optname "' requires a value"), 1), \
> + optarg = argv[1], \
> + argcount = 2, \
> + 1)) || \
> + (!prefixcmp(arg, "-" #optname) \
> + && (optarg = arg + strlen("-" #optname), \
> + argcount = 1, \
> + 1)))
> +Why not something like this?
static inline int short_opt(char opt, const char *arg,
const char *argv, const char **optarg)
{
if (arg[0] != '-' || arg[1] != opt)
return 0;
if (arg[2] != '\0') {
*optarg = arg + strlen("-c");
return 1;
}
if (!argv[1])
die("Option '%c' requires a value", opt);
*optarg = argv[1];
return 2;
}and then:
if ((argcount = short_opt('S', arg, argv, &optarg))) {
...Show 19 quoted lines
> +++ b/diff.h
> @@ -214,6 +214,21 @@ extern void diff_unmerge(struct diff_options *,
> #define DIFF_SETUP_USE_CACHE 2
> #define DIFF_SETUP_USE_SIZE_CACHE 4
>
> +/*
> + * Poor man's alternative to parse-option, only meant to be used in
> + * handle_revision_opt and diff_opt_parse.
> + */
> +#define IF_LONG_OPT(optname) \
> + ((!strcmp(arg, "--" #optname) \
> + && (argv[1] || (die("Option `" #optname "' requires a value"), 1), \
> + optarg = argv[1], \
> + argcount = 2, \
> + 1)) || \
> + (!prefixcmp(arg, "--" #optname "=") \
> + && (optarg = arg + strlen("--" #optname "="), \
> + argcount = 1, \
> + 1))) static int long_opt(const char *opt, const char *arg,
const char **argv, const char **optarg)
{
if (arg[0] != '-' || arg[1] != '-')
return 0;
if (prefixcmp(arg, opt))
return 0;
arg += strlen("--") + strlen(opt);
if (*arg == '=') {
*optarg = arg + 1;
return 1;
}
if (*arg != '\0')
return 0;
if (!argv[1])
die("Option '--%s' requires a value", opt);
*optarg = argv[1];
return 2;
}Jonathan