bpo-36301: Add _PyPreCmdline internal API (GH-12458) · python/cpython@fa15376 (original) (raw)
`@@ -1658,7 +1658,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)
`
1658
1658
`/* --- _PyCmdline ------------------------------------------------- */
`
1659
1659
``
1660
1660
`typedef struct {
`
1661
``
`-
_PyWstrList argv;
`
``
1661
`+
_PyPreCmdline precmdline;
`
1662
1662
`_PyWstrList warnoptions; /* Command line -W options */
`
1663
1663
`_PyWstrList env_warnoptions; /* PYTHONWARNINGS environment variables */
`
1664
1664
`int print_help; /* -h, -? options */
`
`@@ -1669,9 +1669,9 @@ typedef struct {
`
1669
1669
`static void
`
1670
1670
`cmdline_clear(_PyCmdline *cmdline)
`
1671
1671
`{
`
``
1672
`+
_PyPreCmdline_Clear(&cmdline->precmdline);
`
1672
1673
`_PyWstrList_Clear(&cmdline->warnoptions);
`
1673
1674
`_PyWstrList_Clear(&cmdline->env_warnoptions);
`
1674
``
`-
_PyWstrList_Clear(&cmdline->argv);
`
1675
1675
`}
`
1676
1676
``
1677
1677
``
`@@ -1682,10 +1682,12 @@ static _PyInitError
`
1682
1682
`config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
`
1683
1683
`int *need_usage)
`
1684
1684
`{
`
``
1685
`+
const _PyWstrList *argv = &cmdline->precmdline.argv;
`
``
1686
+
1685
1687
`_PyOS_ResetGetOpt();
`
1686
1688
`do {
`
1687
1689
`int longindex = -1;
`
1688
``
`-
int c = _PyOS_GetOpt(cmdline->argv.length, cmdline->argv.items, &longindex);
`
``
1690
`+
int c = _PyOS_GetOpt(argv->length, argv->items, &longindex);
`
1689
1691
`if (c == EOF) {
`
1690
1692
`break;
`
1691
1693
` }
`
`@@ -1754,6 +1756,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
`
1754
1756
``
1755
1757
`case 'E':
`
1756
1758
`case 'I':
`
``
1759
`+
case 'X':
`
1757
1760
`/* option handled by _PyPreConfig_ReadFromArgv() */
`
1758
1761
`break;
`
1759
1762
``
`@@ -1806,12 +1809,6 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
`
1806
1809
` }
`
1807
1810
`break;
`
1808
1811
``
1809
``
`-
case 'X':
`
1810
``
`-
if (_PyWstrList_Append(&config->xoptions, _PyOS_optarg) < 0) {
`
1811
``
`-
return _Py_INIT_NO_MEMORY();
`
1812
``
`-
}
`
1813
``
`-
break;
`
1814
``
-
1815
1812
`case 'q':
`
1816
1813
`config->quiet++;
`
1817
1814
`break;
`
`@@ -1830,11 +1827,11 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
`
1830
1827
` } while (1);
`
1831
1828
``
1832
1829
`if (config->run_command == NULL && config->run_module == NULL
`
1833
``
`-
&& _PyOS_optind < cmdline->argv.length
`
1834
``
`-
&& wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0
`
``
1830
`+
&& _PyOS_optind < argv->length
`
``
1831
`+
&& wcscmp(argv->items[_PyOS_optind], L"-") != 0
`
1835
1832
`&& config->run_filename == NULL)
`
1836
1833
` {
`
1837
``
`-
config->run_filename = _PyMem_RawWcsdup(cmdline->argv.items[_PyOS_optind]);
`
``
1834
`+
config->run_filename = _PyMem_RawWcsdup(argv->items[_PyOS_optind]);
`
1838
1835
`if (config->run_filename == NULL) {
`
1839
1836
`return _Py_INIT_NO_MEMORY();
`
1840
1837
` }
`
`@@ -1892,9 +1889,10 @@ cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config)
`
1892
1889
`static _PyInitError
`
1893
1890
`config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline)
`
1894
1891
`{
`
``
1892
`+
const _PyWstrList *argv = &cmdline->precmdline.argv;
`
1895
1893
`wchar_t *program;
`
1896
``
`-
if (cmdline->argv.length >= 1) {
`
1897
``
`-
program = cmdline->argv.items[0];
`
``
1894
`+
if (argv->length >= 1) {
`
``
1895
`+
program = argv->items[0];
`
1898
1896
` }
`
1899
1897
`else {
`
1900
1898
`program = L"";
`
`@@ -1965,24 +1963,25 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline)
`
1965
1963
`static _PyInitError
`
1966
1964
`config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline)
`
1967
1965
`{
`
1968
``
`-
_PyWstrList wargv = _PyWstrList_INIT;
`
``
1966
`+
const _PyWstrList *cmdline_argv = &cmdline->precmdline.argv;
`
``
1967
`+
_PyWstrList config_argv = _PyWstrList_INIT;
`
1969
1968
``
1970
1969
`/* Copy argv to be able to modify it (to force -c/-m) */
`
1971
``
`-
if (cmdline->argv.length <= _PyOS_optind) {
`
``
1970
`+
if (cmdline_argv->length <= _PyOS_optind) {
`
1972
1971
`/* Ensure at least one (empty) argument is seen */
`
1973
``
`-
if (_PyWstrList_Append(&wargv, L"") < 0) {
`
``
1972
`+
if (_PyWstrList_Append(&config_argv, L"") < 0) {
`
1974
1973
`return _Py_INIT_NO_MEMORY();
`
1975
1974
` }
`
1976
1975
` }
`
1977
1976
`else {
`
1978
1977
`_PyWstrList slice;
`
1979
``
`-
slice.length = cmdline->argv.length - _PyOS_optind;
`
1980
``
`-
slice.items = &cmdline->argv.items[_PyOS_optind];
`
1981
``
`-
if (_PyWstrList_Copy(&wargv, &slice) < 0) {
`
``
1978
`+
slice.length = cmdline_argv->length - _PyOS_optind;
`
``
1979
`+
slice.items = &cmdline_argv->items[_PyOS_optind];
`
``
1980
`+
if (_PyWstrList_Copy(&config_argv, &slice) < 0) {
`
1982
1981
`return _Py_INIT_NO_MEMORY();
`
1983
1982
` }
`
1984
1983
` }
`
1985
``
`-
assert(wargv.length >= 1);
`
``
1984
`+
assert(config_argv.length >= 1);
`
1986
1985
``
1987
1986
`wchar_t *arg0 = NULL;
`
1988
1987
`if (config->run_command != NULL) {
`
`@@ -1996,16 +1995,16 @@ config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline)
`
1996
1995
`if (arg0 != NULL) {
`
1997
1996
`arg0 = _PyMem_RawWcsdup(arg0);
`
1998
1997
`if (arg0 == NULL) {
`
1999
``
`-
_PyWstrList_Clear(&wargv);
`
``
1998
`+
_PyWstrList_Clear(&config_argv);
`
2000
1999
`return _Py_INIT_NO_MEMORY();
`
2001
2000
` }
`
2002
2001
``
2003
``
`-
PyMem_RawFree(wargv.items[0]);
`
2004
``
`-
wargv.items[0] = arg0;
`
``
2002
`+
PyMem_RawFree(config_argv.items[0]);
`
``
2003
`+
config_argv.items[0] = arg0;
`
2005
2004
` }
`
2006
2005
``
2007
2006
`_PyWstrList_Clear(&config->argv);
`
2008
``
`-
config->argv = wargv;
`
``
2007
`+
config->argv = config_argv;
`
2009
2008
`return _Py_INIT_OK();
`
2010
2009
`}
`
2011
2010
``
`@@ -2046,6 +2045,16 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
`
2046
2045
` }
`
2047
2046
` }
`
2048
2047
``
``
2048
`+
err = _PyPreCmdline_Read(&cmdline->precmdline);
`
``
2049
`+
if (_Py_INIT_FAILED(err)) {
`
``
2050
`+
return err;
`
``
2051
`+
}
`
``
2052
+
``
2053
`+
_PyPreCmdline_SetPreConfig(&cmdline->precmdline, &config->preconfig);
`
``
2054
`+
if (_PyWstrList_Extend(&config->xoptions, &cmdline->precmdline.xoptions) < 0) {
`
``
2055
`+
return _Py_INIT_NO_MEMORY();
`
``
2056
`+
}
`
``
2057
+
2049
2058
`err = config_parse_cmdline(config, cmdline, &need_usage);
`
2050
2059
`if (_Py_INIT_FAILED(err)) {
`
2051
2060
`return err;
`
`@@ -2089,7 +2098,8 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
`
2089
2098
`return err;
`
2090
2099
` }
`
2091
2100
``
2092
``
`-
if (_Py_SetArgcArgv(cmdline->argv.length, cmdline->argv.items) < 0) {
`
``
2101
`+
const _PyWstrList *argv = &cmdline->precmdline.argv;
`
``
2102
`+
if (_Py_SetArgcArgv(argv->length, argv->items) < 0) {
`
2093
2103
`return _Py_INIT_NO_MEMORY();
`
2094
2104
` }
`
2095
2105
`return _Py_INIT_OK();
`
`@@ -2107,10 +2117,9 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args,
`
2107
2117
`{
`
2108
2118
`_PyInitError err;
`
2109
2119
``
2110
``
`-
_PyCmdline cmdline;
`
2111
``
`-
memset(&cmdline, 0, sizeof(cmdline));
`
``
2120
`+
_PyCmdline cmdline = {.precmdline = _PyPreCmdline_INIT};
`
2112
2121
``
2113
``
`-
err = _PyArgv_AsWstrList(args, &cmdline.argv);
`
``
2122
`+
err = _PyPreCmdline_Init(&cmdline.precmdline, args);
`
2114
2123
`if (_Py_INIT_FAILED(err)) {
`
2115
2124
` goto done;
`
2116
2125
` }
`