mirror of
https://github.com/python/cpython.git
synced 2025-09-28 11:15:17 +00:00
Create _Py_fopen() for PyUnicodeObject path
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.
This commit is contained in:
parent
17d1e2abd8
commit
f52b705be4
2 changed files with 35 additions and 1 deletions
|
@ -135,7 +135,8 @@ PyAPI_FUNC(wchar_t *) _Py_char2wchar(char *);
|
||||||
PyAPI_FUNC(char*) _Py_wchar2char(const wchar_t *text);
|
PyAPI_FUNC(char*) _Py_wchar2char(const wchar_t *text);
|
||||||
PyAPI_FUNC(FILE *) _Py_wfopen(const wchar_t *path, const wchar_t *mode);
|
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
|
#ifdef HAVE_STAT
|
||||||
int _Py_stat(PyObject *unicode, struct stat *statbuf);
|
int _Py_stat(PyObject *unicode, struct stat *statbuf);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1960,6 +1960,39 @@ case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
|
||||||
#endif
|
#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
|
#ifdef HAVE_STAT
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue