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 } _PyPreCmdline; 104 105 #define _PyPreCmdline_INIT \ 106 (_PyPreCmdline){ \ 107 .use_environment = -1, \ 108 .isolated = -1, \ 109 .dev_mode = -1} 110 /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ 111 112 extern void _PyPreCmdline_Clear(_PyPreCmdline *cmdline); 113 extern PyStatus _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, 114 const _PyArgv *args); 115 extern PyStatus _PyPreCmdline_SetConfig( 116 const _PyPreCmdline *cmdline, 117 PyConfig *config); 118 extern PyStatus _PyPreCmdline_Read(_PyPreCmdline *cmdline, 119 const PyPreConfig *preconfig); 120 121 122 /* --- PyPreConfig ----------------------------------------------- */ 123 124 PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(PyPreConfig *preconfig); 125 extern void _PyPreConfig_InitFromConfig( 126 PyPreConfig *preconfig, 127 const PyConfig *config); 128 extern PyStatus _PyPreConfig_InitFromPreConfig( 129 PyPreConfig *preconfig, 130 const PyPreConfig *config2); 131 extern PyObject* _PyPreConfig_AsDict(const PyPreConfig *preconfig); 132 extern void _PyPreConfig_GetConfig(PyPreConfig *preconfig, 133 const PyConfig *config); 134 extern PyStatus _PyPreConfig_Read(PyPreConfig *preconfig, 135 const _PyArgv *args); 136 extern PyStatus _PyPreConfig_Write(const PyPreConfig *preconfig); 137 138 139 /* --- PyConfig ---------------------------------------------- */ 140 141 typedef enum { 142 /* Py_Initialize() API: backward compatibility with Python 3.6 and 3.7 */ 143 _PyConfig_INIT_COMPAT = 1, 144 _PyConfig_INIT_PYTHON = 2, 145 _PyConfig_INIT_ISOLATED = 3 146 } _PyConfigInitEnum; 147 148 PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config); 149 extern PyStatus _PyConfig_Copy( 150 PyConfig *config, 151 const PyConfig *config2); 152 extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); 153 extern PyStatus _PyConfig_Write(const PyConfig *config, 154 struct pyruntimestate *runtime); 155 extern PyStatus _PyConfig_SetPyArgv( 156 PyConfig *config, 157 const _PyArgv *args); 158 159 160 /* --- Function used for testing ---------------------------------- */ 161 162 PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void); 163 164 #ifdef __cplusplus 165 } 166 #endif 167 #endif /* !Py_INTERNAL_CORECONFIG_H */ 168