From a01c02bcff755a7891f777706b27452203aac71e Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 10 Jun 2012 17:57:52 +0200 Subject: [PATCH] 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. --- cmdutils.c | 70 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/cmdutils.c b/cmdutils.c index 42029d5fe2..e7476bbcb3 100644 --- a/cmdutils.c +++ b/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); }