cmdutils: split parse_option().
Separate the code that searches for the option to use and the code that actually writes it. The writing code will be reused by the new options parser.
This commit is contained in:
parent
10bca66101
commit
a01c02bcff
70
cmdutils.c
70
cmdutils.c
@ -228,36 +228,14 @@ static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
|
||||
}
|
||||
#endif /* HAVE_COMMANDLINETOARGVW */
|
||||
|
||||
int parse_option(void *optctx, const char *opt, const char *arg,
|
||||
const OptionDef *options)
|
||||
static int write_option(void *optctx, const OptionDef *po, const char *opt,
|
||||
const char *arg)
|
||||
{
|
||||
const OptionDef *po;
|
||||
int bool_val = 1;
|
||||
int *dstcount;
|
||||
void *dst;
|
||||
|
||||
po = find_option(options, opt);
|
||||
if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
|
||||
/* handle 'no' bool option */
|
||||
po = find_option(options, opt + 2);
|
||||
if ((po->name && (po->flags & OPT_BOOL)))
|
||||
bool_val = 0;
|
||||
}
|
||||
if (!po->name)
|
||||
po = find_option(options, "default");
|
||||
if (!po->name) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (po->flags & HAS_ARG && !arg) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
/* new-style options contain an offset into optctx, old-style address of
|
||||
* a global var*/
|
||||
dst = po->flags & (OPT_OFFSET | OPT_SPEC) ? (uint8_t *)optctx + po->u.off
|
||||
: po->u.dst_ptr;
|
||||
void *dst = po->flags & (OPT_OFFSET | OPT_SPEC) ?
|
||||
(uint8_t *)optctx + po->u.off : po->u.dst_ptr;
|
||||
int *dstcount;
|
||||
|
||||
if (po->flags & OPT_SPEC) {
|
||||
SpecifierOpt **so = dst;
|
||||
@ -274,9 +252,7 @@ int parse_option(void *optctx, const char *opt, const char *arg,
|
||||
str = av_strdup(arg);
|
||||
av_freep(dst);
|
||||
*(char **)dst = str;
|
||||
} else if (po->flags & OPT_BOOL) {
|
||||
*(int *)dst = bool_val;
|
||||
} else if (po->flags & OPT_INT) {
|
||||
} else if (po->flags & OPT_BOOL || po->flags & OPT_INT) {
|
||||
*(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
|
||||
} else if (po->flags & OPT_INT64) {
|
||||
*(int64_t *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
|
||||
@ -296,6 +272,40 @@ int parse_option(void *optctx, const char *opt, const char *arg,
|
||||
}
|
||||
if (po->flags & OPT_EXIT)
|
||||
exit(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int parse_option(void *optctx, const char *opt, const char *arg,
|
||||
const OptionDef *options)
|
||||
{
|
||||
const OptionDef *po;
|
||||
int ret;
|
||||
|
||||
po = find_option(options, opt);
|
||||
if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
|
||||
/* handle 'no' bool option */
|
||||
po = find_option(options, opt + 2);
|
||||
if ((po->name && (po->flags & OPT_BOOL)))
|
||||
arg = "0";
|
||||
} else if (po->flags & OPT_BOOL)
|
||||
arg = "1";
|
||||
|
||||
if (!po->name)
|
||||
po = find_option(options, "default");
|
||||
if (!po->name) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (po->flags & HAS_ARG && !arg) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
ret = write_option(optctx, po, opt, arg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return !!(po->flags & HAS_ARG);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user