📄 libxml.c
字号:
Py_XINCREF(pyobj_warn); pyCtxt->warn = pyobj_warn; Py_XDECREF(pyCtxt->arg); Py_XINCREF(pyobj_arg); pyCtxt->arg = pyobj_arg; ctxt->error = libxml_xmlValidCtxtErrorFuncHandler; ctxt->warning = libxml_xmlValidCtxtWarningFuncHandler; ctxt->userData = pyCtxt; py_retval = libxml_intWrap(1); return (py_retval);}static PyObject *libxml_xmlFreeValidCtxt(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { xmlValidCtxtPtr cur; xmlValidCtxtPyCtxtPtr pyCtxt; PyObject *pyobj_cur; if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeValidCtxt", &pyobj_cur)) return(NULL); cur = (xmlValidCtxtPtr) PyValidCtxt_Get(pyobj_cur); pyCtxt = (xmlValidCtxtPyCtxtPtr)(cur->userData); if (pyCtxt != NULL) { Py_XDECREF(pyCtxt->error); Py_XDECREF(pyCtxt->warn); Py_XDECREF(pyCtxt->arg); xmlFree(pyCtxt); } xmlFreeValidCtxt(cur); Py_INCREF(Py_None); return(Py_None);}/************************************************************************ * * * Per xmlTextReader error handler * * * ************************************************************************/typedef struct { PyObject *f; PyObject *arg;} xmlTextReaderPyCtxt;typedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr;static void libxml_xmlTextReaderErrorCallback(void *arg, const char *msg, int severity, xmlTextReaderLocatorPtr locator){ xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg; PyObject *list; PyObject *result; list = PyTuple_New(4); PyTuple_SetItem(list, 0, pyCtxt->arg); Py_XINCREF(pyCtxt->arg); PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg)); PyTuple_SetItem(list, 2, libxml_intWrap(severity)); PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator)); result = PyEval_CallObject(pyCtxt->f, list); if (result == NULL) { /* TODO: manage for the exception to be propagated... */ PyErr_Print(); } Py_XDECREF(list); Py_XDECREF(result);}static PyObject *libxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args){ xmlTextReaderPtr reader; xmlTextReaderPyCtxtPtr pyCtxt; xmlTextReaderErrorFunc f; void *arg; PyObject *pyobj_reader; PyObject *pyobj_f; PyObject *pyobj_arg; PyObject *py_retval; if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg)) return(NULL); reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); /* clear previous error handler */ xmlTextReaderGetErrorHandler(reader,&f,&arg); if (arg != NULL) { if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) { /* ok, it's our error handler! */ pyCtxt = (xmlTextReaderPyCtxtPtr)arg; Py_XDECREF(pyCtxt->f); Py_XDECREF(pyCtxt->arg); xmlFree(pyCtxt); } else { /* * there already an arg, and it's not ours, * there is definitely something wrong going on here... * we don't know how to free it, so we bail out... */ py_retval = libxml_intWrap(-1); return(py_retval); } } xmlTextReaderSetErrorHandler(reader,NULL,NULL); /* set new error handler */ if (pyobj_f != Py_None) { pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt)); if (pyCtxt == NULL) { py_retval = libxml_intWrap(-1); return(py_retval); } Py_XINCREF(pyobj_f); pyCtxt->f = pyobj_f; Py_XINCREF(pyobj_arg); pyCtxt->arg = pyobj_arg; xmlTextReaderSetErrorHandler(reader, (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback, pyCtxt); } py_retval = libxml_intWrap(1); return(py_retval);}static PyObject *libxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args){ xmlTextReaderPtr reader; xmlTextReaderPyCtxtPtr pyCtxt; xmlTextReaderErrorFunc f; void *arg; PyObject *pyobj_reader; PyObject *py_retval; if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader)) return(NULL); reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); xmlTextReaderGetErrorHandler(reader,&f,&arg); py_retval = PyTuple_New(2); if (f == (xmlTextReaderErrorFunc)libxml_xmlTextReaderErrorCallback) { /* ok, it's our error handler! */ pyCtxt = (xmlTextReaderPyCtxtPtr)arg; PyTuple_SetItem(py_retval, 0, pyCtxt->f); Py_XINCREF(pyCtxt->f); PyTuple_SetItem(py_retval, 1, pyCtxt->arg); Py_XINCREF(pyCtxt->arg); } else { /* f is null or it's not our error handler */ PyTuple_SetItem(py_retval, 0, Py_None); Py_XINCREF(Py_None); PyTuple_SetItem(py_retval, 1, Py_None); Py_XINCREF(Py_None); } return(py_retval);}static PyObject *libxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { xmlTextReaderPtr reader; PyObject *pyobj_reader; xmlTextReaderPyCtxtPtr pyCtxt; xmlTextReaderErrorFunc f; void *arg; if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader)) return(NULL); if (!PyCObject_Check(pyobj_reader)) { Py_INCREF(Py_None); return(Py_None); } reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); if (reader == NULL) { Py_INCREF(Py_None); return(Py_None); } xmlTextReaderGetErrorHandler(reader,&f,&arg); if (arg != NULL) { if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) { /* ok, it's our error handler! */ pyCtxt = (xmlTextReaderPyCtxtPtr)arg; Py_XDECREF(pyCtxt->f); Py_XDECREF(pyCtxt->arg); xmlFree(pyCtxt); } /* * else, something wrong happened, because the error handler is * not owned by the python bindings... */ } xmlFreeTextReader(reader); Py_INCREF(Py_None); return(Py_None);}/************************************************************************ * * * XPath extensions * * * ************************************************************************/static voidlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs){ PyObject *list, *cur, *result; xmlXPathObjectPtr obj; xmlXPathContextPtr rctxt; PyObject *current_function = NULL; const xmlChar *name; const xmlChar *ns_uri; int i; if (ctxt == NULL) return; rctxt = ctxt->context; if (rctxt == NULL) return; name = rctxt->function; ns_uri = rctxt->functionURI;#ifdef DEBUG_XPATH printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name, ns_uri);#endif /* * Find the function, it should be there it was there at lookup */ for (i = 0; i < libxml_xpathCallbacksNb; i++) { if ( /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */ (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { current_function = (*libxml_xpathCallbacks)[i].function; } } if (current_function == NULL) { printf ("libxml_xmlXPathFuncCallback: internal error %s not found !\n", name); return; } list = PyTuple_New(nargs + 1); PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt)); for (i = nargs - 1; i >= 0; i--) { obj = valuePop(ctxt); cur = libxml_xmlXPathObjectPtrWrap(obj); PyTuple_SetItem(list, i + 1, cur); } result = PyEval_CallObject(current_function, list); Py_DECREF(list); obj = libxml_xmlXPathObjectPtrConvert(result); valuePush(ctxt, obj);}static xmlXPathFunctionlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name, const xmlChar * ns_uri){ int i;#ifdef DEBUG_XPATH printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", ctxt, name, ns_uri);#endif /* * This is called once only. The address is then stored in the * XPath expression evaluation, the proper object to call can * then still be found using the execution context function * and functionURI fields. */ for (i = 0; i < libxml_xpathCallbacksNb; i++) { if ((ctxt == (*libxml_xpathCallbacks)[i].ctx) && (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { return (libxml_xmlXPathFuncCallback); } } return (NULL);}static voidlibxml_xpathCallbacksInitialize(void){ int i; if (libxml_xpathCallbacksInitialized != 0) return;#ifdef DEBUG_XPATH printf("libxml_xpathCallbacksInitialized called\n");#endif libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlMalloc( libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback)); for (i = 0; i < libxml_xpathCallbacksAllocd; i++) { (*libxml_xpathCallbacks)[i].ctx = NULL; (*libxml_xpathCallbacks)[i].name = NULL; (*libxml_xpathCallbacks)[i].ns_uri = NULL; (*libxml_xpathCallbacks)[i].function = NULL; } libxml_xpathCallbacksInitialized = 1;}PyObject *libxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self, PyObject * args){ PyObject *py_retval; int c_retval = 0; xmlChar *name; xmlChar *ns_uri; xmlXPathContextPtr ctx; PyObject *pyobj_ctx; PyObject *pyobj_f; int i; if (!PyArg_ParseTuple (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name, &ns_uri, &pyobj_f)) return (NULL); ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); if (libxml_xpathCallbacksInitialized == 0) libxml_xpathCallbacksInitialize(); xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { py_retval = libxml_intWrap(-1); return (py_retval); }#ifdef DEBUG_XPATH printf("libxml_registerXPathFunction(%p, %s, %s) called\n", ctx, name, ns_uri);#endif for (i = 0; i < libxml_xpathCallbacksNb; i++) { if ((ctx == (*libxml_xpathCallbacks)[i].ctx) && (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { Py_XINCREF(pyobj_f); Py_XDECREF((*libxml_xpathCallbacks)[i].function); (*libxml_xpathCallbacks)[i].function = pyobj_f; c_retval = 1; goto done; } } if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksAllocd) { libxml_xpathCallbacksAllocd+=10; libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlRealloc( libxml_xpathCallbacks, libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback)); } i = libxml_xpathCallbacksNb++; Py_XINCREF(pyobj_f); (*libxml_xpathCallbacks)[i].ctx = ctx; (*libxml_xpathCallbacks)[i].name = xmlStrdup(name); (*libxml_xpathCallbacks)[i].ns_uri = xmlStrdup(ns_uri); (*libxml_xpathCallbacks)[i].function = pyobj_f; c_retval = 1; done: py_retval = libxml_intWrap((int) c_retval); return (py_retval);}/************************************************************************ * * * Global properties access * * * ************************************************************************/static PyObject *libxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args){ PyObject *resultobj, *obj; xmlNodePtr cur; const xmlChar *res; if (!PyArg_ParseTuple(args, (char *) "O:name", &obj)) return NULL; cur = PyxmlNode_Get(obj);#ifdef DEBUG printf("libxml_name: cur = %p type %d\n", cur, cur->type);#endif switch (cur->type) { case XML_DOCUMENT_NODE:#ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE:#endif case XML_HTML_DOCUMENT_NODE:{ xmlDocPtr doc = (xmlDocPtr) cur; res = doc->URL; break; } case XML_ATTRIBUTE_NODE:{ xmlAttrPtr attr = (xmlAttrPtr) cur; res = attr->name; break; } case XML_NAMESPACE_DECL:{ xmlNsPtr ns = (xmlNsPtr) cur; res = ns->prefix; break; } default: res = cur->name; break; } resultobj = libxml_constxmlCharPtrWrap(res); return resultobj;}static PyObject *libxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args){ PyObject *resultobj, *obj; xmlNodePtr cur; xmlDocPtr res; if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj)) return NULL; cur = PyxmlNode_Get(obj);#ifdef DEBUG printf("libxml_doc: cur = %p\n", cur);#endif switch (cur->type) { case XML_DOCUMENT_NODE:#ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE:#endif case XML_HTML_DOCUMENT_NODE: res = NULL; break; case XML_ATTRIBUTE_NODE:{ xmlAttrPtr attr = (xmlAttrPtr) cur;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -