1 #ifndef Py_INTERNAL_CORECONFIG_H
2 #define Py_INTERNAL_CORECONFIG_H
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6
7 #ifndef Py_BUILD_CORE
8 # error "this header requires Py_BUILD_CORE define"
9 #endif
10
11 /* Forward declaration */
12 struct 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
47 /* --- PyWideStringList ------------------------------------------------ */
48
49 #define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL}
50
51 #ifndef NDEBUG
52 PyAPI_FUNC(int) _PyWideStringList_CheckConsistency(const PyWideStringList *list);
53 #endif
54 PyAPI_FUNC(void) _PyWideStringList_Clear(PyWideStringList *list);
55 PyAPI_FUNC(int) _PyWideStringList_Copy(PyWideStringList *list,
56 const PyWideStringList *list2);
57 PyAPI_FUNC(PyStatus) _PyWideStringList_Extend(PyWideStringList *list,
58 const PyWideStringList *list2);
59 PyAPI_FUNC(PyObject*) _PyWideStringList_AsList(const PyWideStringList *list);
60
61
62 /* --- _PyArgv ---------------------------------------------------- */
63
64 typedef struct _PyArgv {
65 Py_ssize_t argc;
66 int use_bytes_argv;
67 char * const *bytes_argv;
68 wchar_t * const *wchar_argv;
69 } _PyArgv;
70
71 PyAPI_FUNC(PyStatus) _PyArgv_AsWstrList(const _PyArgv *args,
72 PyWideStringList *list);
73
74
75 /* --- Helper functions ------------------------------------------- */
76
77 PyAPI_FUNC(int) _Py_str_to_int(
78 const char *str,
79 int *result);
80 PyAPI_FUNC(const wchar_t*) _Py_get_xoption(
81 const PyWideStringList *xoptions,
82 const wchar_t *name);
83 PyAPI_FUNC(const char*) _Py_GetEnv(
84 int use_environment,
85 const char *name);
86 PyAPI_FUNC(void) _Py_get_env_flag(
87 int use_environment,
88 int *flag,
89 const char *name);
90
91 /* Py_GetArgcArgv() helper */
92 PyAPI_FUNC(void) _Py_ClearArgcArgv(void);
93
94
95 /* --- _PyPreCmdline ------------------------------------------------- */
96
97 typedef struct {
98 PyWideStringList argv;
99 PyWideStringList xoptions; /* "-X value" option */
100 int isolated; /* -I option */
101 int use_environment; /* -E option */
102 int dev_mode; /* -X dev and PYTHONDEVMODE */
103 int warn_default_encoding; /* -X warn_default_encoding and PYTHONWARNDEFAULTENCODING */
104 } _PyPreCmdline;
105
106 #define _PyPreCmdline_INIT \
107 (_PyPreCmdline){ \
108 .use_environment = -1, \
109 .isolated = -1, \
110 .dev_mode = -1}
111 /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */
112
113 extern void _PyPreCmdline_Clear(_PyPreCmdline *cmdline);
114 extern PyStatus _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline,
115 const _PyArgv *args);
116 extern PyStatus _PyPreCmdline_SetConfig(
117 const _PyPreCmdline *cmdline,
118 PyConfig *config);
119 extern PyStatus _PyPreCmdline_Read(_PyPreCmdline *cmdline,
120 const PyPreConfig *preconfig);
121
122
123 /* --- PyPreConfig ----------------------------------------------- */
124
125 PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(PyPreConfig *preconfig);
126 extern void _PyPreConfig_InitFromConfig(
127 PyPreConfig *preconfig,
128 const PyConfig *config);
129 extern PyStatus _PyPreConfig_InitFromPreConfig(
130 PyPreConfig *preconfig,
131 const PyPreConfig *config2);
132 extern PyObject* _PyPreConfig_AsDict(const PyPreConfig *preconfig);
133 extern void _PyPreConfig_GetConfig(PyPreConfig *preconfig,
134 const PyConfig *config);
135 extern PyStatus _PyPreConfig_Read(PyPreConfig *preconfig,
136 const _PyArgv *args);
137 extern PyStatus _PyPreConfig_Write(const PyPreConfig *preconfig);
138
139
140 /* --- PyConfig ---------------------------------------------- */
141
142 typedef enum {
143 /* Py_Initialize() API: backward compatibility with Python 3.6 and 3.7 */
144 _PyConfig_INIT_COMPAT = 1,
145 _PyConfig_INIT_PYTHON = 2,
146 _PyConfig_INIT_ISOLATED = 3
147 } _PyConfigInitEnum;
148
149 PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config);
150 extern PyStatus _PyConfig_Copy(
151 PyConfig *config,
152 const PyConfig *config2);
153 extern PyStatus _PyConfig_InitPathConfig(
154 PyConfig *config,
155 int compute_path_config);
156 extern PyStatus _PyConfig_InitImportConfig(PyConfig *config);
157 extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config);
158 extern PyStatus _PyConfig_Write(const PyConfig *config,
159 struct pyruntimestate *runtime);
160 extern PyStatus _PyConfig_SetPyArgv(
161 PyConfig *config,
162 const _PyArgv *args);
163
164 PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config);
165 PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict);
166
167 extern void _Py_DumpPathConfig(PyThreadState *tstate);
168
169 PyAPI_FUNC(PyObject*) _Py_Get_Getpath_CodeObject(void);
170
171
172 /* --- Function used for testing ---------------------------------- */
173
174 PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void);
175
176 #ifdef __cplusplus
177 }
178 #endif
179 #endif /* !Py_INTERNAL_CORECONFIG_H */