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

📄 php_domxml.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
PHPAPI zval *php_domobject_new(xmlNodePtr obj, int *found, zval *wrapper_in  TSRMLS_DC){	zval *wrapper;	char *content;	int rsrc_type;		*found = 0;	if (!obj) {		if(!wrapper_in)		{			MAKE_STD_ZVAL(wrapper);		}		else			wrapper = wrapper_in;		ZVAL_NULL(wrapper);		return wrapper;	}	if ((wrapper = (zval *) dom_object_get_data((void *) obj))) {		zval_add_ref(&wrapper);		*found = 1;		return wrapper;	}	if(!wrapper_in)	{		MAKE_STD_ZVAL(wrapper);	}	else		wrapper = wrapper_in;	switch (Z_TYPE_P(obj)) {		case XML_ELEMENT_NODE:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlelement_class_entry);			rsrc_type = le_domxmlelementp;			add_property_long(wrapper, "type", Z_TYPE_P(nodep));			add_property_stringl(wrapper, "tagname", (char *) nodep->name, strlen(nodep->name), 1);			break;		}		case XML_TEXT_NODE:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmltext_class_entry);			rsrc_type = le_domxmltextp;			content = xmlNodeGetContent(nodep);			add_property_long(wrapper, "type", Z_TYPE_P(nodep));			add_property_stringl(wrapper, "name", "#text", 5, 1);			if (content)				add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1);			xmlFree(content);			break;		}		case XML_COMMENT_NODE:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlcomment_class_entry);			rsrc_type = le_domxmlcommentp;			content = xmlNodeGetContent(nodep);			if (content) {				add_property_long(wrapper, "type", Z_TYPE_P(nodep));				add_property_stringl(wrapper, "name", "#comment", 8, 1);				add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1);				xmlFree(content);			}			break;		}		case XML_PI_NODE:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlpi_class_entry);			rsrc_type = le_domxmlpip;			content = xmlNodeGetContent(nodep);			add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1);			if (content) {				add_property_stringl(wrapper, "value", (char *) content, strlen(content), 1);				xmlFree(content);			}			break;		}		case XML_ENTITY_REF_NODE:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlentityref_class_entry);			rsrc_type = le_domxmlentityrefp;			add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1);			break;		}		case XML_ENTITY_DECL:		case XML_ELEMENT_DECL:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlnode_class_entry);			rsrc_type = le_domxmlnodep;			add_property_long(wrapper, "type", Z_TYPE_P(nodep));			add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1);			if (Z_TYPE_P(obj) == XML_ENTITY_REF_NODE) {				content = xmlNodeGetContent(nodep);				if (content) {					add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1);					xmlFree(content);				}			}			break;		}		case XML_ATTRIBUTE_NODE:		{			xmlAttrPtr attrp = (xmlAttrPtr) obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlattr_class_entry);			rsrc_type = le_domxmlattrp;			add_property_long(wrapper, "type", Z_TYPE_P(attrp));			add_property_stringl(wrapper, "name", (char *) attrp->name, strlen(attrp->name), 1);			content = xmlNodeGetContent((xmlNodePtr) attrp);			if (content) {				add_property_stringl(wrapper, "value", (char *) content, strlen(content), 1);				xmlFree(content);			}			break;		}		case XML_DOCUMENT_NODE:		case XML_HTML_DOCUMENT_NODE:		{			xmlDocPtr docp = (xmlDocPtr) obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmldoc_class_entry);			rsrc_type = le_domxmldocp;			if (docp->name)				add_property_stringl(wrapper, "name", (char *) docp->name, strlen(docp->name), 1);			else				add_property_stringl(wrapper, "name", "#document", 9, 1);			if (docp->URL)				add_property_stringl(wrapper, "url", (char *) docp->URL, strlen(docp->URL), 1);			else				add_property_stringl(wrapper, "url", "", 0, 1);			if (docp->version)				add_property_stringl(wrapper, "version", (char *) docp->version, strlen(docp->version), 1);				else				add_property_stringl(wrapper, "version", "", 0, 1);			if (docp->encoding)				add_property_stringl(wrapper, "encoding", (char *) docp->encoding, strlen(docp->encoding), 1);			add_property_long(wrapper, "standalone", docp->standalone);			add_property_long(wrapper, "type", Z_TYPE_P(docp));			add_property_long(wrapper, "compression", docp->compression);			add_property_long(wrapper, "charset", docp->charset);			break;		}		/* FIXME: nodes of type XML_DTD_NODE used to be domxmldtd_class_entry.		 * but the DOM Standard doesn't have a DomDtd class. The DocumentType		 * class seems to be want we need and the libxml dtd functions are		 * very much like the methods of DocumentType. I wonder what exactly		 * is the difference between XML_DTD_NODE and XML_DOCUMENT_TYPE_NODE.		 * Something like		 * <!DOCTYPE chapter SYSTEM '/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd'		 * [ <!ENTITY sp \"spanish\">		 * ]>		 * is considered a DTD by libxml, but from the DOM perspective it		 * rather is a DocumentType		 */		case XML_DTD_NODE:		case XML_DOCUMENT_TYPE_NODE:		{			xmlDtdPtr dtd = (xmlDtdPtr) obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmldoctype_class_entry);/*			rsrc_type = le_domxmldtdp; */			rsrc_type = le_domxmldoctypep;/*			add_property_long(wrapper, "type", Z_TYPE_P(dtd)); */			add_property_long(wrapper, "type", XML_DOCUMENT_TYPE_NODE);			if (dtd->ExternalID)				add_property_string(wrapper, "publicId", (char *) dtd->ExternalID, 1);			else				add_property_string(wrapper, "publicId", "", 1);			if (dtd->SystemID)				add_property_string(wrapper, "systemId", (char *) dtd->SystemID, 1);			else				add_property_string(wrapper, "systemId", "", 1);			if (dtd->name)				add_property_string(wrapper, "name", (char *) dtd->name, 1);			break;		}		case XML_CDATA_SECTION_NODE:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlcdata_class_entry);			rsrc_type = le_domxmlcdatap;			content = xmlNodeGetContent(nodep);			add_property_long(wrapper, "type", Z_TYPE_P(nodep));			if (content) {				add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1);				xmlFree(content);			}			break;		}		case XML_NAMESPACE_DECL:		{			xmlNodePtr nodep = obj;			if(!wrapper_in)				object_init_ex(wrapper, domxmlns_class_entry);			rsrc_type = le_domxmlnamespacep;			add_property_long(wrapper, "type", Z_TYPE_P(nodep));			add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1);			content = xmlNodeGetContent(nodep->children);			if (content) {				add_property_stringl(wrapper, "value", (char *) content, strlen(content), 1);				xmlFree(content);			}			break;		}		default:			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported node type: %d\n", Z_TYPE_P(obj));			FREE_ZVAL(wrapper);			return NULL;	}	php_dom_set_object(wrapper, (void *) obj, rsrc_type TSRMLS_CC);	return (wrapper);}static void domxml_error(void *ctx, const char *msg, ...){	char buf[1024];	va_list ap;	TSRMLS_FETCH();	va_start(ap, msg);	vsnprintf(buf, 1024, msg, ap);	va_end(ap);	php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", buf);}static void domxml_error_ext(void *ctx, const char *msg, ...){	xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;	xmlParserInputPtr input = NULL;	char buf[1024];	va_list ap;	TSRMLS_FETCH();	va_start(ap, msg);	vsnprintf(buf, 1024, msg, ap);	va_end(ap);	if (ctxt != NULL && ctxt->_private != NULL) {		zval *errormessages;	   	MAKE_STD_ZVAL(errormessages);		if(array_init(errormessages) != SUCCESS) {			/* do error handling here */		} 		add_assoc_string(errormessages,"errormessage",buf,1);						input = ctxt->input;		if (ctxt->name) {			add_assoc_string(errormessages,"nodename",(char *) ctxt->name,1); 		}		if (input != NULL) {			add_assoc_long(errormessages,"line",input->line);			add_assoc_long(errormessages,"col",input->col);			if (input->filename != NULL) {				add_assoc_string(errormessages,"directory",(char *) input->directory,1);								add_assoc_string(errormessages,"file",(char *) input->filename,1);			}		}		add_next_index_zval(ctxt->_private,errormessages);	}   	php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", buf);	}static void domxml_error_validate(void *ctx, const char *msg, ...){	domxml_ErrorCtxt *ctxt ;	char buf[1024];	va_list ap;	TSRMLS_FETCH();	va_start(ap, msg);	vsnprintf(buf, 1024, msg, ap);	va_end(ap);	ctxt  = (domxml_ErrorCtxt*) ctx;   	if (ctxt != NULL && ctxt->errors != NULL) {		zval *errormessages;	   	MAKE_STD_ZVAL(errormessages);		if(array_init(errormessages) != SUCCESS) {			/* do error handling here */		} 		if (ctxt->parser != NULL) {			if (ctxt->parser->name) {				add_assoc_string(errormessages,"nodename",(char *)ctxt->parser->name,1); 			}			if (ctxt->parser->input != NULL) {			add_assoc_long(errormessages,"line",ctxt->parser->input->line);			add_assoc_long(errormessages,"col",ctxt->parser->input->col);				if (ctxt->parser->input->filename != NULL) {					add_assoc_string(errormessages,"directory",(char *) ctxt->parser->input->directory,1);									add_assoc_string(errormessages,"file",(char *) ctxt->parser->input->filename,1);				}			}		}				if (ctxt->valid->node != NULL)		{			/*php_error_docref(NULL TSRMLS_CC, E_WARNING,"nodename %s",(char *) ctxt->valid->name);			node = *ctxt->node;*/		}		add_assoc_string(errormessages,"errormessage",buf,1);			      		add_next_index_zval(ctxt->errors,errormessages);	}   	php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", buf);	}PHP_RINIT_FUNCTION(domxml){	xmlSetGenericErrorFunc(xmlGenericErrorContext, (xmlGenericErrorFunc)domxml_error);#if HAVE_DOMXSLT	xsltSetGenericErrorFunc(xsltGenericErrorContext, (xmlGenericErrorFunc)domxml_error);#endif	return SUCCESS;}PHP_RSHUTDOWN_FUNCTION(domxml){	xmlSetGenericErrorFunc(xmlGenericErrorContext, NULL);#if HAVE_DOMXSLT	xsltSetGenericErrorFunc(xsltGenericErrorContext, NULL);#endif	return SUCCESS;}PHP_MSHUTDOWN_FUNCTION(domxml){#if HAVE_DOMXSLT	xsltCleanupGlobals();#endif   	xmlCleanupParser();/*	If you want do find memleaks in this module, compile libxml2 with --with-mem-debug and	uncomment the following line, this will tell you the amount of not freed memory	and the total used memory into apaches error_log  *//*	xmlMemoryDump(); */	return SUCCESS;}PHP_MINIT_FUNCTION(domxml){	zend_class_entry ce;	le_domxmlnodep = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domnode", module_number);	le_domxmlcommentp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domcomment", module_number);	le_domxmltextp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domtext", module_number);	le_domxmlattrp = zend_register_list_destructors_ex(php_free_xml_attr, NULL, "domattribute", module_number);	le_domxmlelementp =	zend_register_list_destructors_ex(php_free_xml_node, NULL, "domelement", module_number);	le_domxmldtdp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domdtd", module_number);	le_domxmlcdatap = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domcdata", module_number);	le_domxmlentityrefp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domentityref", module_number);	le_domxmlpip = zend_register_list_destructors_ex(php_free_xml_node, NULL, "dompi", module_number);	le_domxmlparserp =	zend_register_list_destructors_ex(php_free_xml_parser, NULL, "domparser", module_number);	le_domxmldoctypep = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domdocumenttype", module_number);	le_domxmlnamespacep = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domnamespacenode", module_number);	le_domxmldocp = zend_register_list_destructors_ex(php_free_xml_doc, NULL, "domdocument", module_number);	/* Freeing the document contains freeing the complete tree.	   Therefore nodes, attributes etc. may not be freed seperately.	   Moved to end of list to support loading via dl()	*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -