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;
+}
+
 ///@}
--- a/parser-cfg.h	Sun Apr 13 11:15:08 2008 +0000
+++ b/parser-cfg.h	Sun Apr 13 19:18:51 2008 +0000
@@ -5,4 +5,6 @@
 
 int m_config_parse_config_file(m_config_t* config, char *conffile);
 
+int m_config_preparse_command_line(m_config_t *config, int argc, char **argv);
+
 #endif /* MPLAYER_PARSER_CFG_H */