Skip to content

Commit

Permalink
cmdutils: split parse_option().
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
elenril committed Dec 18, 2012
1 parent 10bca66 commit a01c02b
Showing 1 changed file with 40 additions and 30 deletions.
70 changes: 40 additions & 30 deletions cmdutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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);
}

Expand Down

0 comments on commit a01c02b

Please sign in to comment.