#include "Python.h" #include "pycore_coreconfig.h" #define DECODE_LOCALE_ERR(NAME, LEN) \ (((LEN) == -2) \ ? _Py_INIT_USER_ERR("cannot decode " NAME) \ : _Py_INIT_NO_MEMORY()) /* --- File system encoding/errors -------------------------------- */ /* The filesystem encoding is chosen by config_init_fs_encoding(), see also initfsencoding(). */ const char *Py_FileSystemDefaultEncoding = NULL; int Py_HasFileSystemDefaultEncoding = 0; const char *Py_FileSystemDefaultEncodeErrors = NULL; int _Py_HasFileSystemDefaultEncodeErrors = 0; void _Py_ClearFileSystemEncoding(void) { if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) { PyMem_RawFree((char*)Py_FileSystemDefaultEncoding); Py_FileSystemDefaultEncoding = NULL; } if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) { PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors); Py_FileSystemDefaultEncodeErrors = NULL; } } /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors global configuration variables. */ int _Py_SetFileSystemEncoding(const char *encoding, const char *errors) { char *encoding2 = _PyMem_RawStrdup(encoding); if (encoding2 == NULL) { return -1; } char *errors2 = _PyMem_RawStrdup(errors); if (errors2 == NULL) { PyMem_RawFree(encoding2); return -1; } _Py_ClearFileSystemEncoding(); Py_FileSystemDefaultEncoding = encoding2; Py_HasFileSystemDefaultEncoding = 0; Py_FileSystemDefaultEncodeErrors = errors2; _Py_HasFileSystemDefaultEncodeErrors = 0; return 0; } /* --- _PyArgv ---------------------------------------------------- */ _PyInitError _PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p) { wchar_t** argv; if (args->use_bytes_argv) { /* +1 for a the NULL terminator */ size_t size = sizeof(wchar_t*) * (args->argc + 1); argv = (wchar_t **)PyMem_RawMalloc(size); if (argv == NULL) { return _Py_INIT_NO_MEMORY(); } for (int i = 0; i < args->argc; i++) { size_t len; wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); if (arg == NULL) { _Py_wstrlist_clear(i, argv); return DECODE_LOCALE_ERR("command line arguments", (Py_ssize_t)len); } argv[i] = arg; } argv[args->argc] = NULL; } else { argv = args->wchar_argv; } *argv_p = argv; return _Py_INIT_OK(); }