1#ifndef Py_INTERNAL_CORECONFIG_H
2#define Py_INTERNAL_CORECONFIG_H
3#ifdef __cplusplus
4extern "C" {
5#endif
6
7#ifndef Py_BUILD_CORE
8# error "this header requires Py_BUILD_CORE define"
9#endif
10
11/* Forward declaration */
12struct pyruntimestate;
13
14/* --- PyStatus ----------------------------------------------- */
15
16/* Almost all errors causing Python initialization to fail */
17#ifdef _MSC_VER
18 /* Visual Studio 2015 doesn't implement C99 __func__ in C */
19# define _PyStatus_GET_FUNC() __FUNCTION__
20#else
21# define _PyStatus_GET_FUNC() __func__
22#endif
23
24#define _PyStatus_OK() \
25 (PyStatus){._type = _PyStatus_TYPE_OK,}
26 /* other fields are set to 0 */
27#define _PyStatus_ERR(ERR_MSG) \
28 (PyStatus){ \
29 ._type = _PyStatus_TYPE_ERROR, \
30 .func = _PyStatus_GET_FUNC(), \
31 .err_msg = (ERR_MSG)}
32 /* other fields are set to 0 */
33#define _PyStatus_NO_MEMORY() _PyStatus_ERR("memory allocation failed")
34#define _PyStatus_EXIT(EXITCODE) \
35 (PyStatus){ \
36 ._type = _PyStatus_TYPE_EXIT, \
37 .exitcode = (EXITCODE)}
38#define _PyStatus_IS_ERROR(err) \
39 (err._type == _PyStatus_TYPE_ERROR)
40#define _PyStatus_IS_EXIT(err) \
41 (err._type == _PyStatus_TYPE_EXIT)
42#define _PyStatus_EXCEPTION(err) \
43 (err._type != _PyStatus_TYPE_OK)
44#define _PyStatus_UPDATE_FUNC(err) \
45 do { err.func = _PyStatus_GET_FUNC(); } while (0)
46
47PyObject* _PyErr_SetFromPyStatus(PyStatus status);
48
49/* --- PyWideStringList ------------------------------------------------ */
50
51#define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL}
52
53#ifndef NDEBUG
54PyAPI_FUNC(int) _PyWideStringList_CheckConsistency(const PyWideStringList *list);
55#endif
56PyAPI_FUNC(void) _PyWideStringList_Clear(PyWideStringList *list);
57PyAPI_FUNC(int) _PyWideStringList_Copy(PyWideStringList *list,
58 const PyWideStringList *list2);
59PyAPI_FUNC(PyStatus) _PyWideStringList_Extend(PyWideStringList *list,
60 const PyWideStringList *list2);
61PyAPI_FUNC(PyObject*) _PyWideStringList_AsList(const PyWideStringList *list);
62
63
64/* --- _PyArgv ---------------------------------------------------- */
65
66typedef struct _PyArgv {
67 Py_ssize_t argc;
68 int use_bytes_argv;
69 char * const *bytes_argv;
70 wchar_t * const *wchar_argv;
71} _PyArgv;
72
73PyAPI_FUNC(PyStatus) _PyArgv_AsWstrList(const _PyArgv *args,
74 PyWideStringList *list);
75
76
77/* --- Helper functions ------------------------------------------- */
78
79PyAPI_FUNC(int) _Py_str_to_int(
80 const char *str,
81 int *result);
82PyAPI_FUNC(const wchar_t*) _Py_get_xoption(
83 const PyWideStringList *xoptions,
84 const wchar_t *name);
85PyAPI_FUNC(const char*) _Py_GetEnv(
86 int use_environment,
87 const char *name);
88PyAPI_FUNC(void) _Py_get_env_flag(
89 int use_environment,
90 int *flag,
91 const char *name);
92
93/* Py_GetArgcArgv() helper */
94PyAPI_FUNC(void) _Py_ClearArgcArgv(void);
95
96
97/* --- _PyPreCmdline ------------------------------------------------- */
98
99typedef struct {
100 PyWideStringList argv;
101 PyWideStringList xoptions; /* "-X value" option */
102 int isolated; /* -I option */
103 int use_environment; /* -E option */
104 int dev_mode; /* -X dev and PYTHONDEVMODE */
105 int warn_default_encoding; /* -X warn_default_encoding and PYTHONWARNDEFAULTENCODING */
106} _PyPreCmdline;
107
108#define _PyPreCmdline_INIT \
109 (_PyPreCmdline){ \
110 .use_environment = -1, \
111 .isolated = -1, \
112 .dev_mode = -1}
113/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */
114
115extern void _PyPreCmdline_Clear(_PyPreCmdline *cmdline);
116extern PyStatus _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline,
117 const _PyArgv *args);
118extern PyStatus _PyPreCmdline_SetConfig(
119 const _PyPreCmdline *cmdline,
120 PyConfig *config);
121extern PyStatus _PyPreCmdline_Read(_PyPreCmdline *cmdline,
122 const PyPreConfig *preconfig);
123
124
125/* --- PyPreConfig ----------------------------------------------- */
126
127PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(PyPreConfig *preconfig);
128extern void _PyPreConfig_InitFromConfig(
129 PyPreConfig *preconfig,
130 const PyConfig *config);
131extern PyStatus _PyPreConfig_InitFromPreConfig(
132 PyPreConfig *preconfig,
133 const PyPreConfig *config2);
134extern PyObject* _PyPreConfig_AsDict(const PyPreConfig *preconfig);
135extern void _PyPreConfig_GetConfig(PyPreConfig *preconfig,
136 const PyConfig *config);
137extern PyStatus _PyPreConfig_Read(PyPreConfig *preconfig,
138 const _PyArgv *args);
139extern PyStatus _PyPreConfig_Write(const PyPreConfig *preconfig);
140
141
142/* --- PyConfig ---------------------------------------------- */
143
144typedef enum {
145 /* Py_Initialize() API: backward compatibility with Python 3.6 and 3.7 */
146 _PyConfig_INIT_COMPAT = 1,
147 _PyConfig_INIT_PYTHON = 2,
148 _PyConfig_INIT_ISOLATED = 3
149} _PyConfigInitEnum;
150
151PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config);
152extern PyStatus _PyConfig_Copy(
153 PyConfig *config,
154 const PyConfig *config2);
155extern PyStatus _PyConfig_InitPathConfig(
156 PyConfig *config,
157 int compute_path_config);
158extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config);
159extern PyStatus _PyConfig_Write(const PyConfig *config,
160 struct pyruntimestate *runtime);
161extern PyStatus _PyConfig_SetPyArgv(
162 PyConfig *config,
163 const _PyArgv *args);
164
165PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config);
166PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict);
167
168
169/* --- Function used for testing ---------------------------------- */
170
171PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void);
172
173#ifdef __cplusplus
174}
175#endif
176#endif /* !Py_INTERNAL_CORECONFIG_H */
177