Nikolay Sivov : xmllite/reader: Return same string for local and qualified names for attributes when appropriate.

Alexandre Julliard julliard at winehq.org
Fri Mar 17 15:19:47 CDT 2017


Module: wine
Branch: master
Commit: 253f233e52a94283cf884004d11dc8c39b1a8d6b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=253f233e52a94283cf884004d11dc8c39b1a8d6b

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Mar 17 16:46:13 2017 +0300

xmllite/reader: Return same string for local and qualified names for attributes when appropriate.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/xmllite/reader.c | 67 +++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 51 insertions(+), 16 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index ca8602c..b28a4b1 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -230,6 +230,12 @@ struct reader_position
     UINT line_position;
 };
 
+enum attribute_flags
+{
+    ATTRIBUTE_NS_DEFINITION = 0x1,
+    ATTRIBUTE_DEFAULT_NS_DEFINITION = 0x2,
+};
+
 struct attribute
 {
     struct list entry;
@@ -238,6 +244,7 @@ struct attribute
     strval qname;
     strval value;
     struct reader_position position;
+    unsigned int flags;
 };
 
 struct element
@@ -398,7 +405,7 @@ static void reader_clear_attrs(xmlreader *reader)
 /* attribute data holds pointers to buffer data, so buffer shrink is not possible
    while we are on a node with attributes */
 static HRESULT reader_add_attr(xmlreader *reader, strval *prefix, strval *localname, strval *qname,
-    strval *value, const struct reader_position *position)
+    strval *value, const struct reader_position *position, unsigned int flags)
 {
     struct attribute *attr;
 
@@ -413,6 +420,7 @@ static HRESULT reader_add_attr(xmlreader *reader, strval *prefix, strval *localn
     attr->qname = qname ? *qname : *localname;
     attr->value = *value;
     attr->position = *position;
+    attr->flags = flags;
     list_add_tail(&reader->attrs, &attr->entry);
     reader->attr_count++;
 
@@ -1179,7 +1187,7 @@ static HRESULT reader_parse_versioninfo(xmlreader *reader)
     /* skip "'"|'"' */
     reader_skipn(reader, 1);
 
-    return reader_add_attr(reader, NULL, &name, NULL, &val, &position);
+    return reader_add_attr(reader, NULL, &name, NULL, &val, &position, 0);
 }
 
 /* ([A-Za-z0-9._] | '-') */
@@ -1257,7 +1265,7 @@ static HRESULT reader_parse_encdecl(xmlreader *reader)
     /* skip "'"|'"' */
     reader_skipn(reader, 1);
 
-    return reader_add_attr(reader, NULL, &name, NULL, &val, &position);
+    return reader_add_attr(reader, NULL, &name, NULL, &val, &position, 0);
 }
 
 /* [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) */
@@ -1301,7 +1309,7 @@ static HRESULT reader_parse_sddecl(xmlreader *reader)
     /* skip "'"|'"' */
     reader_skipn(reader, 1);
 
-    return reader_add_attr(reader, NULL, &name, NULL, &val, &position);
+    return reader_add_attr(reader, NULL, &name, NULL, &val, &position, 0);
 }
 
 /* [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' */
@@ -1774,7 +1782,7 @@ static HRESULT reader_parse_externalid(xmlreader *reader)
         if (FAILED(hr)) return hr;
 
         reader_init_cstrvalue(publicW, strlenW(publicW), &name);
-        hr = reader_add_attr(reader, NULL, &name, NULL, &pub, &position);
+        hr = reader_add_attr(reader, NULL, &name, NULL, &pub, &position, 0);
         if (FAILED(hr)) return hr;
 
         cnt = reader_skipspaces(reader);
@@ -1785,7 +1793,7 @@ static HRESULT reader_parse_externalid(xmlreader *reader)
         if (FAILED(hr)) return S_OK;
 
         reader_init_cstrvalue(systemW, strlenW(systemW), &name);
-        hr = reader_add_attr(reader, NULL, &name, NULL, &sys, &position);
+        hr = reader_add_attr(reader, NULL, &name, NULL, &sys, &position, 0);
         if (FAILED(hr)) return hr;
 
         return S_OK;
@@ -1799,7 +1807,7 @@ static HRESULT reader_parse_externalid(xmlreader *reader)
         if (FAILED(hr)) return hr;
 
         reader_init_cstrvalue(systemW, strlenW(systemW), &name);
-        return reader_add_attr(reader, NULL, &name, NULL, &sys, &position);
+        return reader_add_attr(reader, NULL, &name, NULL, &sys, &position, 0);
     }
 
     return S_FALSE;
@@ -2179,17 +2187,17 @@ static HRESULT reader_parse_attribute(xmlreader *reader)
 {
     struct reader_position position = reader->position;
     strval prefix, local, qname, value;
-    BOOL ns = FALSE, nsdef = FALSE;
+    enum attribute_flags flags = 0;
     HRESULT hr;
 
     hr = reader_parse_qname(reader, &prefix, &local, &qname);
     if (FAILED(hr)) return hr;
 
     if (strval_eq(reader, &prefix, &strval_xmlns))
-        ns = TRUE;
+        flags |= ATTRIBUTE_NS_DEFINITION;
 
     if (strval_eq(reader, &qname, &strval_xmlns))
-        ns = nsdef = TRUE;
+        flags |= ATTRIBUTE_DEFAULT_NS_DEFINITION;
 
     hr = reader_parse_eq(reader);
     if (FAILED(hr)) return hr;
@@ -2197,11 +2205,11 @@ static HRESULT reader_parse_attribute(xmlreader *reader)
     hr = reader_parse_attvalue(reader, &value);
     if (FAILED(hr)) return hr;
 
-    if (ns)
-        reader_push_ns(reader, nsdef ? &strval_xmlns : &local, &value, nsdef);
+    if (flags & (ATTRIBUTE_NS_DEFINITION | ATTRIBUTE_DEFAULT_NS_DEFINITION))
+        reader_push_ns(reader, &local, &value, !!(flags & ATTRIBUTE_DEFAULT_NS_DEFINITION));
 
     TRACE("%s=%s\n", debug_strval(reader, &local), debug_strval(reader, &value));
-    return reader_add_attr(reader, &prefix, &local, &qname, &value, &position);
+    return reader_add_attr(reader, &prefix, &local, &qname, &value, &position, flags);
 }
 
 /* [12 NS] STag ::= '<' QName (S Attribute)* S? '>'
@@ -2982,6 +2990,7 @@ static HRESULT WINAPI xmlreader_MoveToElement(IXmlReader* iface)
 static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *name, UINT *len)
 {
     xmlreader *This = impl_from_IXmlReader(iface);
+    struct attribute *attribute = This->attr;
     struct element *element;
     UINT length;
 
@@ -3013,6 +3022,22 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
             *len = element->localname.len;
         }
         break;
+    case XmlNodeType_Attribute:
+        if (attribute->flags & ATTRIBUTE_DEFAULT_NS_DEFINITION)
+        {
+            *name = xmlnsW;
+            *len = 5;
+        } else if (attribute->prefix.len)
+        {
+            *name = This->strvalues[StringValue_QualifiedName].str;
+            *len = This->strvalues[StringValue_QualifiedName].len;
+        }
+        else
+        {
+            *name = This->strvalues[StringValue_LocalName].str;
+            *len = This->strvalues[StringValue_LocalName].len;
+        }
+        break;
     default:
         *name = This->strvalues[StringValue_QualifiedName].str;
         *len = This->strvalues[StringValue_QualifiedName].len;
@@ -3156,6 +3181,18 @@ static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, U
         *name = element->localname.str;
         *len = element->localname.len;
         break;
+    case XmlNodeType_Attribute:
+        if (This->attr->flags & ATTRIBUTE_DEFAULT_NS_DEFINITION)
+        {
+            *name = xmlnsW;
+            *len = 5;
+        }
+        else
+        {
+            *name = This->strvalues[StringValue_LocalName].str;
+            *len = This->strvalues[StringValue_LocalName].len;
+        }
+        break;
     default:
         *name = This->strvalues[StringValue_LocalName].str;
         *len = This->strvalues[StringValue_LocalName].len;
@@ -3246,11 +3283,9 @@ static HRESULT WINAPI xmlreader_GetValue(IXmlReader* iface, const WCHAR **value,
     case XmlNodeType_Attribute:
         {
             const strval *local = &reader->strvalues[StringValue_LocalName];
-            const strval *prefix = &reader->strvalues[StringValue_Prefix];
 
             /* For namespace definition attributes return values from namespace list */
-            if (((strval_eq(reader, prefix, &strval_empty) && strval_eq(reader, local, &strval_xmlns)) ||
-                    strval_eq(reader, prefix, &strval_xmlns)))
+            if (reader->attr->flags & (ATTRIBUTE_NS_DEFINITION | ATTRIBUTE_DEFAULT_NS_DEFINITION))
             {
                 struct ns *ns;
 




More information about the wine-cvs mailing list