bpo-36301: Cleanup preconfig code (GH-12535)

Prepare code to move some _PyPreConfig parameters into _PyPreCmdline.
Changes:

* _PyCoreConfig_ReadFromArgv(): remove preconfig parameter,
  use _PyRuntime.preconfig.
* Add _PyPreCmdline_GetPreConfig() (called by _PyPreConfig_Read()).
* Rename _PyPreCmdline_Init() to _PyPreCmdline_SetArgv()
* Factorize _Py_PreInitializeFromPreConfig() code: add
  pyinit_preinit().
* _PyPreConfig_Read() now sets coerce_c_locale to 2 if it must be
  coerced.
* Remove _PyCoreConfig_ReadPreConfig().
* _PyCoreConfig_Write() now copies updated preconfig into _PyRuntime.
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 994a94f..ea1b731 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -714,23 +714,8 @@
 }
 
 
-_PyInitError
-_Py_PreInitializeFromPreConfig(_PyPreConfig *config)
-{
-    if (config != NULL) {
-        _PyInitError err = _PyPreConfig_Write(config);
-        if (_Py_INIT_FAILED(err)) {
-            return err;
-        }
-    }
-
-    _PyRuntime.pre_initialized = 1;
-    return _Py_INIT_OK();
-}
-
-
 static _PyInitError
-pyinit_preconfig(_PyPreConfig *config, const _PyPreConfig *src_config)
+pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config)
 {
     _PyInitError err;
 
@@ -739,32 +724,46 @@
         return err;
     }
 
-    if (_PyPreConfig_Copy(config, src_config) < 0) {
-        return _Py_INIT_ERR("failed to copy pre config");
+    if (_PyRuntime.pre_initialized) {
+        /* If it's already configured: ignored the new configuration */
+        return _Py_INIT_OK();
     }
 
-    err = _PyPreConfig_Read(config);
+    if (src_config) {
+        if (_PyPreConfig_Copy(config, src_config) < 0) {
+            return _Py_INIT_ERR("failed to copy pre config");
+        }
+    }
+
+    err = _PyPreConfig_Read(config, NULL);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
 
-    return _Py_PreInitializeFromPreConfig(config);
+    err = _PyPreConfig_Write(config);
+    if (_Py_INIT_FAILED(err)) {
+        return err;
+    }
+
+    _PyRuntime.pre_initialized = 1;
+    return _Py_INIT_OK();
+}
+
+
+_PyInitError
+_Py_PreInitializeFromPreConfig(_PyPreConfig *config)
+{
+    return pyinit_preinit(config, NULL);
 }
 
 
 _PyInitError
 _Py_PreInitialize(void)
 {
-    _PyInitError err = _PyRuntime_Initialize();
-    if (_Py_INIT_FAILED(err)) {
-        return err;
-    }
-
-    if (_PyRuntime.pre_initialized) {
-        return _Py_INIT_OK();
-    }
-
-    return _Py_PreInitializeFromPreConfig(NULL);
+    _PyPreConfig config = _PyPreConfig_INIT;
+    _PyInitError err = pyinit_preinit(&config, NULL);
+    _PyPreConfig_Clear(&config);
+    return err;
 }
 
 
@@ -776,7 +775,7 @@
         return _Py_INIT_ERR("failed to copy core config");
     }
 
-    _PyInitError err = _PyCoreConfig_Read(config, NULL);
+    _PyInitError err = _PyCoreConfig_Read(config);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
@@ -817,7 +816,7 @@
 
     _PyCoreConfig local_config = _PyCoreConfig_INIT;
 
-    err = pyinit_preconfig(&local_config.preconfig, &src_config->preconfig);
+    err = pyinit_preinit(&local_config.preconfig, &src_config->preconfig);
     if (_Py_INIT_FAILED(err)) {
         goto done;
     }