Mercurial > mplayer.hg
changeset 26408:7a36d5941fd8
Replace the trivial command line preparser with a more robust version
allowing all kind of options to be used.
author | albeu |
---|---|
date | Sun, 13 Apr 2008 19:18:51 +0000 |
parents | 7451ffea2efb |
children | 2deb4c25db1c |
files | cfg-common-opts.h m_config.c m_option.h mencoder.c mplayer.c parser-cfg.c parser-cfg.h |
diffstat | 7 files changed, 67 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/cfg-common-opts.h Sun Apr 13 11:15:08 2008 +0000 +++ b/cfg-common-opts.h Sun Apr 13 19:18:51 2008 +0000 @@ -6,7 +6,7 @@ // ------------------------- common options -------------------- {"quiet", &quiet, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL}, {"noquiet", &quiet, CONF_TYPE_FLAG, CONF_GLOBAL, 1, 0, NULL}, - {"really-quiet", &verbose, CONF_TYPE_FLAG, CONF_GLOBAL, 0, -10, NULL}, + {"really-quiet", &verbose, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_PRE_PARSE, 0, -10, NULL}, {"v", cfg_inc_verbose, CONF_TYPE_FUNC, CONF_GLOBAL|CONF_NOSAVE, 0, 0, NULL}, {"msglevel", msgl_config, CONF_TYPE_SUBCONFIG, CONF_GLOBAL, 0, 0, NULL}, {"msgcolor", &mp_msg_color, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL},
--- a/m_config.c Sun Apr 13 11:15:08 2008 +0000 +++ b/m_config.c Sun Apr 13 19:18:51 2008 +0000 @@ -308,6 +308,13 @@ mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_InvalidCmdlineOption,arg); return M_OPT_INVALID; } + // During command line preparse set only pre-parse options + // Otherwise only set pre-parse option if they were not already set. + if(((config->mode == M_COMMAND_LINE_PRE_PARSE) && + !(co->opt->flags & M_OPT_PRE_PARSE)) || + ((config->mode != M_COMMAND_LINE_PRE_PARSE) && + (co->opt->flags & M_OPT_PRE_PARSE) && (co->flags & M_CFG_OPT_SET))) + set = 0; // Option with children are a bit different to parse if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) {
--- a/m_option.h Sun Apr 13 11:15:08 2008 +0000 +++ b/m_option.h Sun Apr 13 19:18:51 2008 +0000 @@ -321,6 +321,9 @@ /// option only if it was set by the user. #define M_OPT_OLD (1<<6) +/// The option should be set during command line pre-parsing +#define M_OPT_PRE_PARSE (1<<7) + /// \defgroup OldOptionFlags Backward compatibility /// /// These are kept for compatibility with older code. @@ -333,6 +336,7 @@ #define CONF_GLOBAL M_OPT_GLOBAL #define CONF_NOSAVE M_OPT_NOSAVE #define CONF_OLD M_OPT_OLD +#define CONF_PRE_PARSE M_OPT_PRE_PARSE ///@} ///@} @@ -395,6 +399,8 @@ #define M_CONFIG_FILE 0 /// Set when parsing command line arguments. #define M_COMMAND_LINE 1 +/// Set when pre-parsing the command line +#define M_COMMAND_LINE_PRE_PARSE 2 ///@}
--- a/mencoder.c Sun Apr 13 11:15:08 2008 +0000 +++ b/mencoder.c Sun Apr 13 19:18:51 2008 +0000 @@ -408,9 +408,12 @@ mp_msg_init(); - for(i=1; i<argc; i++) - if(!strcmp(argv[i], "-really-quiet")) - verbose= -10; + // Create the config context and register the options + mconfig = m_config_new(); + m_config_register_options(mconfig,mencoder_opts); + + // Preparse the command line + m_config_preparse_command_line(mconfig,argc,argv); mp_msg(MSGT_CPLAYER,MSGL_INFO, "MEncoder " VERSION " (C) 2000-2008 MPlayer Team\n"); @@ -465,8 +468,6 @@ } } - mconfig = m_config_new(); - m_config_register_options(mconfig,mencoder_opts); parse_cfgfiles(mconfig); filelist = m_config_parse_me_command_line(mconfig, argc, argv); if(!filelist) mencoder_exit(1, MSGTR_ErrorParsingCommandLine);
--- a/mplayer.c Sun Apr 13 11:15:08 2008 +0000 +++ b/mplayer.c Sun Apr 13 19:18:51 2008 +0000 @@ -2554,9 +2554,13 @@ mp_msg_init(); - for(i=1; i<argc; i++) - if(!strcmp(argv[i], "-really-quiet")) - verbose= -10; + // Create the config context and register the options + mconfig = m_config_new(); + m_config_register_options(mconfig,mplayer_opts); + mp_input_register_options(mconfig); + + // Preparse the command line + m_config_preparse_command_line(mconfig,argc,argv); print_version(); #if defined(WIN32) && defined(USE_WIN32DLL) @@ -2582,10 +2586,6 @@ use_gui=1; } - mconfig = m_config_new(); - m_config_register_options(mconfig,mplayer_opts); - // TODO : add something to let modules register their options - mp_input_register_options(mconfig); parse_cfgfiles(mconfig); #ifdef HAVE_NEW_GUI
--- a/parser-cfg.c Sun Apr 13 11:15:08 2008 +0000 +++ b/parser-cfg.c Sun Apr 13 19:18:51 2008 +0000 @@ -245,4 +245,42 @@ return ret; } +extern int mp_msg_levels[]; + +/// Parse the command line option that must be handled at startup. +int m_config_preparse_command_line(m_config_t *config, int argc, char **argv) +{ + int msg_lvl, i, r, ret = 0; + char* arg; + m_option_t* opt; + + // Hack to shutup the parser error messages. + msg_lvl = mp_msg_levels[MSGT_CFGPARSER]; + mp_msg_levels[MSGT_CFGPARSER] = -11; + + config->mode = M_COMMAND_LINE_PRE_PARSE; + + for(i = 1 ; i < argc ; i++) { + arg = argv[i]; + // Ignore non option + if(arg[0] != '-' || arg[1] == 0) continue; + arg++; + // No more options after -- + if(arg[0] == '-' && arg[1] == 0) break; + + opt = m_config_get_option(config,arg); + // Ignore invalid option + if(!opt) continue; + // Set, non-pre-parse options will be ignored + r = m_config_set_option(config,arg, + i+1 < argc ? argv[i+1] : NULL); + if(r < 0) ret = r; + else i += r; + } + + mp_msg_levels[MSGT_CFGPARSER] = msg_lvl; + + return ret; +} + ///@}