|
version 1.1.1.1, 2012/02/21 23:38:00
|
version 1.1.1.3, 2014/06/15 19:53:33
|
|
Line 28
|
Line 28
|
| #include "libxml_wrap.h" |
#include "libxml_wrap.h" |
| #include "libxml2-py.h" |
#include "libxml2-py.h" |
| |
|
| #if (defined(_MSC_VER) || defined(__MINGW32__)) && !defined(vsnprintf) | #if defined(WITH_TRIO) |
| #define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) | |
| #elif defined(WITH_TRIO) && !defined(vsnprintf) | |
| #include "trio.h" |
#include "trio.h" |
| #define vsnprintf trio_vsnprintf |
#define vsnprintf trio_vsnprintf |
| #endif |
#endif |
|
Line 43
|
Line 41
|
| /* #define DEBUG_FILES */ |
/* #define DEBUG_FILES */ |
| /* #define DEBUG_LOADER */ |
/* #define DEBUG_LOADER */ |
| |
|
| |
#if PY_MAJOR_VERSION >= 3 |
| |
PyObject *PyInit_libxml2mod(void); |
| |
|
| |
#define PY_IMPORT_STRING_SIZE PyUnicode_FromStringAndSize |
| |
#define PY_IMPORT_STRING PyUnicode_FromString |
| |
#else |
| void initlibxml2mod(void); |
void initlibxml2mod(void); |
| |
#define PY_IMPORT_STRING_SIZE PyString_FromStringAndSize |
| |
#define PY_IMPORT_STRING PyString_FromString |
| |
#endif |
| |
|
| |
|
| /** |
/** |
| * TODO: |
* TODO: |
| * |
* |
|
Line 282 xmlPythonFileReadRaw (void * context, char * buffer, i
|
Line 290 xmlPythonFileReadRaw (void * context, char * buffer, i
|
| if (ret == NULL) { |
if (ret == NULL) { |
| printf("xmlPythonFileReadRaw: result is NULL\n"); |
printf("xmlPythonFileReadRaw: result is NULL\n"); |
| return(-1); |
return(-1); |
| } else if (PyString_Check(ret)) { | } else if (PyBytes_Check(ret)) { |
| lenread = PyString_Size(ret); | lenread = PyBytes_Size(ret); |
| data = PyString_AsString(ret); | data = PyBytes_AsString(ret); |
| if (lenread > len) | #ifdef PyUnicode_Check |
| memcpy(buffer, data, len); | } else if PyUnicode_Check (ret) { |
| else | #if PY_VERSION_HEX >= 0x03030000 |
| memcpy(buffer, data, lenread); | size_t size; |
| Py_DECREF(ret); | const char *tmp; |
| | |
| | /* tmp doesn't need to be deallocated */ |
| | tmp = PyUnicode_AsUTF8AndSize(ret, &size); |
| | |
| | lenread = (int) size; |
| | data = (char *) tmp; |
| | #else |
| | PyObject *b; |
| | b = PyUnicode_AsUTF8String(ret); |
| | if (b == NULL) { |
| | printf("xmlPythonFileReadRaw: failed to convert to UTF-8\n"); |
| | return(-1); |
| | } |
| | lenread = PyBytes_Size(b); |
| | data = PyBytes_AsString(b); |
| | Py_DECREF(b); |
| | #endif |
| | #endif |
| } else { |
} else { |
| printf("xmlPythonFileReadRaw: result is not a String\n"); |
printf("xmlPythonFileReadRaw: result is not a String\n"); |
| Py_DECREF(ret); |
Py_DECREF(ret); |
| |
return(-1); |
| } |
} |
| |
if (lenread > len) |
| |
memcpy(buffer, data, len); |
| |
else |
| |
memcpy(buffer, data, lenread); |
| |
Py_DECREF(ret); |
| return(lenread); |
return(lenread); |
| } |
} |
| |
|
|
Line 323 xmlPythonFileRead (void * context, char * buffer, int
|
Line 355 xmlPythonFileRead (void * context, char * buffer, int
|
| if (ret == NULL) { |
if (ret == NULL) { |
| printf("xmlPythonFileRead: result is NULL\n"); |
printf("xmlPythonFileRead: result is NULL\n"); |
| return(-1); |
return(-1); |
| } else if (PyString_Check(ret)) { | } else if (PyBytes_Check(ret)) { |
| lenread = PyString_Size(ret); | lenread = PyBytes_Size(ret); |
| data = PyString_AsString(ret); | data = PyBytes_AsString(ret); |
| if (lenread > len) | #ifdef PyUnicode_Check |
| memcpy(buffer, data, len); | } else if PyUnicode_Check (ret) { |
| else | #if PY_VERSION_HEX >= 0x03030000 |
| memcpy(buffer, data, lenread); | size_t size; |
| Py_DECREF(ret); | const char *tmp; |
| | |
| | /* tmp doesn't need to be deallocated */ |
| | tmp = PyUnicode_AsUTF8AndSize(ret, &size); |
| | |
| | lenread = (int) size; |
| | data = (char *) tmp; |
| | #else |
| | PyObject *b; |
| | b = PyUnicode_AsUTF8String(ret); |
| | if (b == NULL) { |
| | printf("xmlPythonFileRead: failed to convert to UTF-8\n"); |
| | return(-1); |
| | } |
| | lenread = PyBytes_Size(b); |
| | data = PyBytes_AsString(b); |
| | Py_DECREF(b); |
| | #endif |
| | #endif |
| } else { |
} else { |
| printf("xmlPythonFileRead: result is not a String\n"); |
printf("xmlPythonFileRead: result is not a String\n"); |
| Py_DECREF(ret); |
Py_DECREF(ret); |
| |
return(-1); |
| } |
} |
| |
if (lenread > len) |
| |
memcpy(buffer, data, len); |
| |
else |
| |
memcpy(buffer, data, lenread); |
| |
Py_DECREF(ret); |
| return(lenread); |
return(lenread); |
| } |
} |
| |
|
|
Line 360 xmlPythonFileWrite (void * context, const char * buffe
|
Line 416 xmlPythonFileWrite (void * context, const char * buffe
|
| #endif |
#endif |
| file = (PyObject *) context; |
file = (PyObject *) context; |
| if (file == NULL) return(-1); |
if (file == NULL) return(-1); |
| string = PyString_FromStringAndSize(buffer, len); | string = PY_IMPORT_STRING_SIZE(buffer, len); |
| if (string == NULL) return(-1); |
if (string == NULL) return(-1); |
| if (PyObject_HasAttrString(file, (char *) "io_write")) { |
if (PyObject_HasAttrString(file, (char *) "io_write")) { |
| ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)", |
ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)", |
|
Line 373 xmlPythonFileWrite (void * context, const char * buffe
|
Line 429 xmlPythonFileWrite (void * context, const char * buffe
|
| if (ret == NULL) { |
if (ret == NULL) { |
| printf("xmlPythonFileWrite: result is NULL\n"); |
printf("xmlPythonFileWrite: result is NULL\n"); |
| return(-1); |
return(-1); |
| } else if (PyInt_Check(ret)) { | } else if (PyLong_Check(ret)) { |
| written = (int) PyInt_AsLong(ret); | written = (int) PyLong_AsLong(ret); |
| Py_DECREF(ret); |
Py_DECREF(ret); |
| } else if (ret == Py_None) { |
} else if (ret == Py_None) { |
| written = len; |
written = len; |
|
Line 667 pythonExternalEntityLoader(const char *URL, const char
|
Line 723 pythonExternalEntityLoader(const char *URL, const char
|
| Py_XDECREF(ctxtobj); |
Py_XDECREF(ctxtobj); |
| #ifdef DEBUG_LOADER |
#ifdef DEBUG_LOADER |
| printf("pythonExternalEntityLoader: result "); |
printf("pythonExternalEntityLoader: result "); |
| PyObject_Print(ret, stderr, 0); | PyObject_Print(ret, stdout, 0); |
| printf("\n"); |
printf("\n"); |
| #endif |
#endif |
| |
|
|
Line 713 libxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *s
|
Line 769 libxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *s
|
| &loader)) |
&loader)) |
| return(NULL); |
return(NULL); |
| |
|
| |
if (!PyCallable_Check(loader)) { |
| |
PyErr_SetString(PyExc_ValueError, "entity loader is not callable"); |
| |
return(NULL); |
| |
} |
| |
|
| #ifdef DEBUG_LOADER |
#ifdef DEBUG_LOADER |
| printf("libxml_xmlSetEntityLoader\n"); |
printf("libxml_xmlSetEntityLoader\n"); |
| #endif |
#endif |
| if (defaultExternalEntityLoader == NULL) |
if (defaultExternalEntityLoader == NULL) |
| defaultExternalEntityLoader = xmlGetExternalEntityLoader(); |
defaultExternalEntityLoader = xmlGetExternalEntityLoader(); |
| |
|
| |
Py_XDECREF(pythonExternalEntityLoaderObjext); |
| pythonExternalEntityLoaderObjext = loader; |
pythonExternalEntityLoaderObjext = loader; |
| |
Py_XINCREF(pythonExternalEntityLoaderObjext); |
| xmlSetExternalEntityLoader(pythonExternalEntityLoader); |
xmlSetExternalEntityLoader(pythonExternalEntityLoader); |
| |
|
| py_retval = PyInt_FromLong(0); | py_retval = PyLong_FromLong(0); |
| return(py_retval); |
return(py_retval); |
| } |
} |
| |
|
| |
/************************************************************************ |
| |
* * |
| |
* Input callback registration * |
| |
* * |
| |
************************************************************************/ |
| |
static PyObject *pythonInputOpenCallbackObject; |
| |
static int pythonInputCallbackID = -1; |
| |
|
| |
static int |
| |
pythonInputMatchCallback(ATTRIBUTE_UNUSED const char *URI) |
| |
{ |
| |
/* Always return success, real decision whether URI is supported will be |
| |
* made in open callback. */ |
| |
return 1; |
| |
} |
| |
|
| |
static void * |
| |
pythonInputOpenCallback(const char *URI) |
| |
{ |
| |
PyObject *ret; |
| |
|
| |
ret = PyObject_CallFunction(pythonInputOpenCallbackObject, |
| |
(char *)"s", URI); |
| |
if (ret == Py_None) { |
| |
Py_DECREF(Py_None); |
| |
return NULL; |
| |
} |
| |
return ret; |
| |
} |
| |
|
| |
PyObject * |
| |
libxml_xmlRegisterInputCallback(ATTRIBUTE_UNUSED PyObject *self, |
| |
PyObject *args) { |
| |
PyObject *cb; |
| |
|
| |
if (!PyArg_ParseTuple(args, |
| |
(const char *)"O:libxml_xmlRegisterInputCallback", &cb)) |
| |
return(NULL); |
| |
|
| |
if (!PyCallable_Check(cb)) { |
| |
PyErr_SetString(PyExc_ValueError, "input callback is not callable"); |
| |
return(NULL); |
| |
} |
| |
|
| |
/* Python module registers a single callback and manages the list of |
| |
* all callbacks internally. This is necessitated by xmlInputMatchCallback |
| |
* API, which does not allow for passing of data objects to discriminate |
| |
* different Python methods. */ |
| |
if (pythonInputCallbackID == -1) { |
| |
pythonInputCallbackID = xmlRegisterInputCallbacks( |
| |
pythonInputMatchCallback, pythonInputOpenCallback, |
| |
xmlPythonFileReadRaw, xmlPythonFileCloseRaw); |
| |
if (pythonInputCallbackID == -1) |
| |
return PyErr_NoMemory(); |
| |
pythonInputOpenCallbackObject = cb; |
| |
Py_INCREF(pythonInputOpenCallbackObject); |
| |
} |
| |
|
| |
Py_INCREF(Py_None); |
| |
return(Py_None); |
| |
} |
| |
|
| |
PyObject * |
| |
libxml_xmlUnregisterInputCallback(ATTRIBUTE_UNUSED PyObject *self, |
| |
ATTRIBUTE_UNUSED PyObject *args) { |
| |
int ret; |
| |
|
| |
ret = xmlPopInputCallbacks(); |
| |
if (pythonInputCallbackID != -1) { |
| |
/* Assert that the right input callback was popped. libxml's API does not |
| |
* allow removal by ID, so all that could be done is an assert. */ |
| |
if (pythonInputCallbackID == ret) { |
| |
pythonInputCallbackID = -1; |
| |
Py_DECREF(pythonInputOpenCallbackObject); |
| |
pythonInputOpenCallbackObject = NULL; |
| |
} else { |
| |
PyErr_SetString(PyExc_AssertionError, "popped non-python input callback"); |
| |
return(NULL); |
| |
} |
| |
} else if (ret == -1) { |
| |
/* No more callbacks to pop */ |
| |
PyErr_SetString(PyExc_IndexError, "no input callbacks to pop"); |
| |
return(NULL); |
| |
} |
| |
|
| |
Py_INCREF(Py_None); |
| |
return(Py_None); |
| |
} |
| |
|
| /************************************************************************ |
/************************************************************************ |
| * * |
* * |
| * Handling SAX/xmllib/sgmlop callback interfaces * |
* Handling SAX/xmllib/sgmlop callback interfaces * |
|
Line 766 pythonStartElement(void *user_data, const xmlChar * na
|
Line 917 pythonStartElement(void *user_data, const xmlChar * na
|
| } else { |
} else { |
| dict = PyDict_New(); |
dict = PyDict_New(); |
| for (i = 0; attrs[i] != NULL; i++) { |
for (i = 0; attrs[i] != NULL; i++) { |
| attrname = PyString_FromString((char *) attrs[i]); | attrname = PY_IMPORT_STRING((char *) attrs[i]); |
| i++; |
i++; |
| if (attrs[i] != NULL) { |
if (attrs[i] != NULL) { |
| attrvalue = PyString_FromString((char *) attrs[i]); | attrvalue = PY_IMPORT_STRING((char *) attrs[i]); |
| } else { |
} else { |
| Py_XINCREF(Py_None); |
Py_XINCREF(Py_None); |
| attrvalue = Py_None; |
attrvalue = Py_None; |
|
Line 1172 pythonAttributeDecl(void *user_data,
|
Line 1323 pythonAttributeDecl(void *user_data,
|
| nameList = PyList_New(count); |
nameList = PyList_New(count); |
| count = 0; |
count = 0; |
| for (node = tree; node != NULL; node = node->next) { |
for (node = tree; node != NULL; node = node->next) { |
| newName = PyString_FromString((char *) node->name); | newName = PY_IMPORT_STRING((char *) node->name); |
| PyList_SetItem(nameList, count, newName); |
PyList_SetItem(nameList, count, newName); |
| Py_DECREF(newName); |
Py_DECREF(newName); |
| count++; |
count++; |
|
Line 1367 libxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject
|
Line 1518 libxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject
|
| PyObject * |
PyObject * |
| libxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) |
libxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) |
| { |
{ |
| |
#ifdef LIBXML_SAX1_ENABLED |
| int recover; |
int recover; |
| const char *URI; |
const char *URI; |
| PyObject *pyobj_SAX = NULL; |
PyObject *pyobj_SAX = NULL; |
|
Line 1388 libxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * sel
|
Line 1540 libxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * sel
|
| Py_INCREF(pyobj_SAX); |
Py_INCREF(pyobj_SAX); |
| /* The reference is released in pythonEndDocument() */ |
/* The reference is released in pythonEndDocument() */ |
| xmlSAXUserParseFile(SAX, pyobj_SAX, URI); |
xmlSAXUserParseFile(SAX, pyobj_SAX, URI); |
| |
#endif /* LIBXML_SAX1_ENABLED */ |
| Py_INCREF(Py_None); |
Py_INCREF(Py_None); |
| return (Py_None); |
return (Py_None); |
| } |
} |
|
Line 1745 typedef struct
|
Line 1898 typedef struct
|
| typedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr; |
typedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr; |
| |
|
| static void |
static void |
| libxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str) | libxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, ATTRIBUTE_UNUSED int severity, char *str) |
| { |
{ |
| PyObject *list; |
PyObject *list; |
| PyObject *result; |
PyObject *result; |
|
Line 1772 libxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx,
|
Line 1925 libxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx,
|
| } |
} |
| |
|
| static void |
static void |
| libxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, int severity, char *str) | libxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, ATTRIBUTE_UNUSED int severity, char *str) |
| { |
{ |
| PyObject *list; |
PyObject *list; |
| PyObject *result; |
PyObject *result; |
|
Line 2033 libxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *se
|
Line 2186 libxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *se
|
| |
|
| if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader)) |
if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader)) |
| return(NULL); |
return(NULL); |
| if (!PyCObject_Check(pyobj_reader)) { | if (!PyCapsule_CheckExact(pyobj_reader)) { |
| Py_INCREF(Py_None); |
Py_INCREF(Py_None); |
| return(Py_None); |
return(Py_None); |
| } |
} |
|
Line 2234 libxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObj
|
Line 2387 libxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObj
|
| return (py_retval); |
return (py_retval); |
| } |
} |
| |
|
| |
PyObject * |
| |
libxml_xmlXPathRegisterVariable(ATTRIBUTE_UNUSED PyObject * self, |
| |
PyObject * args) |
| |
{ |
| |
PyObject *py_retval; |
| |
int c_retval = 0; |
| |
xmlChar *name; |
| |
xmlChar *ns_uri; |
| |
xmlXPathContextPtr ctx; |
| |
xmlXPathObjectPtr val; |
| |
PyObject *pyobj_ctx; |
| |
PyObject *pyobj_value; |
| |
|
| |
if (!PyArg_ParseTuple |
| |
(args, (char *) "OszO:xpathRegisterVariable", &pyobj_ctx, &name, |
| |
&ns_uri, &pyobj_value)) |
| |
return (NULL); |
| |
|
| |
ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); |
| |
val = libxml_xmlXPathObjectPtrConvert(pyobj_value); |
| |
|
| |
c_retval = xmlXPathRegisterVariableNS(ctx, name, ns_uri, val); |
| |
py_retval = libxml_intWrap(c_retval); |
| |
return (py_retval); |
| |
} |
| |
|
| /************************************************************************ |
/************************************************************************ |
| * * |
* * |
| * Global properties access * |
* Global properties access * |
|
Line 2566 libxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject
|
Line 2745 libxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject
|
| if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) |
if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) |
| return NULL; |
return NULL; |
| cur = PyxmlNode_Get(obj); |
cur = PyxmlNode_Get(obj); |
| |
if (cur == NULL) { |
| |
Py_INCREF(Py_None); |
| |
return (Py_None); |
| |
} |
| |
|
| #ifdef DEBUG |
#ifdef DEBUG |
| printf("libxml_type: cur = %p\n", cur); |
printf("libxml_type: cur = %p\n", cur); |
|
Line 2682 libxml_xmlNodeRemoveNsDef(ATTRIBUTE_UNUSED PyObject *
|
Line 2865 libxml_xmlNodeRemoveNsDef(ATTRIBUTE_UNUSED PyObject *
|
| PyObject *pyobj_node; |
PyObject *pyobj_node; |
| xmlChar *href; |
xmlChar *href; |
| xmlNsPtr c_retval; |
xmlNsPtr c_retval; |
| | |
| if (!PyArg_ParseTuple |
if (!PyArg_ParseTuple |
| (args, (char *) "Oz:xmlNodeRemoveNsDef", &pyobj_node, &href)) |
(args, (char *) "Oz:xmlNodeRemoveNsDef", &pyobj_node, &href)) |
| return (NULL); |
return (NULL); |
|
Line 2762 libxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self,
|
Line 2945 libxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self,
|
| xmlDocPtr doc; |
xmlDocPtr doc; |
| const char *encoding; |
const char *encoding; |
| int format; |
int format; |
| int len; |
|
| xmlSaveCtxtPtr ctxt; |
xmlSaveCtxtPtr ctxt; |
| xmlBufferPtr buf; |
xmlBufferPtr buf; |
| int options = 0; |
int options = 0; |
|
Line 2845 libxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, Py
|
Line 3027 libxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, Py
|
| &py_file, &encoding, &format)) |
&py_file, &encoding, &format)) |
| return (NULL); |
return (NULL); |
| node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); |
node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); |
| |
|
| if (node == NULL) { |
if (node == NULL) { |
| return (PyInt_FromLong((long) -1)); | return (PyLong_FromLong((long) -1)); |
| } |
} |
| if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { | output = PyFile_Get(py_file); |
| return (PyInt_FromLong((long) -1)); | |
| } | |
| output = PyFile_AsFile(py_file); | |
| if (output == NULL) { |
if (output == NULL) { |
| return (PyInt_FromLong((long) -1)); | return (PyLong_FromLong((long) -1)); |
| } |
} |
| |
|
| if (node->type == XML_DOCUMENT_NODE) { |
if (node->type == XML_DOCUMENT_NODE) { |
|
Line 2873 libxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, Py
|
Line 3051 libxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, Py
|
| if (encoding != NULL) { |
if (encoding != NULL) { |
| handler = xmlFindCharEncodingHandler(encoding); |
handler = xmlFindCharEncodingHandler(encoding); |
| if (handler == NULL) { |
if (handler == NULL) { |
| return (PyInt_FromLong((long) -1)); | return (PyLong_FromLong((long) -1)); |
| } |
} |
| } |
} |
| if (doc->type == XML_HTML_DOCUMENT_NODE) { |
if (doc->type == XML_HTML_DOCUMENT_NODE) { |
|
Line 2898 libxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, Py
|
Line 3076 libxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, Py
|
| xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); |
xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); |
| len = xmlOutputBufferClose(buf); |
len = xmlOutputBufferClose(buf); |
| } |
} |
| return (PyInt_FromLong((long) len)); | PyFile_Release(output); |
| | return (PyLong_FromLong((long) len)); |
| } |
} |
| #endif /* LIBXML_OUTPUT_ENABLED */ |
#endif /* LIBXML_OUTPUT_ENABLED */ |
| |
|
|
Line 3404 PystringSet_Convert(PyObject *py_strings, xmlChar ***
|
Line 3583 PystringSet_Convert(PyObject *py_strings, xmlChar ***
|
| { |
{ |
| int idx; |
int idx; |
| for (idx=0; idx < count; ++idx) { |
for (idx=0; idx < count; ++idx) { |
| char* s = PyString_AsString | char* s = PyBytes_AsString |
| (is_tuple |
(is_tuple |
| ? PyTuple_GET_ITEM(py_strings, idx) |
? PyTuple_GET_ITEM(py_strings, idx) |
| : PyList_GET_ITEM(py_strings, idx)); |
: PyList_GET_ITEM(py_strings, idx)); |
|
Line 3493 libxml_C14NDocDumpMemory(ATTRIBUTE_UNUSED PyObject * s
|
Line 3672 libxml_C14NDocDumpMemory(ATTRIBUTE_UNUSED PyObject * s
|
| return NULL; |
return NULL; |
| } |
} |
| else { |
else { |
| py_retval = PyString_FromStringAndSize((const char *) doc_txt, | py_retval = PY_IMPORT_STRING_SIZE((const char *) doc_txt, |
| result); | result); |
| xmlFree(doc_txt); |
xmlFree(doc_txt); |
| return py_retval; |
return py_retval; |
| } |
} |
|
Line 3535 libxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
|
Line 3714 libxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
|
| return NULL; |
return NULL; |
| } |
} |
| |
|
| if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { | output = PyFile_Get(py_file); |
| PyErr_SetString(PyExc_TypeError, "bad file."); | |
| return NULL; | |
| } | |
| output = PyFile_AsFile(py_file); | |
| if (output == NULL) { |
if (output == NULL) { |
| PyErr_SetString(PyExc_TypeError, "bad file."); |
PyErr_SetString(PyExc_TypeError, "bad file."); |
| return NULL; |
return NULL; |
|
Line 3577 libxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
|
Line 3752 libxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
|
| xmlFree(prefixes); |
xmlFree(prefixes); |
| } |
} |
| |
|
| |
PyFile_Release(output); |
| len = xmlOutputBufferClose(buf); |
len = xmlOutputBufferClose(buf); |
| |
|
| if (result < 0) { |
if (result < 0) { |
|
Line 3585 libxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
|
Line 3761 libxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
|
| return NULL; |
return NULL; |
| } |
} |
| else |
else |
| return PyInt_FromLong((long) len); | return PyLong_FromLong((long) len); |
| } |
} |
| |
|
| #endif |
#endif |
|
Line 3599 libxml_getObjDesc(PyObject *self ATTRIBUTE_UNUSED, PyO
|
Line 3775 libxml_getObjDesc(PyObject *self ATTRIBUTE_UNUSED, PyO
|
| |
|
| if (!PyArg_ParseTuple(args, (char *)"O:getObjDesc", &obj)) |
if (!PyArg_ParseTuple(args, (char *)"O:getObjDesc", &obj)) |
| return NULL; |
return NULL; |
| str = PyCObject_GetDesc(obj); | str = PyCapsule_GetPointer(obj, PyCapsule_GetName(obj)); |
| return Py_BuildValue((char *)"s", str); |
return Py_BuildValue((char *)"s", str); |
| } |
} |
| |
|
|
Line 3694 static PyMethodDef libxmlMethods[] = {
|
Line 3870 static PyMethodDef libxmlMethods[] = {
|
| {(char *) "getObjDesc", libxml_getObjDesc, METH_VARARGS, NULL}, |
{(char *) "getObjDesc", libxml_getObjDesc, METH_VARARGS, NULL}, |
| {(char *) "compareNodesEqual", libxml_compareNodesEqual, METH_VARARGS, NULL}, |
{(char *) "compareNodesEqual", libxml_compareNodesEqual, METH_VARARGS, NULL}, |
| {(char *) "nodeHash", libxml_nodeHash, METH_VARARGS, NULL}, |
{(char *) "nodeHash", libxml_nodeHash, METH_VARARGS, NULL}, |
| |
{(char *) "xmlRegisterInputCallback", libxml_xmlRegisterInputCallback, METH_VARARGS, NULL}, |
| |
{(char *) "xmlUnregisterInputCallback", libxml_xmlUnregisterInputCallback, METH_VARARGS, NULL}, |
| {NULL, NULL, 0, NULL} |
{NULL, NULL, 0, NULL} |
| }; |
}; |
| |
|
| |
#if PY_MAJOR_VERSION >= 3 |
| |
#define INITERROR return NULL |
| |
|
| |
static struct PyModuleDef moduledef = { |
| |
PyModuleDef_HEAD_INIT, |
| |
"libxml2mod", |
| |
NULL, |
| |
-1, |
| |
libxmlMethods, |
| |
NULL, |
| |
NULL, |
| |
NULL, |
| |
NULL |
| |
}; |
| |
|
| |
#else |
| |
#define INITERROR return |
| |
|
| #ifdef MERGED_MODULES |
#ifdef MERGED_MODULES |
| extern void initlibxsltmod(void); |
extern void initlibxsltmod(void); |
| #endif |
#endif |
| |
|
| void | #endif |
| initlibxml2mod(void) | |
| | #if PY_MAJOR_VERSION >= 3 |
| | PyObject *PyInit_libxml2mod(void) |
| | #else |
| | void initlibxml2mod(void) |
| | #endif |
| { |
{ |
| static int initialized = 0; | PyObject *module; |
| |
|
| if (initialized != 0) | #if PY_MAJOR_VERSION >= 3 |
| return; | module = PyModule_Create(&moduledef); |
| #else |
| /* intialize the python extension module */ |
/* intialize the python extension module */ |
| Py_InitModule((char *) "libxml2mod", libxmlMethods); | module = Py_InitModule((char *) "libxml2mod", libxmlMethods); |
| | #endif |
| | if (module == NULL) |
| | INITERROR; |
| |
|
| /* initialize libxml2 */ |
/* initialize libxml2 */ |
| xmlInitParser(); |
xmlInitParser(); |
| |
/* TODO this probably need to be revamped for Python3 */ |
| libxml_xmlErrorInitialize(); |
libxml_xmlErrorInitialize(); |
| |
|
| initialized = 1; | #if PY_MAJOR_VERSION < 3 |
| |
| #ifdef MERGED_MODULES |
#ifdef MERGED_MODULES |
| initlibxsltmod(); |
initlibxsltmod(); |
| |
#endif |
| |
#endif |
| |
|
| |
#if PY_MAJOR_VERSION >= 3 |
| |
return module; |
| #endif |
#endif |
| } |
} |