diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-12-19 21:53:22 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2012-12-19 22:13:41 +0100 |
commit | c661cb6672af5ebcb900ec8766b24761bd2ab011 (patch) | |
tree | 3295a421dc28e65a0e86b38cc32a8e050293f5b4 | |
parent | bb2bab92e737394a5b91df650fab7f3992c8af59 (diff) | |
download | ffmpeg-c661cb6672af5ebcb900ec8766b24761bd2ab011.tar.gz |
cmdutils: pass number of groups to split_commandline().
This makes the code simpler and avoids mixing designated and
non-designated initializers in a potentially unsafe way in avconv.
-rw-r--r-- | avconv_opt.c | 4 | ||||
-rw-r--r-- | cmdutils.c | 24 | ||||
-rw-r--r-- | cmdutils.h | 2 |
3 files changed, 14 insertions, 16 deletions
diff --git a/avconv_opt.c b/avconv_opt.c index 6c7017572e..ce32df6b6b 100644 --- a/avconv_opt.c +++ b/avconv_opt.c @@ -1862,7 +1862,6 @@ enum OptGroup { static const OptionGroupDef groups[] = { [GROUP_OUTFILE] = { "output file", NULL }, [GROUP_INFILE] = { "input file", "i" }, - { 0 }, }; static int open_files(OptionGroupList *l, const char *inout, @@ -1907,7 +1906,8 @@ int avconv_parse_options(int argc, char **argv) memset(&octx, 0, sizeof(octx)); /* split the commandline into an internal representation */ - ret = split_commandline(&octx, argc, argv, options, groups); + ret = split_commandline(&octx, argc, argv, options, groups, + FF_ARRAY_ELEMS(groups)); if (ret < 0) { av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: "); goto fail; diff --git a/cmdutils.c b/cmdutils.c index 578ddf3b6f..1ea05dfe5c 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -443,14 +443,15 @@ int opt_default(void *optctx, const char *opt, const char *arg) * * @return index of the group definition that matched or -1 if none */ -static int match_group_separator(const OptionGroupDef *groups, const char *opt) +static int match_group_separator(const OptionGroupDef *groups, int nb_groups, + const char *opt) { - const OptionGroupDef *p = groups; + int i; - while (p->name) { + for (i = 0; i < nb_groups; i++) { + const OptionGroupDef *p = &groups[i]; if (p->sep && !strcmp(p->sep, opt)) - return p - groups; - p++; + return i; } return -1; @@ -506,17 +507,14 @@ static void add_opt(OptionParseContext *octx, const OptionDef *opt, } static void init_parse_context(OptionParseContext *octx, - const OptionGroupDef *groups) + const OptionGroupDef *groups, int nb_groups) { static const OptionGroupDef global_group = { "global" }; - const OptionGroupDef *g = groups; int i; memset(octx, 0, sizeof(*octx)); - while (g->name) - g++; - octx->nb_groups = g - groups; + octx->nb_groups = nb_groups; octx->groups = av_mallocz(sizeof(*octx->groups) * octx->nb_groups); if (!octx->groups) exit(1); @@ -557,14 +555,14 @@ void uninit_parse_context(OptionParseContext *octx) int split_commandline(OptionParseContext *octx, int argc, char *argv[], const OptionDef *options, - const OptionGroupDef *groups) + const OptionGroupDef *groups, int nb_groups) { int optindex = 1; /* perform system-dependent conversions for arguments list */ prepare_app_arguments(&argc, &argv); - init_parse_context(octx, groups); + init_parse_context(octx, groups, nb_groups); av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n"); while (optindex < argc) { @@ -592,7 +590,7 @@ do { \ } while (0) /* named group separators, e.g. -i */ - if ((ret = match_group_separator(groups, opt)) >= 0) { + if ((ret = match_group_separator(groups, nb_groups, opt)) >= 0) { GET_ARG(arg); finish_group(octx, ret, arg); av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n", diff --git a/cmdutils.h b/cmdutils.h index 1af30d7676..ed9c68e9c0 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -286,7 +286,7 @@ int parse_optgroup(void *optctx, OptionGroup *g); */ int split_commandline(OptionParseContext *octx, int argc, char *argv[], const OptionDef *options, - const OptionGroupDef *groups); + const OptionGroupDef *groups, int nb_groups); /** * Free all allocated memory in an OptionParseContext. |