Mercurial > cpython-lru_cache-weakref
diff Modules/main.c @ 49708:fb725366f9ac
#3705: Command-line arguments were not correctly decoded when the
terminal does not use UTF8.
Now the code propagates the unicode string as far as possible, and avoids
the conversion to char* which implicitely uses utf-8.
Reviewed by Benjamin.
| author | Amaury Forgeot d'Arc <amauryfa@gmail.com> |
|---|---|
| date | Tue, 11 Nov 2008 23:04:59 +0000 |
| parents | 3e2de484ce34 |
| children | 4801969dadee |
line wrap: on
line diff
--- a/Modules/main.c Tue Nov 11 21:43:42 2008 +0000 +++ b/Modules/main.c Tue Nov 11 23:04:59 2008 +0000 @@ -287,7 +287,7 @@ { int c; int sts; - char *command = NULL; + wchar_t *command = NULL; wchar_t *filename = NULL; wchar_t *module = NULL; FILE *fp = stdin; @@ -299,7 +299,6 @@ int version = 0; int saw_unbuffered_flag = 0; PyCompilerFlags cf; - char *oldloc; cf.cf_flags = 0; @@ -310,30 +309,19 @@ while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { if (c == 'c') { - size_t r1, r2; - oldloc = setlocale(LC_ALL, NULL); - setlocale(LC_ALL, ""); - r1 = wcslen(_PyOS_optarg); - r2 = wcstombs(NULL, _PyOS_optarg, r1); - if (r2 == (size_t) -1) - Py_FatalError( - "cannot convert character encoding of -c argument"); - if (r2 > r1) - r1 = r2; - r1 += 2; + size_t len; /* -c is the last option; following arguments that look like options are left for the command to interpret. */ - command = (char *)malloc(r1); + + len = wcslen(_PyOS_optarg) + 1 + 1; + command = (wchar_t *)malloc(sizeof(wchar_t) * len); if (command == NULL) Py_FatalError( "not enough memory to copy -c argument"); - r2 = wcstombs(command, _PyOS_optarg, r1); - if (r2 > r1-1) - Py_FatalError( - "not enough memory to copy -c argument"); - strcat(command, "\n"); - setlocale(LC_ALL, oldloc); + wcscpy(command, _PyOS_optarg); + command[len - 2] = '\n'; + command[len - 1] = 0; break; } @@ -543,8 +531,18 @@ } if (command) { - sts = PyRun_SimpleStringFlags(command, &cf) != 0; + PyObject *commandObj = PyUnicode_FromWideChar( + command, wcslen(command)); free(command); + if (commandObj != NULL) { + sts = PyRun_SimpleStringFlags( + _PyUnicode_AsString(commandObj), &cf) != 0; + } + else { + PyErr_Print(); + sts = 1; + } + Py_DECREF(commandObj); } else if (module) { sts = RunModule(module, 1); }
