93 lines
2.5 KiB
C
93 lines
2.5 KiB
C
|
#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();
|
||
|
}
|