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 PyObject* _PyErr_SetFromPyStatus(PyStatus status); 48 49 /* --- PyWideStringList ------------------------------------------------ */ 50 51 #define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL} 52 53 #ifndef NDEBUG 54 PyAPI_FUNC(int) _PyWideStringList_CheckConsistency(const PyWideStringList *list); 55 #endif 56 PyAPI_FUNC(void) _PyWideStringList_Clear(PyWideStringList *list); 57 PyAPI_FUNC(int) _PyWideStringList_Copy(PyWideStringList *list, 58 const PyWideStringList *list2); 59 PyAPI_FUNC(PyStatus) _PyWideStringList_Extend(PyWideStringList *list, 60 const PyWideStringList *list2); 61 PyAPI_FUNC(PyObject*) _PyWideStringList_AsList(const PyWideStringList *list); 62 63 64 /* --- _PyArgv ---------------------------------------------------- */ 65 66 typedef 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 73 PyAPI_FUNC(PyStatus) _PyArgv_AsWstrList(const _PyArgv *args, 74 PyWideStringList *list); 75 76 77 /* --- Helper functions ------------------------------------------- */ 78 79 PyAPI_FUNC(int) _Py_str_to_int( 80 const char *str, 81 int *result); 82 PyAPI_FUNC(const wchar_t*) _Py_get_xoption( 83 const PyWideStringList *xoptions, 84 const wchar_t *name); 85 PyAPI_FUNC(const char*) _Py_GetEnv( 86 int use_environment, 87 const char *name); 88 PyAPI_FUNC(void) _Py_get_env_flag( 89 int use_environment, 90 int *flag, 91 const char *name); 92 93 /* Py_GetArgcArgv() helper */ 94 PyAPI_FUNC(void) _Py_ClearArgcArgv(void); 95 96 97 /* --- _PyPreCmdline ------------------------------------------------- */ 98 99 typedef 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 115 extern void _PyPreCmdline_Clear(_PyPreCmdline *cmdline); 116 extern PyStatus _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, 117 const _PyArgv *args); 118 extern PyStatus _PyPreCmdline_SetConfig( 119 const _PyPreCmdline *cmdline, 120 PyConfig *config); 121 extern PyStatus _PyPreCmdline_Read(_PyPreCmdline *cmdline, 122 const PyPreConfig *preconfig); 123 124 125 /* --- PyPreConfig ----------------------------------------------- */ 126 127 PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(PyPreConfig *preconfig); 128 extern void _PyPreConfig_InitFromConfig( 129 PyPreConfig *preconfig, 130 const PyConfig *config); 131 extern PyStatus _PyPreConfig_InitFromPreConfig( 132 PyPreConfig *preconfig, 133 const PyPreConfig *config2); 134 extern PyObject* _PyPreConfig_AsDict(const PyPreConfig *preconfig); 135 extern void _PyPreConfig_GetConfig(PyPreConfig *preconfig, 136 const PyConfig *config); 137 extern PyStatus _PyPreConfig_Read(PyPreConfig *preconfig, 138 const _PyArgv *args); 139 extern PyStatus _PyPreConfig_Write(const PyPreConfig *preconfig); 140 141 142 /* --- PyConfig ---------------------------------------------- */ 143 144 typedef 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 151 PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config); 152 extern PyStatus _PyConfig_Copy( 153 PyConfig *config, 154 const PyConfig *config2); 155 extern PyStatus _PyConfig_InitPathConfig( 156 PyConfig *config, 157 int compute_path_config); 158 extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config); 159 extern PyStatus _PyConfig_Write(const PyConfig *config, 160 struct pyruntimestate *runtime); 161 extern PyStatus _PyConfig_SetPyArgv( 162 PyConfig *config, 163 const _PyArgv *args); 164 165 PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config); 166 PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict); 167 168 169 /* --- Function used for testing ---------------------------------- */ 170 171 PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void); 172 173 #ifdef __cplusplus 174 } 175 #endif 176 #endif /* !Py_INTERNAL_CORECONFIG_H */ 177