VLC 4.0.0-dev
|
Functions | |
void | config_CmdLineEarlyScan (libvlc_int_t *p_this, int argc, const char *argv[]) |
Perform early scan of arguments for a small subset of simple options. More... | |
int | config_LoadCmdLine (libvlc_int_t *p_this, int i_argc, const char *ppsz_argv[], int *pindex) |
Parse command line for configuration options. More... | |
void config_CmdLineEarlyScan | ( | libvlc_int_t * | p_this, |
int | argc, | ||
const char * | argv[] | ||
) |
Perform early scan of arguments for a small subset of simple options.
Before proper full processing can be done, which requires full knowledge of all available options, we have a need to perform a preliminary check for a few options that affect plugin loading. This is because the full option set consists of a core subset plus various plugin subsets and we thus need to load plugin data to know the plugin subsets, but there are a few core options that actually affect loading of plugin data.
Note that we want to be cautious about doing too much here. Firstly simply to avoid duplicating effort done later in the proper full processing step. Additionally though because fundamentally the very notion of a preliminary scan is problematic in terms of taking "correct" (or at least consistent) action in the face of certain use or misuse of options. Consider the fact that it is standard practice with option arguments that take a value, should a value not be provided within the same argument, to just consume the next argument as the option's value, no matter whether or not the next argument might "look" like an option itself (or an "early terminator"). Such is the behaviour of getopt. (It may perhaps seem wrong to do things that way, but that's how it works; it would alternatively be wrong for getopt in general to prevent options from taking values that just happen to resemble these things; and besides, bad consumption will only occur through bad option use which is fair to expect to cause incorrect results and in many cases ideally would be caught early by validation checks on option values anyway). So, a preliminary scan, by not knowing the full option set and not following the standard parsing rules (since it can't), naturally introduces risks of "incorrect" or "inconsistent" interpretation of the set of arguments, at least wrt. the later full/proper processing, and the more that we do, the more such incorrect/inconsistent processing scenarios we introduce. Furthermore consider the additional complication of short option "sets" (which is a short option argument involving multiple characters like -abc
). In a short option set only the last option in the set (which is not necessarily its last character) can be one that takes a value, with any characters coming after it (if any) taken as its option value (if none then the next argument is consumed instead). In a preliminary scan where we do not know the full set of available short options, we can risk misinterpreting characters in short option sets as options when they are meant to be consumed as an option value. Thus it is very problematic to properly try to deal with an option like --help
, which comes with the short option -h
as well as --no-help
, here in a preliminary scan, which is unfortunate because it might make a nice optimisation if we could.
Considering this discussion, it is simply best that we keep option checks here to an absolute bare minimum of just the three plugin data related ones that we have no choice but to scan for early, and we must put up with a minimal amount of possible incorrect/inconsistent interpretation as unavoidable. (Though we could add some code after the full scan to determine whether or not the wrong action took place and issue a warning if so).
p_this | object to write command line options as variables to |
argc | number of command line arguments |
argv | command line arguments |
References arg, and VLC_UNUSED.
Referenced by libvlc_InternalInit().
int config_LoadCmdLine | ( | libvlc_int_t * | p_this, |
int | i_argc, | ||
const char * | ppsz_argv[], | ||
int * | pindex | ||
) |
Parse command line for configuration options.
Now that the module_bank has been initialized, we can dynamically generate the longopts structure used by getops. We have to do it this way because we don't know (and don't want to know) in advance the configuration options used (ie. exported) by each module.
p_this | object to write command line options as variables to |
i_argc | number of command line arguments |
ppsz_args | command line arguments [IN/OUT] |
pindex | index of the first non-option argument [OUT] |
References _, asprintf(), CONFIG_CLASS, config_FindConfig(), CONFIG_ITEM, CONFIG_ITEM_BOOL, CONFIG_ITEM_FLOAT, CONFIG_ITEM_INTEGER, CONFIG_ITEM_STRING, container_of, module_value_t::f, vlc_option::flag, vlc_option::has_arg, module_value_t::i, vlc_param::i, module_config_t::i_type, i_type, vlc_option::is_obsolete, vlc_param::item, module_config_t::max, module_config_t::min, vlc_option::name, name, vlc_param::obsolete, p, module_config_t::psz_name, psz_name, vlc_param::shortname, state, strdup(), strtoll(), TS_GREEN, TS_RED_BOLD, TS_RESET, TS_YELLOW, TS_YELLOW_BOLD, vlc_option::val, var_Change(), var_Create(), var_SetBool(), var_SetFloat(), var_SetInteger(), var_SetString(), vlc_alloc(), vlc_atof_c(), vlc_getopt_long(), vlc_jaro_winkler(), vlc_plugins, VLC_VAR_BOOL, VLC_VAR_FLOAT, VLC_VAR_INTEGER, VLC_VAR_SETMINMAX, and VLC_VAR_STRING.
Referenced by libvlc_InternalInit().