]> granicus.if.org Git - python/commitdiff
Create _Py_fopen() for PyUnicodeObject path
authorVictor Stinner <victor.stinner@haypocalc.com>
Sat, 14 Aug 2010 17:06:04 +0000 (17:06 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Sat, 14 Aug 2010 17:06:04 +0000 (17:06 +0000)
Call _wfopen() on Windows, or fopen() otherwise. Return the new file object on
success, or NULL if the file cannot be open or (if PyErr_Occurred()) on unicode
error.

Include/Python.h
Python/import.c

index eb5ea28b27d5156b30c9235c533710fef612ab02..5afde02d2f03625a9f46dcfab81bbb56a5912edc 100644 (file)
@@ -135,7 +135,8 @@ PyAPI_FUNC(wchar_t *) _Py_char2wchar(char *);
 PyAPI_FUNC(char*) _Py_wchar2char(const wchar_t *text);
 PyAPI_FUNC(FILE *) _Py_wfopen(const wchar_t *path, const wchar_t *mode);
 
-/* _Py_stat lives in import.c */
+/* These functions live in import.c */
+PyAPI_FUNC(FILE*) _Py_fopen(PyObject *unicode, const char *mode);
 #ifdef HAVE_STAT
 int _Py_stat(PyObject *unicode, struct stat *statbuf);
 #endif
index 84ddc03c524706e374d18a7826283a529a99d4d6..bb3756ef81e0b9036ea94dfdbc968bdf9130319f 100644 (file)
@@ -1960,6 +1960,39 @@ case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
 #endif
 }
 
+/* Call _wfopen() on Windows, or fopen() otherwise. Return the new file
+   object on success, or NULL if the file cannot be open or (if
+   PyErr_Occurred()) on unicode error */
+
+FILE*
+_Py_fopen(PyObject *unicode, const char *mode)
+{
+#ifdef MS_WINDOWS
+    wchar_t path[MAXPATHLEN+1];
+    wchar_t wmode[10];
+    Py_ssize_t len;
+    int usize;
+
+    len = PyUnicode_AsWideChar((PyUnicodeObject*)unicode, path, MAXPATHLEN);
+    if (len == -1)
+        return NULL;
+    path[len] = L'\0';
+
+    usize = MultiByteToWideChar(CP_ACP, 0, mode, -1, wmode, sizeof(wmode));
+    if (usize == 0)
+        return NULL;
+
+    return _wfopen(path, wmode);
+#else
+    FILE *f;
+    PyObject *bytes = PyUnicode_EncodeFSDefault(unicode);
+    if (bytes == NULL)
+        return NULL;
+    f = fopen(PyBytes_AS_STRING(bytes), mode);
+    Py_DECREF(bytes);
+    return f;
+#endif
+}
 
 #ifdef HAVE_STAT