blob: 8102924e71658c1f36011a36d33f75cbe38b7a7e [file] [log] [blame]
Victor Stinner91b9ecf2019-03-01 17:52:56 +01001#include "Python.h"
2#include "pycore_coreconfig.h"
3
4
5#define DECODE_LOCALE_ERR(NAME, LEN) \
6 (((LEN) == -2) \
7 ? _Py_INIT_USER_ERR("cannot decode " NAME) \
8 : _Py_INIT_NO_MEMORY())
9
10
11/* --- File system encoding/errors -------------------------------- */
12
13/* The filesystem encoding is chosen by config_init_fs_encoding(),
14 see also initfsencoding(). */
15const char *Py_FileSystemDefaultEncoding = NULL;
16int Py_HasFileSystemDefaultEncoding = 0;
17const char *Py_FileSystemDefaultEncodeErrors = NULL;
18int _Py_HasFileSystemDefaultEncodeErrors = 0;
19
20void
21_Py_ClearFileSystemEncoding(void)
22{
23 if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
24 PyMem_RawFree((char*)Py_FileSystemDefaultEncoding);
25 Py_FileSystemDefaultEncoding = NULL;
26 }
27 if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) {
28 PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors);
29 Py_FileSystemDefaultEncodeErrors = NULL;
30 }
31}
32
33
34/* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors
35 global configuration variables. */
36int
37_Py_SetFileSystemEncoding(const char *encoding, const char *errors)
38{
39 char *encoding2 = _PyMem_RawStrdup(encoding);
40 if (encoding2 == NULL) {
41 return -1;
42 }
43
44 char *errors2 = _PyMem_RawStrdup(errors);
45 if (errors2 == NULL) {
46 PyMem_RawFree(encoding2);
47 return -1;
48 }
49
50 _Py_ClearFileSystemEncoding();
51
52 Py_FileSystemDefaultEncoding = encoding2;
53 Py_HasFileSystemDefaultEncoding = 0;
54
55 Py_FileSystemDefaultEncodeErrors = errors2;
56 _Py_HasFileSystemDefaultEncodeErrors = 0;
57 return 0;
58}
59
60
61/* --- _PyArgv ---------------------------------------------------- */
62
63_PyInitError
64_PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p)
65{
66 wchar_t** argv;
67 if (args->use_bytes_argv) {
68 /* +1 for a the NULL terminator */
69 size_t size = sizeof(wchar_t*) * (args->argc + 1);
70 argv = (wchar_t **)PyMem_RawMalloc(size);
71 if (argv == NULL) {
72 return _Py_INIT_NO_MEMORY();
73 }
74
75 for (int i = 0; i < args->argc; i++) {
76 size_t len;
77 wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len);
78 if (arg == NULL) {
79 _Py_wstrlist_clear(i, argv);
80 return DECODE_LOCALE_ERR("command line arguments",
81 (Py_ssize_t)len);
82 }
83 argv[i] = arg;
84 }
85 argv[args->argc] = NULL;
86 }
87 else {
88 argv = args->wchar_argv;
89 }
90 *argv_p = argv;
91 return _Py_INIT_OK();
92}