[Python-3000-checkins] r56922 - in python/branches/py3k: Lib/io.py Modules/_localemodule.c Modules/posixmodule.c Python/pythonrun.c

Guido van Rossum guido at python.org
Sat Aug 11 17:25:25 CEST 2007


Martin,

This has broken the build. After "make clean", running "python
setup.py" causes a traceback because locale.py imports operator which
isn't built yet. locale.py is being imported from io.

--Guido

On 8/11/07, martin.v.loewis <python-3000-checkins at python.org> wrote:
> Author: martin.v.loewis
> Date: Sat Aug 11 16:02:14 2007
> New Revision: 56922
>
> Modified:
>    python/branches/py3k/Lib/io.py
>    python/branches/py3k/Modules/_localemodule.c
>    python/branches/py3k/Modules/posixmodule.c
>    python/branches/py3k/Python/pythonrun.c
> Log:
> Set sys.stdout.encoding properly.
> Always set LC_CTYPE on interpreter startup.
> Add device_encoding function.
>
>
> Modified: python/branches/py3k/Lib/io.py
> ==============================================================================
> --- python/branches/py3k/Lib/io.py      (original)
> +++ python/branches/py3k/Lib/io.py      Sat Aug 11 16:02:14 2007
> @@ -971,8 +971,13 @@
>          if newline not in (None, "\n", "\r\n"):
>              raise ValueError("illegal newline value: %r" % (newline,))
>          if encoding is None:
> -            # XXX This is questionable
> -            encoding = sys.getfilesystemencoding() or "latin-1"
> +            try:
> +                encoding = os.device_encoding(buffer.fileno())
> +            except AttributeError:
> +                pass
> +            if encoding is None:
> +                import locale
> +                encoding = locale.getpreferredencoding()
>
>          self.buffer = buffer
>          self._encoding = encoding
>
> Modified: python/branches/py3k/Modules/_localemodule.c
> ==============================================================================
> --- python/branches/py3k/Modules/_localemodule.c        (original)
> +++ python/branches/py3k/Modules/_localemodule.c        Sat Aug 11 16:02:14 2007
> @@ -1,5 +1,5 @@
>  /***********************************************************
> -Copyright (C) 1997, 2002, 2003 Martin von Loewis
> +Copyright (C) 1997, 2002, 2003, 2007 Martin von Loewis
>
>  Permission to use, copy, modify, and distribute this software and its
>  documentation for any purpose and without fee is hereby granted,
> @@ -562,7 +562,8 @@
>              /* Check NULL as a workaround for GNU libc's returning NULL
>                 instead of an empty string for nl_langinfo(ERA).  */
>              const char *result = nl_langinfo(item);
> -            return PyString_FromString(result != NULL ? result : "");
> +            /* XXX may have to convert this to wcs first. */
> +            return PyUnicode_FromString(result != NULL ? result : "");
>          }
>      PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant");
>      return NULL;
>
> Modified: python/branches/py3k/Modules/posixmodule.c
> ==============================================================================
> --- python/branches/py3k/Modules/posixmodule.c  (original)
> +++ python/branches/py3k/Modules/posixmodule.c  Sat Aug 11 16:02:14 2007
> @@ -92,6 +92,10 @@
>  #include <sys/loadavg.h>
>  #endif
>
> +#ifdef HAVE_LANGINFO_H
> +#include <langinfo.h>
> +#endif
> +
>  /* Various compilers have only certain posix functions */
>  /* XXX Gosh I wish these were all moved into pyconfig.h */
>  #if defined(PYCC_VACPP) && defined(PYOS_OS2)
> @@ -6581,6 +6585,43 @@
>  }
>  #endif
>
> +PyDoc_STRVAR(device_encoding__doc__,
> +"device_encoding(fd) -> str\n\n\
> +Return a string describing the encoding of the device\n\
> +if the output is a terminal; else return None.");
> +
> +static PyObject *
> +device_encoding(PyObject *self, PyObject *args)
> +{
> +       int fd;
> +       if (!PyArg_ParseTuple(args, "i:device_encoding", &fd))
> +               return NULL;
> +       if (!isatty(fd)) {
> +               Py_INCREF(Py_None);
> +               return Py_None;
> +       }
> +#if defined(MS_WINDOWS) || defined(MS_WIN64)
> +       if (fd == 0) {
> +               char buf[100];
> +               sprintf(buf, "cp%d", GetConsoleCP());
> +               return PyUnicode_FromString(buf);
> +       }
> +       if (fd == 1 || fd == 2) {
> +               char buf[100];
> +               sprintf(buf, "cp%d", GetConsoleOutputCP());
> +               return PyUnicode_FromString(buf);
> +       }
> +#elif defined(CODESET)
> +       {
> +               char *codeset = nl_langinfo(CODESET);
> +               if (codeset)
> +                       return PyUnicode_FromString(codeset);
> +       }
> +#endif
> +       Py_INCREF(Py_None);
> +       return Py_None;
> +}
> +
>  #ifdef __VMS
>  /* Use openssl random routine */
>  #include <openssl/rand.h>
> @@ -6793,6 +6834,7 @@
>  #endif /* HAVE_TCSETPGRP */
>         {"open",        posix_open, METH_VARARGS, posix_open__doc__},
>         {"close",       posix_close, METH_VARARGS, posix_close__doc__},
> +       {"device_encoding", device_encoding, METH_VARARGS, device_encoding__doc__},
>         {"dup",         posix_dup, METH_VARARGS, posix_dup__doc__},
>         {"dup2",        posix_dup2, METH_VARARGS, posix_dup2__doc__},
>         {"lseek",       posix_lseek, METH_VARARGS, posix_lseek__doc__},
>
> Modified: python/branches/py3k/Python/pythonrun.c
> ==============================================================================
> --- python/branches/py3k/Python/pythonrun.c     (original)
> +++ python/branches/py3k/Python/pythonrun.c     Sat Aug 11 16:02:14 2007
> @@ -154,7 +154,6 @@
>         char *p;
>  #if defined(HAVE_LANGINFO_H) && defined(CODESET)
>         char *codeset;
> -       char *saved_locale;
>  #endif
>         extern void _Py_ReadyTypes(void);
>
> @@ -162,6 +161,13 @@
>                 return;
>         initialized = 1;
>
> +#ifdef HAVE_SETLOCALE
> +       /* Set up the LC_CTYPE locale, so we can obtain
> +          the locale's charset without having to switch
> +          locales. */
> +       setlocale(LC_CTYPE, "");
> +#endif
> +
>         if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
>                 Py_DebugFlag = add_flag(Py_DebugFlag, p);
>         if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
> @@ -254,8 +260,6 @@
>            initialized by other means. Also set the encoding of
>            stdin and stdout if these are terminals.  */
>
> -       saved_locale = strdup(setlocale(LC_CTYPE, NULL));
> -       setlocale(LC_CTYPE, "");
>         codeset = nl_langinfo(CODESET);
>         if (codeset && *codeset) {
>                 PyObject *enc = PyCodec_Encoder(codeset);
> @@ -268,8 +272,6 @@
>                 }
>         } else
>                 codeset = NULL;
> -       setlocale(LC_CTYPE, saved_locale);
> -       free(saved_locale);
>
>         if (codeset) {
>                 if (!Py_FileSystemDefaultEncoding)
> _______________________________________________
> Python-3000-checkins mailing list
> Python-3000-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-3000-checkins
>


-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-3000-checkins mailing list