From 5467d4c0e31e9db305a4899a44d7978f83e96649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sat, 10 May 2003 07:10:12 +0000 Subject: Patch #612627: Add encoding attribute to file objects, and determine the terminal encoding on Windows and Unix. --- Python/sysmodule.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'Python/sysmodule.c') diff --git a/Python/sysmodule.c b/Python/sysmodule.c index d06d18a98b..edbc2bf580 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -36,6 +36,15 @@ extern const char *PyWin_DLLVersionString; #include #endif +#ifdef MS_WINDOWS +#include +#endif + +#ifdef HAVE_LANGINFO_H +#include +#include +#endif + PyObject * PySys_GetObject(char *name) { @@ -881,6 +890,12 @@ _PySys_Init(void) PyObject *m, *v, *sysdict; PyObject *sysin, *sysout, *syserr; char *s; +#ifdef MS_WINDOWS + char buf[10]; +#endif +#if defined(HAVE_LANGINFO_H) && defined(CODESET) + char *oldloc, *codeset; +#endif m = Py_InitModule3("sys", sys_methods, sys_doc); sysdict = PyModule_GetDict(m); @@ -890,6 +905,34 @@ _PySys_Init(void) syserr = PyFile_FromFile(stderr, "", "w", NULL); if (PyErr_Occurred()) return NULL; +#ifdef MS_WINDOWS + if(isatty(_fileno(stdin))){ + sprintf(buf, "cp%d", GetConsoleCP()); + if (!PyFile_SetEncoding(sysin, buf)) + return NULL; + } + if(isatty(_fileno(stdout))) { + sprintf(buf, "cp%d", GetConsoleOutputCP()); + if (!PyFile_SetEncoding(sysout, buf)) + return NULL; + } +#endif + +#if defined(HAVE_LANGINFO_H) && defined(CODESET) + oldloc = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, ""); + codeset = nl_langinfo(CODESET); + setlocale(LC_CTYPE, oldloc); + if(codeset && isatty(fileno(stdin))){ + if (!PyFile_SetEncoding(sysin, codeset)) + return NULL; + } + if(codeset && isatty(fileno(stdout))) { + if (!PyFile_SetEncoding(sysout, codeset)) + return NULL; + } +#endif + PyDict_SetItemString(sysdict, "stdin", sysin); PyDict_SetItemString(sysdict, "stdout", sysout); PyDict_SetItemString(sysdict, "stderr", syserr); -- cgit v1.2.1