(original) (raw)

Index: Python/sysmodule.c =================================================================== --- Python/sysmodule.c (révision 86167) +++ Python/sysmodule.c (copie de travail) @@ -894,6 +894,122 @@ return _PyEval_CallTracing(func, funcargs); } +PyDoc_STRVAR(write_stdout_doc, +"write_stdout(text)"); + +PyObject* +sys_write_stdout(PyObject *self, PyObject *args) +{ + PyObject *text; + int is_unicode; + Py_UNICODE *unicode; + char *bytes; + HANDLE handle; + CONSOLE_SCREEN_BUFFER_INFO screen_info; + CHAR_INFO *char_info; + COORD size, coord; + SMALL_RECT region; + Py_ssize_t i, len; + WCHAR c; + int ret; + + if (!PyArg_ParseTuple(args, "O:write_stdout", &text)) + return NULL; + + if (PyUnicode_Check(text)) { + is_unicode = 1; + len = PyUnicode_GET_SIZE(text); + } + else if (PyBytes_Check(text)) { + len = PyBytes_GET_SIZE(text); + is_unicode = 0; + } + else { + PyErr_Format(PyExc_TypeError, + "expect str or bytes, not %.400s", + Py_TYPE(text)->tp_name); + return NULL; + } + + if (len == 0) + Py_RETURN_NONE; + + if (PY_SSIZE_T_MAX < len * sizeof(char_info[0])) + return PyErr_NoMemory(); + char_info = PyMem_Malloc(len * sizeof(char_info[0])); + if (char_info == NULL) + return PyErr_NoMemory(); + + if (is_unicode) { + unicode = PyUnicode_AS_UNICODE(text); + for (i=0; i<len; i++)="" {="" +="" char_info[i].char.unicodechar="unicode[i];" char_info[i].attributes="7;" }="" else="" bytes="PyBytes_AS_STRING(text);" for="" (i="0;" i<len;="" char_info[i].char.asciichar="bytes[i];" handle="GetStdHandle(STD_OUTPUT_HANDLE);" if="" (handle="=" invalid_handle_value)="" goto="" error;="" ret="GetConsoleScreenBufferInfo(handle," &screen_info);="" (!ret)="" size.x="len;" size.y="1;" coord.x="0;" coord.y="0;" region.left="screen_info.dwCursorPosition.X;" region.right="region.Left" len;="" region.top="screen_info.dwCursorPosition.Y;" region.bottom="region.Top;" (is_unicode)="" char_info,="" size,="" coord,="" ®ion);="" readconsoleoutputw(handle,="" c="char_info[0].Char.UnicodeChar;" readconsoleoutputa(handle,="" char)char_info[0].char.asciichar;="" pymem_free(char_info);="" screen_info.dwcursorposition.y="" screen_info.dwcursorposition);="" printf("read:="" u+%04x\n",="" c);="" 0x%02x\n",="" py_return_none;="" +error:="" pyerr_setfromwindowserr(getlasterror());="" return="" null;="" +}="" pydoc_strvar(callstats_doc,="" "callstats()="" -=""> tuple of integers\n\ \n\ @@ -1017,6 +1133,7 @@ {"settrace", sys_settrace, METH_O, settrace_doc}, {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc}, {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, + {"write_stdout", sys_write_stdout, METH_VARARGS, write_stdout_doc}, {NULL, NULL} /* sentinel */ }; </len;>