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

📄 libxml.c

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