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 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 */ };