Nikolay Sivov : xmllite/reader: Return static empty string as xml declaration node value.

Alexandre Julliard julliard at winehq.org
Fri Mar 10 16:51:43 CST 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Mar 10 11:06:38 2017 +0300

xmllite/reader: Return static empty string as xml declaration node value.

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, 37 insertions(+), 30 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 28da5e1..1805758 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -1328,7 +1328,6 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader)
     reader->empty_element.position = position;
     reader_set_strvalue(reader, StringValue_LocalName, &strval_xml);
     reader_set_strvalue(reader, StringValue_QualifiedName, &strval_xml);
-    reader_set_strvalue(reader, StringValue_Value, &strval_empty);
 
     return S_OK;
 }
@@ -3171,26 +3170,17 @@ static HRESULT WINAPI xmlreader_GetPrefix(IXmlReader* iface, const WCHAR **ret,
     return S_OK;
 }
 
-static BOOL is_namespace_definition(xmlreader *reader)
-{
-    const strval *local = &reader->strvalues[StringValue_LocalName];
-    const strval *prefix = &reader->strvalues[StringValue_Prefix];
-
-    if (reader_get_nodetype(reader) != XmlNodeType_Attribute)
-        return FALSE;
-
-    return ((strval_eq(reader, prefix, &strval_empty) && strval_eq(reader, local, &strval_xmlns)) ||
-            strval_eq(reader, prefix, &strval_xmlns));
-}
-
 static HRESULT WINAPI xmlreader_GetValue(IXmlReader* iface, const WCHAR **value, UINT *len)
 {
     xmlreader *reader = impl_from_IXmlReader(iface);
     strval *val = &reader->strvalues[StringValue_Value];
+    UINT length;
 
     TRACE("(%p)->(%p %p)\n", reader, value, len);
 
     *value = NULL;
+    if (!len)
+        len = &length;
 
     if ((reader->nodetype == XmlNodeType_Comment && !val->str && !val->len) || is_reader_pending(reader))
     {
@@ -3204,29 +3194,46 @@ static HRESULT WINAPI xmlreader_GetValue(IXmlReader* iface, const WCHAR **value,
         if (is_reader_pending(reader)) return E_PENDING;
     }
 
-    if (!val->str)
+    switch (reader_get_nodetype(reader))
     {
-        WCHAR *ptr = reader_alloc(reader, (val->len+1)*sizeof(WCHAR));
-        if (!ptr) return E_OUTOFMEMORY;
-        memcpy(ptr, reader_get_strptr(reader, val), val->len*sizeof(WCHAR));
-        ptr[val->len] = 0;
-        val->str = ptr;
-    }
+    case XmlNodeType_XmlDeclaration:
+        *value = emptyW;
+        *len = 0;
+        break;
+    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 (is_namespace_definition(reader)) {
-        const strval *local = &reader->strvalues[StringValue_LocalName];
-        struct ns *ns;
+            /* 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)))
+            {
+                struct ns *ns;
 
-        ns = reader_lookup_ns(reader, local);
-        if (!ns)
-            ns = reader_lookup_nsdef(reader);
+                if (!(ns = reader_lookup_ns(reader, local)))
+                    ns = reader_lookup_nsdef(reader);
 
-        val = &ns->uri;
+                *value = ns->uri.str;
+                *len = ns->uri.len;
+                break;
+            }
+        }
+        /* fallthrough */
+    default:
+        if (!val->str)
+        {
+            WCHAR *ptr = reader_alloc(reader, (val->len+1)*sizeof(WCHAR));
+            if (!ptr) return E_OUTOFMEMORY;
+            memcpy(ptr, reader_get_strptr(reader, val), val->len*sizeof(WCHAR));
+            ptr[val->len] = 0;
+            val->str = ptr;
+        }
+        *value = val->str;
+        *len = val->len;
+        break;
     }
 
-    *value = val->str;
-    if (len) *len = val->len;
     return S_OK;
 }
 




More information about the wine-cvs mailing list