Hi

mmmh, forget about that... I used 2.6.2, will test on 2.5.10 later

chregu

On 2/22/04 6:55 PM, Sterling Hughes wrote:
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

-- christian stocker | Bitflux GmbH | schoeneggstrasse 5 | ch-8004 zurich phone +41 1 240 56 70 | mobile +41 76 561 88 60 | fax +41 1 240 56 71 http://www.bitflux.ch | [EMAIL PROTECTED] | gnupg-keyid 0x5CE1DECB

--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Reply via email to