aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-12-19 22:24:37 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-12-19 22:24:54 +0100
commit465c7de7924db37f21bb47c667466aeddedde05d (patch)
tree98db0e7b1b54c0ba5574e0c4ade3da104c718a8c
parent330983b728cceaf8f18557f23e333375a76f1a73 (diff)
parenta01c02bcff755a7891f777706b27452203aac71e (diff)
downloadffmpeg-465c7de7924db37f21bb47c667466aeddedde05d.tar.gz
Merge commit 'a01c02bcff755a7891f777706b27452203aac71e'
* commit 'a01c02bcff755a7891f777706b27452203aac71e': cmdutils: split parse_option(). Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--cmdutils.c70
1 files changed, 40 insertions, 30 deletions
diff --git a/cmdutils.c b/cmdutils.c
index fb01a947a7..0b723e9c97 100644
--- a/cmdutils.c
+++ b/cmdutils.c
@@ -262,36 +262,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;
@@ -308,9 +286,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);
@@ -330,6 +306,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);
}