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
80 lines
1.7 KiB
3 years ago
|
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) {
|