[PATCH 5/5] xmllite/reader: Fix reader position returned for xml declaration node

Nikolay Sivov nsivov at codeweavers.com
Wed Mar 8 22:14:10 CST 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/xmllite/reader.c       | 23 +++++++++++++++++++----
 dlls/xmllite/tests/reader.c |  3 +--
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 07330f5aec..28da5e1f60 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -281,7 +281,8 @@ typedef struct
     UINT depth;
     UINT max_depth;
     BOOL is_empty_element;
-    struct element empty_element;
+    struct element empty_element; /* used for empty elements without end tag <a />,
+                                     and to keep <?xml reader position */
     UINT resume[XmlReadResume_Last]; /* offsets used to resume reader */
 } xmlreader;
 
@@ -1294,12 +1295,16 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader)
 {
     static const WCHAR xmldeclW[] = {'<','?','x','m','l',' ',0};
     static const WCHAR declcloseW[] = {'?','>',0};
+    struct reader_position position;
     HRESULT hr;
 
     /* check if we have "<?xml " */
-    if (reader_cmp(reader, xmldeclW)) return S_FALSE;
+    if (reader_cmp(reader, xmldeclW))
+        return S_FALSE;
 
-    reader_skipn(reader, 5);
+    reader_skipn(reader, 2);
+    position = reader->position;
+    reader_skipn(reader, 3);
     hr = reader_parse_versioninfo(reader);
     if (FAILED(hr))
         return hr;
@@ -1313,10 +1318,14 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader)
         return hr;
 
     reader_skipspaces(reader);
-    if (reader_cmp(reader, declcloseW)) return WC_E_XMLDECL;
+    if (reader_cmp(reader, declcloseW))
+        return WC_E_XMLDECL;
+
+    /* skip '?>' */
     reader_skipn(reader, 2);
 
     reader->nodetype = XmlNodeType_XmlDeclaration;
+    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);
@@ -3291,6 +3300,9 @@ static HRESULT WINAPI xmlreader_GetLineNumber(IXmlReader* iface, UINT *line_numb
     case XmlNodeType_Attribute:
         *line_number = This->attr->position.line_number;
         break;
+    case XmlNodeType_XmlDeclaration:
+        *line_number = This->empty_element.position.line_number;
+        break;
     default:
         *line_number = This->position.line_number;
         break;
@@ -3323,6 +3335,9 @@ static HRESULT WINAPI xmlreader_GetLinePosition(IXmlReader* iface, UINT *line_po
     case XmlNodeType_Attribute:
         *line_position = This->attr->position.line_position;
         break;
+    case XmlNodeType_XmlDeclaration:
+        *line_position = This->empty_element.position.line_position;
+        break;
     default:
         *line_position = This->position.line_position;
         break;
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index d09316aaaf..208e4be977 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -760,7 +760,6 @@ static void test_read_xmldeclaration(void)
     ok(type == XmlNodeType_XmlDeclaration,
                      "Expected XmlNodeType_XmlDeclaration, got %s\n", type_to_str(type));
     /* new version 1.2.x and 1.3.x properly update position for <?xml ?> */
-todo_wine
     TEST_READER_POSITION2(reader, 1, 3, ~0u, 55);
 
     TEST_DEPTH(reader, 0);
@@ -829,6 +828,7 @@ todo_wine
 
     hr = IXmlReader_MoveToElement(reader);
     ok(hr == S_OK, "got %08x\n", hr);
+    TEST_READER_POSITION2(reader, 1, 3, ~0u, 55);
 
     type = XmlNodeType_None;
     hr = IXmlReader_GetNodeType(reader, &type);
@@ -855,7 +855,6 @@ todo_wine {
     hr = IXmlReader_Read(reader, &type);
     ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
     ok(type == XmlNodeType_XmlDeclaration, "expected XmlDeclaration, got %s\n", type_to_str(type));
-todo_wine
     TEST_READER_POSITION2(reader, 1, 3, ~0u, 21);
     TEST_READER_STATE(reader, XmlReadState_Interactive);
 
-- 
2.11.0




More information about the wine-patches mailing list