Skip to content

Commit

Permalink
Always initialize Py_FileSystemDefaultEncoding on Unix in Py_Initialize,
Browse files Browse the repository at this point in the history
and not as a side effect of setlocale. Expose it as sys.getfilesystemencoding.
Adjust test case.
  • Loading branch information
loewis committed Mar 5, 2003
1 parent 620c083 commit 73d538b
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 22 deletions.
16 changes: 16 additions & 0 deletions Doc/lib/libsys.tex
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,22 @@ \section{\module{sys} ---
\versionadded{2.2}
\end{funcdesc}

\begin{funcdesc}{getfilesystemencoding}{}
Return the name of the encoding used to convert Unicode filenames
into system file names, or \code{None} if the system default encoding
is used. The result value depends on the operating system:
\begin{itemize}
\item On Windows 9x, the encoding is ``mbcs''.
\item On Mac OS X, the encoding is ``utf-8''.
\item On Unix, the encoding is the user's preference
according to the result of nl_langinfo(CODESET), or None if
the nl_langinfo(CODESET) failed.
\item On Windows NT+, file names are Unicode natively, so no conversion
is performed.
\end{itemize}
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{getrefcount}{object}
Return the reference count of the \var{object}. The count returned
is generally one higher than you might expect, because it includes
Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,7 @@ def fcmp(x, y): # fuzzy comparison function
TESTFN_UNICODE="@test-\xe0\xf2"
else:
TESTFN_UNICODE=unicode("@test-\xe0\xf2", "latin-1") # 2 latin characters.
if os.name=="nt":
TESTFN_ENCODING="mbcs"
TESTFN_ENCODING=sys.getfilesystemencoding()
else:
TESTFN = 'test'

Expand Down
2 changes: 2 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ What's New in Python 2.3 beta 1?
Core and builtins
-----------------

- sys.getfilesystemencoding() was added to expose
Py_FileSystemDefaultEncoding.

- New function sys.exc_clear() clears the current exception. This is
rarely needed, but can sometimes be useful to release objects
Expand Down
20 changes: 0 additions & 20 deletions Modules/_localemodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,6 @@ fixup_ulcase(void)
Py_DECREF(ulo);
}

#if defined(HAVE_LANGINFO_H) && defined(CODESET)
static int fileencoding_uses_locale = 0;
#endif

static PyObject*
PyLocale_setlocale(PyObject* self, PyObject* args)
{
Expand Down Expand Up @@ -213,22 +209,6 @@ PyLocale_setlocale(PyObject* self, PyObject* args)
fixup_ulcase();
/* things that got wrong up to here are ignored */
PyErr_Clear();
#if defined(HAVE_LANGINFO_H) && defined(CODESET)
if (Py_FileSystemDefaultEncoding == NULL)
fileencoding_uses_locale = 1;
if (fileencoding_uses_locale) {
char *codeset = nl_langinfo(CODESET);
PyObject *enc = NULL;
if (*codeset && (enc = PyCodec_Encoder(codeset))) {
/* Release previous file encoding */
if (Py_FileSystemDefaultEncoding)
free((char *)Py_FileSystemDefaultEncoding);
Py_FileSystemDefaultEncoding = strdup(codeset);
Py_DECREF(enc);
} else
PyErr_Clear();
}
#endif
} else {
/* get locale */
/* restore LC_NUMERIC first, if appropriate */
Expand Down
28 changes: 28 additions & 0 deletions Python/pythonrun.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
#include <signal.h>
#endif

#ifdef HAVE_LANGINFO_H
#include <locale.h>
#include <langinfo.h>
#endif

#ifdef MS_WINDOWS
#undef BYTE
#include "windows.h"
Expand Down Expand Up @@ -181,6 +186,29 @@ Py_Initialize(void)
initsite(); /* Module site */

PyModule_WarningsModule = PyImport_ImportModule("warnings");

#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
/* On Unix, set the file system encoding according to the
user's preference, if the CODESET names a well-known
Python codec, and Py_FileSystemDefaultEncoding isn't
initialized by other means. */
if (!Py_FileSystemDefaultEncoding) {
char *saved_locale = setlocale(LC_CTYPE, NULL);
char *codeset;
setlocale(LC_CTYPE, "");
codeset = nl_langinfo(CODESET);
PyObject *enc = NULL;
if (*codeset) {
enc = PyCodec_Encoder(codeset);
if (enc) {
Py_FileSystemDefaultEncoding = strdup(codeset);
Py_DECREF(enc);
} else
PyErr_Clear();
}
setlocale(LC_CTYPE, saved_locale);
}
#endif
}

#ifdef COUNT_ALLOCS
Expand Down
20 changes: 20 additions & 0 deletions Python/sysmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,22 @@ PyDoc_STRVAR(setdefaultencoding_doc,
Set the current default string encoding used by the Unicode implementation."
);

static PyObject *
sys_getfilesystemencoding(PyObject *self)
{
if (Py_FileSystemDefaultEncoding)
return PyString_FromString(Py_FileSystemDefaultEncoding);
Py_INCREF(Py_None);
return Py_None;
}

PyDoc_STRVAR(getfilesystemencoding_doc,
"getfilesystemencoding() -> string\n\
\n\
Return the encoding used to convert Unicode filenames in\n\
operating system filenames."
);

#endif

/*
Expand Down Expand Up @@ -649,6 +665,10 @@ static PyMethodDef sys_methods[] = {
#ifdef DYNAMIC_EXECUTION_PROFILE
{"getdxp", _Py_GetDXProfile, METH_VARARGS},
#endif
#ifdef Py_USING_UNICODE
{"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
METH_NOARGS, getfilesystemencoding_doc},
#endif
#ifdef Py_TRACE_REFS
{"getobjects", _Py_GetObjects, METH_VARARGS},
#endif
Expand Down

0 comments on commit 73d538b

Please sign in to comment.