📄 libxml.c
字号:
return (Py_None);}PyObject *libxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args){#ifdef LIBXML_HTML_ENABLED const char *URI; const char *encoding; PyObject *pyobj_SAX = NULL; xmlSAXHandlerPtr SAX = NULL; if (!PyArg_ParseTuple (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI, &encoding)) return (NULL);#ifdef DEBUG printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n", pyobj_SAX, URI, encoding);#endif if (pyobj_SAX == Py_None) { Py_INCREF(Py_None); return (Py_None); } SAX = &pythonSaxHandler; Py_INCREF(pyobj_SAX); /* The reference is released in pythonEndDocument() */ htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX); Py_INCREF(Py_None); return (Py_None);#else Py_INCREF(Py_None); return (Py_None);#endif /* LIBXML_HTML_ENABLED */}/************************************************************************ * * * Error message callback * * * ************************************************************************/static PyObject *libxml_xmlPythonErrorFuncHandler = NULL;static PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;/* helper to build a xmlMalloc'ed string from a format and va_list *//* * disabled the loop, the repeated call to vsnprintf without reset of ap * in case the initial buffer was too small segfaulted on x86_64 * we now directly vsnprintf on a large buffer. */static char *libxml_buildMessage(const char *msg, va_list ap){ int chars; char *str; str = (char *) xmlMalloc(1000); if (str == NULL) return NULL; chars = vsnprintf(str, 999, msg, ap); if (chars >= 998) str[999] = 0; return str;}static voidlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg, ...){ va_list ap; PyObject *list; PyObject *message; PyObject *result; char str[1000];#ifdef DEBUG_ERROR printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);#endif if (libxml_xmlPythonErrorFuncHandler == NULL) { va_start(ap, msg); vfprintf(stderr, msg, ap); va_end(ap); } else { va_start(ap, msg); if (vsnprintf(str, 999, msg, ap) >= 998) str[999] = 0; va_end(ap); list = PyTuple_New(2); PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); message = libxml_charPtrConstWrap(str); PyTuple_SetItem(list, 1, message); result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); Py_XDECREF(list); Py_XDECREF(result); }}static voidlibxml_xmlErrorInitialize(void){#ifdef DEBUG_ERROR printf("libxml_xmlErrorInitialize() called\n");#endif xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);}static PyObject *libxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self, PyObject * args){ PyObject *py_retval; PyObject *pyobj_f; PyObject *pyobj_ctx; if (!PyArg_ParseTuple (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f, &pyobj_ctx)) return (NULL);#ifdef DEBUG_ERROR printf("libxml_xmlRegisterErrorHandler(%p, %p) called\n", pyobj_ctx, pyobj_f);#endif if (libxml_xmlPythonErrorFuncHandler != NULL) { Py_XDECREF(libxml_xmlPythonErrorFuncHandler); } if (libxml_xmlPythonErrorFuncCtxt != NULL) { Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); } Py_XINCREF(pyobj_ctx); Py_XINCREF(pyobj_f); /* TODO: check f is a function ! */ libxml_xmlPythonErrorFuncHandler = pyobj_f; libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; py_retval = libxml_intWrap(1); return (py_retval);}/************************************************************************ * * * Per parserCtxt error handler * * * ************************************************************************/typedef struct { PyObject *f; PyObject *arg;} xmlParserCtxtPyCtxt;typedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr;static voidlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str) { PyObject *list; PyObject *result; xmlParserCtxtPtr ctxt; xmlParserCtxtPyCtxtPtr pyCtxt; #ifdef DEBUG_ERROR printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);#endif ctxt = (xmlParserCtxtPtr)ctx; pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; list = PyTuple_New(4); PyTuple_SetItem(list, 0, pyCtxt->arg); Py_XINCREF(pyCtxt->arg); PyTuple_SetItem(list, 1, libxml_charPtrWrap(str)); PyTuple_SetItem(list, 2, libxml_intWrap(severity)); PyTuple_SetItem(list, 3, Py_None); Py_INCREF(Py_None); 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 void libxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...) { va_list ap; va_start(ap, msg); libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap)); va_end(ap);}static void libxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...) { va_list ap; va_start(ap, msg); libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap)); va_end(ap);}static void libxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...) { va_list ap; va_start(ap, msg); libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap)); va_end(ap);}static void libxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...) { va_list ap; va_start(ap, msg); libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap)); va_end(ap);}static PyObject *libxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { PyObject *py_retval; xmlParserCtxtPtr ctxt; xmlParserCtxtPyCtxtPtr pyCtxt; PyObject *pyobj_ctxt; PyObject *pyobj_f; PyObject *pyobj_arg; if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler", &pyobj_ctxt, &pyobj_f, &pyobj_arg)) return(NULL); ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); if (ctxt->_private == NULL) { pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); if (pyCtxt == NULL) { py_retval = libxml_intWrap(-1); return(py_retval); } memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); ctxt->_private = pyCtxt; } else { pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; } /* TODO: check f is a function ! */ Py_XDECREF(pyCtxt->f); Py_XINCREF(pyobj_f); pyCtxt->f = pyobj_f; Py_XDECREF(pyCtxt->arg); Py_XINCREF(pyobj_arg); pyCtxt->arg = pyobj_arg; if (pyobj_f != Py_None) { ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler; ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler; ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler; ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler; } else { ctxt->sax->error = xmlParserError; ctxt->vctxt.error = xmlParserValidityError; ctxt->sax->warning = xmlParserWarning; ctxt->vctxt.warning = xmlParserValidityWarning; } py_retval = libxml_intWrap(1); return(py_retval);}static PyObject *libxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { PyObject *py_retval; xmlParserCtxtPtr ctxt; xmlParserCtxtPyCtxtPtr pyCtxt; PyObject *pyobj_ctxt; if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler", &pyobj_ctxt)) return(NULL); ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); py_retval = PyTuple_New(2); if (ctxt->_private != NULL) { pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; PyTuple_SetItem(py_retval, 0, pyCtxt->f); Py_XINCREF(pyCtxt->f); PyTuple_SetItem(py_retval, 1, pyCtxt->arg); Py_XINCREF(pyCtxt->arg); } else { /* no python error handler registered */ 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_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { xmlParserCtxtPtr ctxt; PyObject *pyobj_ctxt; xmlParserCtxtPyCtxtPtr pyCtxt; if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt)) return(NULL); ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); if (ctxt != NULL) { pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private; if (pyCtxt) { Py_XDECREF(pyCtxt->f); Py_XDECREF(pyCtxt->arg); xmlFree(pyCtxt); } xmlFreeParserCtxt(ctxt); } Py_INCREF(Py_None); return(Py_None);}/*** * xmlValidCtxt stuff */typedef struct { PyObject *warn; PyObject *error; PyObject *arg;} xmlValidCtxtPyCtxt;typedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr;static voidlibxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str) { PyObject *list; PyObject *result; xmlValidCtxtPyCtxtPtr pyCtxt; #ifdef DEBUG_ERROR printf("libxml_xmlValidCtxtGenericErrorFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);#endif pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx; list = PyTuple_New(2); PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); PyTuple_SetItem(list, 1, pyCtxt->arg); Py_XINCREF(pyCtxt->arg); result = PyEval_CallObject(pyCtxt->error, list); if (result == NULL) { /* TODO: manage for the exception to be propagated... */ PyErr_Print(); } Py_XDECREF(list); Py_XDECREF(result);}static voidlibxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, int severity, char *str) { PyObject *list; PyObject *result; xmlValidCtxtPyCtxtPtr pyCtxt; #ifdef DEBUG_ERROR printf("libxml_xmlValidCtxtGenericWarningFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);#endif pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx; list = PyTuple_New(2); PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); PyTuple_SetItem(list, 1, pyCtxt->arg); Py_XINCREF(pyCtxt->arg); result = PyEval_CallObject(pyCtxt->warn, list); if (result == NULL) { /* TODO: manage for the exception to be propagated... */ PyErr_Print(); } Py_XDECREF(list); Py_XDECREF(result);}static void libxml_xmlValidCtxtErrorFuncHandler(void *ctx, const char *msg, ...) { va_list ap; va_start(ap, msg); libxml_xmlValidCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap)); va_end(ap);}static void libxml_xmlValidCtxtWarningFuncHandler(void *ctx, const char *msg, ...) { va_list ap; va_start(ap, msg); libxml_xmlValidCtxtGenericWarningFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap)); va_end(ap);}static PyObject *libxml_xmlSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args){ PyObject *py_retval; PyObject *pyobj_error; PyObject *pyobj_warn; PyObject *pyobj_ctx; PyObject *pyobj_arg = Py_None; xmlValidCtxtPtr ctxt; xmlValidCtxtPyCtxtPtr pyCtxt; if (!PyArg_ParseTuple (args, (char *) "OOO|O:xmlSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg)) return (NULL);#ifdef DEBUG_ERROR printf("libxml_xmlSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);#endif ctxt = PyValidCtxt_Get(pyobj_ctx); pyCtxt = xmlMalloc(sizeof(xmlValidCtxtPyCtxt)); if (pyCtxt == NULL) { py_retval = libxml_intWrap(-1); return(py_retval); } memset(pyCtxt, 0, sizeof(xmlValidCtxtPyCtxt)); /* TODO: check warn and error is a function ! */ Py_XDECREF(pyCtxt->error); Py_XINCREF(pyobj_error); pyCtxt->error = pyobj_error; Py_XDECREF(pyCtxt->warn);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -