Re: cvs: php-src /ext/xml compat.c expat_compat.h
| From: | Sterling Hughes | Date: | Sun, 22 Feb 2004 17:55:07 +0000 |
| Subject: | Re: cvs: php-src /ext/xml compat.c expat_compat.h | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-26315@lists.php.net to get a copy of this message | ||
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