summaryrefslogtreecommitdiff
path: root/Parser
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2016-10-08 12:18:16 -0700
committerSteve Dower <steve.dower@microsoft.com>2016-10-08 12:18:16 -0700
commit3cd187b9f51f37e351d5ea4c8448b4769f8a3d9f (patch)
treefea07dc505603f4f26135241e21343fc84c8d4e5 /Parser
parentc3215f530f62ab7e112e0b36b968bf7aa2b831ca (diff)
downloadcpython-git-3cd187b9f51f37e351d5ea4c8448b4769f8a3d9f.tar.gz
Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk Sun)
Diffstat (limited to 'Parser')
-rw-r--r--Parser/myreadline.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/Parser/myreadline.c b/Parser/myreadline.c
index a8f23b790a..4f7a9fcc92 100644
--- a/Parser/myreadline.c
+++ b/Parser/myreadline.c
@@ -203,17 +203,37 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt)
#ifdef MS_WINDOWS
if (!Py_LegacyWindowsStdioFlag && sys_stdin == stdin) {
- HANDLE hStdIn;
+ HANDLE hStdIn, hStdErr;
_Py_BEGIN_SUPPRESS_IPH
hStdIn = (HANDLE)_get_osfhandle(fileno(sys_stdin));
+ hStdErr = (HANDLE)_get_osfhandle(fileno(stderr));
_Py_END_SUPPRESS_IPH
if (_get_console_type(hStdIn) == 'r') {
fflush(sys_stdout);
- if (prompt)
- fprintf(stderr, "%s", prompt);
- fflush(stderr);
+ if (prompt) {
+ if (_get_console_type(hStdErr) == 'w') {
+ wchar_t *wbuf;
+ int wlen;
+ wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1,
+ NULL, 0);
+ if (wlen++ &&
+ (wbuf = PyMem_RawMalloc(wlen * sizeof(wchar_t)))) {
+ wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1,
+ wbuf, wlen);
+ if (wlen) {
+ DWORD n;
+ fflush(stderr);
+ WriteConsoleW(hStdErr, wbuf, wlen, &n, NULL);
+ }
+ PyMem_RawFree(wbuf);
+ }
+ } else {
+ fprintf(stderr, "%s", prompt);
+ fflush(stderr);
+ }
+ }
clearerr(sys_stdin);
return _PyOS_WindowsConsoleReadline(hStdIn);
}