📄 libxml.c
字号:
/** * libxml_outputBufferGetPythonFile: * @buffer: the I/O buffer * * read the Python I/O from the CObject * * Returns the new parser output or NULL */static PyObject *libxml_outputBufferGetPythonFile(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { PyObject *buffer; PyObject *file; xmlOutputBufferPtr obj; if (!PyArg_ParseTuple(args, (char *)"O:outputBufferGetPythonFile", &buffer)) return(NULL); obj = PyoutputBuffer_Get(buffer); if (obj == NULL) { fprintf(stderr, "outputBufferGetPythonFile: obj == NULL\n"); Py_INCREF(Py_None); return(Py_None); } if (obj->closecallback != xmlPythonFileClose) { fprintf(stderr, "outputBufferGetPythonFile: not a python file wrapper\n"); Py_INCREF(Py_None); return(Py_None); } file = (PyObject *) obj->context; if (file == NULL) { Py_INCREF(Py_None); return(Py_None); } Py_INCREF(file); return(file);}static PyObject *libxml_xmlOutputBufferClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { PyObject *py_retval; int c_retval; xmlOutputBufferPtr out; PyObject *pyobj_out; if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out)) return(NULL); out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out); /* Buffer may already have been destroyed elsewhere. This is harmless. */ if (out == NULL) { Py_INCREF(Py_None); return(Py_None); } c_retval = xmlOutputBufferClose(out); py_retval = libxml_intWrap((int) c_retval); return(py_retval);}static PyObject *libxml_xmlOutputBufferFlush(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { PyObject *py_retval; int c_retval; xmlOutputBufferPtr out; PyObject *pyobj_out; if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferFlush", &pyobj_out)) return(NULL); out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out); c_retval = xmlOutputBufferFlush(out); py_retval = libxml_intWrap((int) c_retval); return(py_retval);}static PyObject *libxml_xmlSaveFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { PyObject *py_retval; int c_retval; xmlOutputBufferPtr buf; PyObject *pyobj_buf; xmlDocPtr cur; PyObject *pyobj_cur; char * encoding; if (!PyArg_ParseTuple(args, (char *)"OOz:xmlSaveFileTo", &pyobj_buf, &pyobj_cur, &encoding)) return(NULL); buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf); cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur); c_retval = xmlSaveFileTo(buf, cur, encoding); /* xmlSaveTo() freed the memory pointed to by buf, so record that in the * Python object. */ ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL; py_retval = libxml_intWrap((int) c_retval); return(py_retval);}static PyObject *libxml_xmlSaveFormatFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { PyObject *py_retval; int c_retval; xmlOutputBufferPtr buf; PyObject *pyobj_buf; xmlDocPtr cur; PyObject *pyobj_cur; char * encoding; int format; if (!PyArg_ParseTuple(args, (char *)"OOzi:xmlSaveFormatFileTo", &pyobj_buf, &pyobj_cur, &encoding, &format)) return(NULL); buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf); cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur); c_retval = xmlSaveFormatFileTo(buf, cur, encoding, format); /* xmlSaveFormatFileTo() freed the memory pointed to by buf, so record that * in the Python object */ ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL; py_retval = libxml_intWrap((int) c_retval); return(py_retval);}#endif /* LIBXML_OUTPUT_ENABLED *//** * xmlParserInputBufferCreatePythonFile: * @file: a PyFile_Type * @encoder: the encoding converter or NULL * * Create a buffered output for the progressive saving to a PyFile_Type * buffered C I/O * * Returns the new parser output or NULL */static xmlParserInputBufferPtrxmlParserInputBufferCreatePythonFile(PyObject *file, xmlCharEncoding encoding) { xmlParserInputBufferPtr ret; if (file == NULL) return(NULL); ret = xmlAllocParserInputBuffer(encoding); if (ret != NULL) { ret->context = file; /* Py_INCREF(file); */ ret->readcallback = xmlPythonFileRead; ret->closecallback = xmlPythonFileClose; } return(ret);}PyObject *libxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { PyObject *py_retval; PyObject *file; xmlChar *encoding; xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; xmlParserInputBufferPtr buffer; if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate", &file, &encoding)) return(NULL); if ((encoding != NULL) && (encoding[0] != 0)) { enc = xmlParseCharEncoding((const char *) encoding); } buffer = xmlParserInputBufferCreatePythonFile(file, enc); if (buffer == NULL) printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n"); py_retval = libxml_xmlParserInputBufferPtrWrap(buffer); return(py_retval);}/************************************************************************ * * * Providing the resolver at the Python level * * * ************************************************************************/static xmlExternalEntityLoader defaultExternalEntityLoader = NULL;static PyObject *pythonExternalEntityLoaderObjext;static xmlParserInputPtrpythonExternalEntityLoader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { xmlParserInputPtr result = NULL; if (pythonExternalEntityLoaderObjext != NULL) { PyObject *ret; PyObject *ctxtobj; ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt);#ifdef DEBUG_LOADER printf("pythonExternalEntityLoader: ready to call\n");#endif ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext, (char *) "(ssO)", URL, ID, ctxtobj); Py_XDECREF(ctxtobj);#ifdef DEBUG_LOADER printf("pythonExternalEntityLoader: result "); PyObject_Print(ret, stderr, 0); printf("\n");#endif if (ret != NULL) { if (PyObject_HasAttrString(ret, (char *) "read")) { xmlParserInputBufferPtr buf; buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); if (buf != NULL) { buf->context = ret; buf->readcallback = xmlPythonFileReadRaw; buf->closecallback = xmlPythonFileCloseRaw; result = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE); } } else { printf("pythonExternalEntityLoader: can't read\n"); } if (result == NULL) { Py_DECREF(ret); } else if (URL != NULL) { result->filename = (char *) xmlStrdup((const xmlChar *)URL); result->directory = xmlParserGetDirectory((const char *) URL); } } } if ((result == NULL) && (defaultExternalEntityLoader != NULL)) { result = defaultExternalEntityLoader(URL, ID, ctxt); } return(result);}PyObject *libxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { PyObject *py_retval; PyObject *loader; if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader", &loader)) return(NULL);#ifdef DEBUG_LOADER printf("libxml_xmlSetEntityLoader\n");#endif if (defaultExternalEntityLoader == NULL) defaultExternalEntityLoader = xmlGetExternalEntityLoader(); pythonExternalEntityLoaderObjext = loader; xmlSetExternalEntityLoader(pythonExternalEntityLoader); py_retval = PyInt_FromLong(0); return(py_retval);}/************************************************************************ * * * Handling SAX/xmllib/sgmlop callback interfaces * * * ************************************************************************/static voidpythonStartElement(void *user_data, const xmlChar * name, const xmlChar ** attrs){ int i; PyObject *handler; PyObject *dict; PyObject *attrname; PyObject *attrvalue; PyObject *result = NULL; int type = 0;#ifdef DEBUG_SAX printf("pythonStartElement(%s) called\n", name);#endif handler = (PyObject *) user_data; if (PyObject_HasAttrString(handler, (char *) "startElement")) type = 1; else if (PyObject_HasAttrString(handler, (char *) "start")) type = 2; if (type != 0) { /* * the xmllib interface always generate a dictionnary, * possibly empty */ if ((attrs == NULL) && (type == 1)) { Py_XINCREF(Py_None); dict = Py_None; } else if (attrs == NULL) { dict = PyDict_New(); } else { dict = PyDict_New(); for (i = 0; attrs[i] != NULL; i++) { attrname = PyString_FromString((char *) attrs[i]); i++; if (attrs[i] != NULL) { attrvalue = PyString_FromString((char *) attrs[i]); } else { Py_XINCREF(Py_None); attrvalue = Py_None; } PyDict_SetItem(dict, attrname, attrvalue); } } if (type == 1) result = PyObject_CallMethod(handler, (char *) "startElement", (char *) "sO", name, dict); else if (type == 2) result = PyObject_CallMethod(handler, (char *) "start", (char *) "sO", name, dict); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(dict); Py_XDECREF(result); }}static voidpythonStartDocument(void *user_data){ PyObject *handler; PyObject *result;#ifdef DEBUG_SAX printf("pythonStartDocument() called\n");#endif handler = (PyObject *) user_data; if (PyObject_HasAttrString(handler, (char *) "startDocument")) { result = PyObject_CallMethod(handler, (char *) "startDocument", NULL); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(result); }}static voidpythonEndDocument(void *user_data){ PyObject *handler; PyObject *result;#ifdef DEBUG_SAX printf("pythonEndDocument() called\n");#endif handler = (PyObject *) user_data; if (PyObject_HasAttrString(handler, (char *) "endDocument")) { result = PyObject_CallMethod(handler, (char *) "endDocument", NULL); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(result); } /* * The reference to the handler is released there */ Py_XDECREF(handler);}static voidpythonEndElement(void *user_data, const xmlChar * name){ PyObject *handler; PyObject *result;#ifdef DEBUG_SAX printf("pythonEndElement(%s) called\n", name);#endif handler = (PyObject *) user_data; if (PyObject_HasAttrString(handler, (char *) "endElement")) { result = PyObject_CallMethod(handler, (char *) "endElement", (char *) "s", name); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(result); } else if (PyObject_HasAttrString(handler, (char *) "end")) { result = PyObject_CallMethod(handler, (char *) "end", (char *) "s", name); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(result); }}static voidpythonReference(void *user_data, const xmlChar * name){ PyObject *handler; PyObject *result;#ifdef DEBUG_SAX printf("pythonReference(%s) called\n", name);#endif handler = (PyObject *) user_data; if (PyObject_HasAttrString(handler, (char *) "reference")) { result = PyObject_CallMethod(handler, (char *) "reference", (char *) "s", name); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(result); }}static voidpythonCharacters(void *user_data, const xmlChar * ch, int len){ PyObject *handler; PyObject *result = NULL; int type = 0;#ifdef DEBUG_SAX printf("pythonCharacters(%s, %d) called\n", ch, len);#endif handler = (PyObject *) user_data; if (PyObject_HasAttrString(handler, (char *) "characters")) type = 1; else if (PyObject_HasAttrString(handler, (char *) "data")) type = 2; if (type != 0) { if (type == 1) result = PyObject_CallMethod(handler, (char *) "characters", (char *) "s#", ch, len); else if (type == 2) result = PyObject_CallMethod(handler, (char *) "data", (char *) "s#", ch, len); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(result); }}static voidpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len){ PyObject *handler; PyObject *result = NULL; int type = 0;#ifdef DEBUG_SAX printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len);#endif handler = (PyObject *) user_data; if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace")) type = 1; else if (PyObject_HasAttrString(handler, (char *) "data")) type = 2; if (type != 0) { if (type == 1) result = PyObject_CallMethod(handler, (char *) "ignorableWhitespace", (char *) "s#", ch, len); else if (type == 2) result =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -