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

Reply via email to