⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libxml.c

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -