diff options
Diffstat (limited to 'Python/coreconfig.c')
-rw-r--r-- | Python/coreconfig.c | 95 |
1 files changed, 60 insertions, 35 deletions
diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 3486da4..a6aa89b 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -23,13 +23,6 @@ /* --- Command line options --------------------------------------- */ -#define PROGRAM_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?" - -static const _PyOS_LongOption longoptions[] = { - {L"check-hash-based-pycs", 1, 0}, - {NULL, 0, 0}, -}; - /* Short usage message (with %s for argv0) */ static const char usage_line[] = "usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n"; @@ -1483,28 +1476,61 @@ config_init_fs_encoding(_PyCoreConfig *config) } -/* Read configuration settings from standard locations - * - * This function doesn't make any changes to the interpreter state - it - * merely populates any missing configuration settings. This allows an - * embedding application to completely override a config option by - * setting it before calling this function, or else modify the default - * setting before passing the fully populated config to Py_EndInitialization. - * - * More advanced selective initialization tricks are possible by calling - * this function multiple times with various preconfigured settings. - */ +static _PyInitError +_PyCoreConfig_ReadPreConfig(_PyCoreConfig *config) +{ + _PyInitError err; + _PyPreConfig local_preconfig = _PyPreConfig_INIT; + _PyPreConfig_GetGlobalConfig(&local_preconfig); + + if (_PyPreConfig_Copy(&local_preconfig, &config->preconfig) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + err = _PyPreConfig_Read(&local_preconfig); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + if (_PyPreConfig_Copy(&config->preconfig, &local_preconfig) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + err = _Py_INIT_OK(); + +done: + _PyPreConfig_Clear(&local_preconfig); + return err; +} + + +/* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE + locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). + Read the configuration from: + + * Environment variables + * Py_xxx global configuration variables + + See _PyCoreConfig_ReadFromArgv() to parse also command line arguments. */ _PyInitError -_PyCoreConfig_Read(_PyCoreConfig *config) +_PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) { _PyInitError err; _PyCoreConfig_GetGlobalConfig(config); - err = _PyPreConfig_Read(&config->preconfig); - if (_Py_INIT_FAILED(err)) { - return err; + if (preconfig != NULL) { + if (_PyPreConfig_Copy(&config->preconfig, preconfig) < 0) { + return _Py_INIT_NO_MEMORY(); + } + } + else { + err = _PyCoreConfig_ReadPreConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } } assert(config->preconfig.use_environment >= 0); @@ -1851,8 +1877,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, _PyOS_ResetGetOpt(); do { int longindex = -1; - int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, PROGRAM_OPTS, - longoptions, &longindex); + int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, &longindex); if (c == EOF) { break; } @@ -1915,8 +1940,9 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, config->interactive++; break; + case 'E': case 'I': - config->preconfig.isolated++; + /* option handled by _PyPreConfig_ReadFromArgv() */ break; /* case 'J': reserved for Jython */ @@ -1937,10 +1963,6 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, config->site_import = 0; break; - case 'E': - config->preconfig.use_environment = 0; - break; - case 't': /* ignored for backwards compatibility */ break; @@ -2235,7 +2257,8 @@ config_usage(int error, const wchar_t* program) /* Parse command line options and environment variables. */ static _PyInitError -config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) +config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, + const _PyPreConfig *preconfig) { int need_usage = 0; _PyInitError err; @@ -2271,7 +2294,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) return err; } - err = _PyCoreConfig_Read(config); + err = _PyCoreConfig_Read(config, preconfig); if (_Py_INIT_FAILED(err)) { return err; } @@ -2296,7 +2319,8 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) static _PyInitError -config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args) +config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args, + const _PyPreConfig *preconfig) { _PyInitError err; @@ -2309,7 +2333,7 @@ config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args) goto done; } - err = config_from_cmdline(config, &cmdline); + err = config_from_cmdline(config, &cmdline, preconfig); if (_Py_INIT_FAILED(err)) { goto done; } @@ -2330,7 +2354,8 @@ done: * Environment variables * Py_xxx global configuration variables */ _PyInitError -_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) +_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, + const _PyPreConfig *preconfig) { _PyInitError err; int init_utf8_mode = Py_UTF8Mode; @@ -2381,7 +2406,7 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = config_read_from_argv_impl(config, args); + err = config_read_from_argv_impl(config, args, preconfig); if (_Py_INIT_FAILED(err)) { goto done; } |