package An official xmake package repository https://xrepo.xmake.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
1.7 KiB

diff --git a/python/types.c b/python/types.c
--- a/python/types.c
+++ b/python/types.c
@@ -21,16 +21,66 @@
#if PY_MAJOR_VERSION >= 3
#include <stdio.h>
+#ifdef _WIN32
+#include <io.h>
+#else
#include <unistd.h>
#include <fcntl.h>
+#endif
FILE *
libxml_PyFileGet(PyObject *f) {
- int fd, flags;
+ int fd;
FILE *res;
const char *mode;
fd = PyObject_AsFileDescriptor(f);
+#ifdef _WIN32
+ PyObject *modeObj, *modeBytes;
+
+ modeObj = PyObject_GetAttrString(f, "mode");
+ if (!modeObj)
+ return(NULL);
+
+ /* using f.mode to replace posix fcntl(), see
+ * https://gist.github.com/novocaine/09d5c00e67fd0aa13cfc */
+ if (PyUnicode_Check(modeObj)) {
+ modeBytes = PyObject_CallMethod(
+ modeObj, "encode", "ascii", "namereplace");
+ if (!modeBytes) {
+ Py_DECREF(modeObj);
+ return(NULL);
+ }
+ mode = PyBytes_AsString(modeBytes);
+ if (!mode) {
+ Py_DECREF(modeObj);
+ return(NULL);
+ }
+ Py_DECREF(modeBytes);
+ } else if (PyBytes_Check(modeObj)) {
+ mode = PyBytes_AsString(modeObj);
+ if (!mode) {
+ Py_DECREF(modeObj);
+ return(NULL);
+ }
+ } else {
+ Py_DECREF(modeObj);
+ return(NULL);
+ }
+
+ Py_DECREF(modeObj);
+
+ fd = _dup(fd);
+ if (fd == -1)
+ return(NULL);
+ res = _fdopen(fd, mode);
+ if (!res) {
+ _close(fd);
+ return(NULL);
+ }
+ return(res);
+#else
+ int flags;
/*
* Get the flags on the fd to understand how it was opened
*/
@@ -76,6 +126,7 @@ libxml_PyFileGet(PyObject *f) {
return(NULL);
}
return(res);
+#endif
}
void libxml_PyFileRelease(FILE *f) {