What version of libxml2 does this rely on? -Sterling
> chregu Sun Feb 22 12:51:02 2004 EDT > > Modified files: > /php-src/ext/xml compat.c expat_compat.h > Log: > Fix broken Namespace support, use libxml2 namespace methods instead of > homebrown solution: > - default namespaces are recognized > - different namespaces with same prefix in different nodes are treated correctly > - libxml2 parser warnings are not errors anymore > > > > http://cvs.php.net/diff.php/php-src/ext/xml/compat.c?r1=1.25&r2=1.26&ty=u > Index: php-src/ext/xml/compat.c > diff -u php-src/ext/xml/compat.c:1.25 php-src/ext/xml/compat.c:1.26 > --- php-src/ext/xml/compat.c:1.25 Thu Jan 8 03:17:45 2004 > +++ php-src/ext/xml/compat.c Sun Feb 22 12:51:01 2004 > @@ -33,119 +33,17 @@ > ((__ns) != NULL && strlen(__ns) == 5 && *(__ns) == 'x' && *((__ns)+1) == 'm' > && \ > *((__ns)+2) == 'l' && *((__ns)+3) == 'n' && *((__ns)+4) == 's') > > -static void > -_find_namespace_decl(XML_Parser parser, const xmlChar *tagname, const xmlChar > **attr) > -{ > - xmlChar **attr_p = (xmlChar **) attr; > - xmlChar *name; > - xmlChar *value; > - xmlChar *partial; > - xmlChar *namespace; > - php_xml_ns *cur_ns_scope = NULL; > - php_xml_ns *exist_ns_scope; > - xmlNsPtr nsptr, curnsptr; > - > - exist_ns_scope = xmlHashLookup(parser->_reverse_ns_map, tagname); > - > - if (exist_ns_scope) { > - while (exist_ns_scope->next != NULL) > - exist_ns_scope = exist_ns_scope->next; > - } > - > - while (attr_p && *attr_p) { > - name = attr_p[0]; > - value = xmlStrdup(attr_p[1]); > - > - partial = xmlSplitQName(parser->parser, name, &namespace); > - > - if (IS_NS_DECL(namespace)) { > - > - if (parser->h_start_ns) { > - parser->h_start_ns(parser->user, partial, (const > XML_Char *) value); > - } > - if (xmlHashLookup(parser->_ns_map, partial) == NULL) { > - xmlHashAddEntry(parser->_ns_map, partial, value); > - } else { > - xmlFree(value); > - } > - > - nsptr = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); > - > - if (nsptr) { > - memset(nsptr, 0, sizeof(xmlNs)); > - nsptr->type = XML_LOCAL_NAMESPACE; > - > - if (value != NULL) > - nsptr->href = xmlStrdup(value); > - if (partial != NULL) > - nsptr->prefix = xmlStrdup(partial); > - > - if (cur_ns_scope == NULL) { > - cur_ns_scope = emalloc(sizeof(php_xml_ns)); > - cur_ns_scope->next = NULL; > - cur_ns_scope->prev = NULL; > - cur_ns_scope->nsptr = nsptr; > - cur_ns_scope->ref_count = 0; > - > - if (exist_ns_scope) { > - exist_ns_scope->next = cur_ns_scope; > - cur_ns_scope->prev = exist_ns_scope; > - } else { > - > xmlHashAddEntry(parser->_reverse_ns_map, tagname, cur_ns_scope); > - } > - > - exist_ns_scope = cur_ns_scope; > - } else { > - curnsptr = cur_ns_scope->nsptr; > - while (curnsptr->next != NULL) { > - curnsptr = curnsptr->next; > - } > - curnsptr->next = nsptr; > - } > - } > - > - } else { > - xmlFree(value); > - } > - > - xmlFree(partial); > - if (namespace != NULL) { > - xmlFree(namespace); > - } > - > - attr_p += 2; > - } > - > - if (exist_ns_scope) { > - exist_ns_scope->ref_count++; > - } > -} > - > static void > -_qualify_namespace(XML_Parser parser, const xmlChar *name, xmlChar **qualified) > +_qualify_namespace(XML_Parser parser, const xmlChar *name, const xmlChar *URI, > xmlChar **qualified) > { > - xmlChar *partial; > - xmlChar *namespace; > - > - partial = xmlSplitQName(parser->parser, name, &namespace); > - if (namespace) { > - xmlChar *nsvalue; > - > - nsvalue = xmlHashLookup(parser->_ns_map, namespace); > - if (nsvalue) { > + if (URI) { > /* Use libxml functions otherwise its memory deallocation is > screwed up */ > - *qualified = xmlStrdup(nsvalue); > + *qualified = xmlStrdup(URI); > *qualified = xmlStrncat(*qualified, parser->_ns_seperator, 1); > - *qualified = xmlStrncat(*qualified, partial, strlen(partial)); > - } else { > - *qualified = xmlStrdup(name); > - } > - xmlFree(namespace); > + *qualified = xmlStrncat(*qualified, name, strlen(name)); > } else { > *qualified = xmlStrdup(name); > } > - > - xmlFree(partial); > } > > static void > @@ -157,14 +55,24 @@ > if (parser->h_start_element == NULL) { > return; > } > - > - if (parser->use_namespace) { > - _find_namespace_decl(parser, name, attributes); > - _qualify_namespace(parser, name, &qualified_name); > - } else { > - qualified_name = xmlStrdup(name); > - } > > + qualified_name = xmlStrdup(name); > + > + parser->h_start_element(parser->user, (const XML_Char *) qualified_name, > (const XML_Char **) attributes); > + > + xmlFree(qualified_name); > +} > + > +static void > +_start_element_handler_ns(void *user, const xmlChar *name, const xmlChar *prefix, > const xmlChar *URI, int nb_namespaces, const xmlChar ** namespaces, int > nb_attributes, int nb_defaulted, const xmlChar ** attributes) > +{ > + XML_Parser parser = (XML_Parser) user; > + xmlChar *qualified_name = NULL; > + > + if (parser->h_start_element == NULL) { > + return; > + } > + _qualify_namespace(parser, name, URI, &qualified_name); > parser->h_start_element(parser->user, (const XML_Char *) qualified_name, > (const XML_Char **) attributes); > > xmlFree(qualified_name); > @@ -189,41 +97,27 @@ > return; > } > > - if (parser->use_namespace) { > - _qualify_namespace(parser, name, &qualified_name); > - } else { > - qualified_name = xmlStrdup(name); > - } > + qualified_name = xmlStrdup(name); > > parser->h_end_element(parser->user, (const XML_Char *) qualified_name); > > - if (parser->use_namespace) { > - int tag_counter; > - php_xml_ns *cur_ns_scope, *prev_ns_scope; > - xmlNsPtr nsptr; > - > - cur_ns_scope = xmlHashLookup(parser->_reverse_ns_map, name); > - if (cur_ns_scope) { > - while (cur_ns_scope->next != NULL) { > - cur_ns_scope = cur_ns_scope->next; > - } > - tag_counter = --cur_ns_scope->ref_count; > - if (tag_counter == 0) { > - nsptr = cur_ns_scope->nsptr; > - if (nsptr && parser->h_end_ns) { > - _namespace_handler(parser, nsptr); > - } > - xmlFreeNsList(nsptr); > - cur_ns_scope->nsptr = NULL; > - prev_ns_scope = cur_ns_scope->prev; > - if (prev_ns_scope != NULL) { > - efree(cur_ns_scope); > - prev_ns_scope->next = NULL; > - } > - } > - } > + xmlFree(qualified_name); > +} > + > +static void > +_end_element_handler_ns(void *user, const xmlChar *name, const xmlChar * prefix, > const xmlChar *URI) > +{ > + xmlChar *qualified_name; > + XML_Parser parser = (XML_Parser) user; > + > + if (parser->h_end_element == NULL) { > + return; > } > > + _qualify_namespace(parser, name, URI, &qualified_name); > + > + parser->h_end_element(parser->user, (const XML_Char *) qualified_name); > + > xmlFree(qualified_name); > } > > @@ -347,7 +241,7 @@ > > static xmlSAXHandler > php_xml_compat_handlers = { > - NULL, /* internalSubset */ > + NULL, /* internalSubset */ > NULL, /* isStandalone */ > NULL, /* hasInternalSubset */ > NULL, /* hasExternalSubset */ > @@ -361,8 +255,8 @@ > NULL, /* setDocumentLocator */ > NULL, /* startDocument */ > NULL, /* endDocument */ > - _start_element_handler, > - _end_element_handler, > + _start_element_handler, /* startElement */ > + _end_element_handler, /* endElement */ > NULL, /* reference */ > _cdata_handler, > NULL, /* ignorableWhitespace */ > @@ -374,7 +268,12 @@ > NULL, /* getParameterEntity */ > _cdata_handler, /* cdataBlock */ > NULL, /* externalSubset */ > - 1 > + 1, > + NULL, > + _start_element_handler_ns, > + _end_element_handler_ns, > + NULL > + > }; > > PHPAPI XML_Parser > @@ -415,8 +314,7 @@ > parser->parser->replaceEntities = 1; > if (sep != NULL) { > parser->use_namespace = 1; > - parser->_ns_map = xmlHashCreate(10); > - parser->_reverse_ns_map = xmlHashCreate(10); > + parser->parser->sax2 = 1; > parser->_ns_seperator = xmlStrdup(sep); > } > return parser; > @@ -498,7 +396,15 @@ > PHPAPI int > XML_Parse(XML_Parser parser, const XML_Char *data, int data_len, int is_final) > { > - return !xmlParseChunk(parser->parser, data, data_len, is_final); > + int error; > + error = xmlParseChunk(parser->parser, data, data_len, is_final); > + if (!error) { > + return 1; > + } else if (parser->parser->lastError.level > XML_ERR_WARNING ){ > + return 0; > + } else { > + return 1; > + } > } > > PHPAPI int > @@ -603,7 +509,14 @@ > "Invalid URI", > "XML_ERR_URI_FRAGMENT", > "XML_WAR_CATALOG_PI", > - "XML_ERR_NO_DTD" > + "XML_ERR_NO_DTD", > + "XML_ERR_CONDSEC_INVALID_KEYWORD", /* 95 */ > + "XML_ERR_VERSION_MISSING", /* 96 */ > + "XML_WAR_UNKNOWN_VERSION", /* 97 */ > + "XML_WAR_LANG_VALUE", /* 98 */ > + "XML_WAR_NS_URI", /* 99 */ > + "XML_WAR_NS_URI_RELATIVE", /* 100 */ > + "XML_ERR_MISSING_ENCODING" /* 101 */ > }; > > PHPAPI const XML_Char * > @@ -648,35 +561,10 @@ > return "1.0"; > } > > -static void > -_free_ns_name(void *ptr, xmlChar *name) > -{ > - xmlFree(ptr); > -} > - > -static void > -_free_ns_pointer(void *ptr, xmlChar *name) > -{ > - php_xml_ns *cur_ns_scope; > - > - /* Child scopes should already be removed, but in the event > - of malformed xml, they may still be resident and need to be cleaned */ > - cur_ns_scope = ((php_xml_ns *) ptr)->next; > - if (cur_ns_scope != NULL) { > - _free_ns_pointer(cur_ns_scope, NULL); > - } > - > - xmlFreeNsList(((php_xml_ns *) ptr)->nsptr); > - > - efree(ptr); > -} > - > PHPAPI void > XML_ParserFree(XML_Parser parser) > { > if (parser->use_namespace) { > - xmlHashFree(parser->_ns_map, _free_ns_name); > - xmlHashFree(parser->_reverse_ns_map, _free_ns_pointer); > if (parser->_ns_seperator) { > xmlFree(parser->_ns_seperator); > } > http://cvs.php.net/diff.php/php-src/ext/xml/expat_compat.h?r1=1.15&r2=1.16&ty=u > Index: php-src/ext/xml/expat_compat.h > diff -u php-src/ext/xml/expat_compat.h:1.15 php-src/ext/xml/expat_compat.h:1.16 > --- php-src/ext/xml/expat_compat.h:1.15 Thu Jan 8 12:32:59 2004 > +++ php-src/ext/xml/expat_compat.h Sun Feb 22 12:51:01 2004 > @@ -16,7 +16,7 @@ > +----------------------------------------------------------------------+ > */ > > -/* $Id: expat_compat.h,v 1.15 2004/01/08 17:32:59 sniper Exp $ */ > +/* $Id: expat_compat.h,v 1.16 2004/02/22 17:51:01 chregu Exp $ */ > > #ifndef PHP_EXPAT_COMPAT_H > #define PHP_EXPAT_COMPAT_H > @@ -54,8 +54,6 @@ > typedef struct _XML_Parser { > int use_namespace; > > - xmlHashTablePtr _ns_map; > - xmlHashTablePtr _reverse_ns_map; > xmlChar *_ns_seperator; > > void *user; > > -- > PHP CVS Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
