Nikolay Sivov : xmllite/reader: Improve line number updating when switching to the next line.

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


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

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

xmllite/reader: Improve line number updating when switching to the next line.

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

---

 dlls/xmllite/reader.c       | 32 +++++++++++++++++---------------
 dlls/xmllite/tests/reader.c | 11 +++++++++--
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index c5aa99b..b223994 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -1050,16 +1050,29 @@ static int reader_cmp(xmlreader *reader, const WCHAR *str)
     return 0;
 }
 
+static void reader_update_position(xmlreader *reader, WCHAR ch)
+{
+    if (ch == '\r')
+        reader->position.line_position = 1;
+    else if (ch == '\n')
+    {
+        reader->position.line_number++;
+        reader->position.line_position = 1;
+    }
+    else
+        reader->position.line_position++;
+}
+
 /* moves cursor n WCHARs forward */
 static void reader_skipn(xmlreader *reader, int n)
 {
     encoded_buffer *buffer = &reader->input->buffer->utf16;
-    const WCHAR *ptr = reader_get_ptr(reader);
+    const WCHAR *ptr;
 
-    while (*ptr++ && n--)
+    while (*(ptr = reader_get_ptr(reader)) && n--)
     {
+        reader_update_position(reader, *ptr);
         buffer->cur++;
-        reader->position.line_position++;
     }
 }
 
@@ -1071,23 +1084,12 @@ static inline BOOL is_wchar_space(WCHAR ch)
 /* [3] S ::= (#x20 | #x9 | #xD | #xA)+ */
 static int reader_skipspaces(xmlreader *reader)
 {
-    encoded_buffer *buffer = &reader->input->buffer->utf16;
     const WCHAR *ptr = reader_get_ptr(reader);
     UINT start = reader_get_cur(reader);
 
     while (is_wchar_space(*ptr))
     {
-        if (*ptr == '\r')
-            reader->position.line_position = 0;
-        else if (*ptr == '\n')
-        {
-            reader->position.line_number++;
-            reader->position.line_position = 0;
-        }
-        else
-            reader->position.line_position++;
-
-        buffer->cur++;
+        reader_skipn(reader, 1);
         ptr = reader_get_ptr(reader);
     }
 
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index f7987c7..fdd2750 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1590,6 +1590,7 @@ static void test_read_pending(void)
     ok(hr == S_OK || broken(hr == E_PENDING), "got 0x%08x\n", hr);
     /* newer versions are happy when it's enough data to detect node type,
        older versions keep reading until it fails to read more */
+todo_wine
     ok(stream_readcall == 1 || broken(stream_readcall > 1), "got %d\n", stream_readcall);
     ok(type == XmlNodeType_Comment || broken(type == XmlNodeType_None), "got %d\n", type);
 
@@ -2474,7 +2475,7 @@ todo_wine {
 
 static void test_reader_position(void)
 {
-    static const char *xml = "<c:a xmlns:c=\"nsdef c\" b=\"attr b\"></c:a>";
+    static const char *xml = "<c:a xmlns:c=\"nsdef c\" b=\"attr b\">\n</c:a>";
     IXmlReader *reader;
     XmlNodeType type;
     IStream *stream;
@@ -2529,8 +2530,14 @@ static void test_reader_position(void)
 
     hr = IXmlReader_Read(reader, &type);
     ok(hr == S_OK, "got %08x\n", hr);
+    ok(type == XmlNodeType_Whitespace, "got type %d\n", type);
+todo_wine
+    TEST_READER_POSITION2(reader, 1, 35, 2, 6);
+
+    hr = IXmlReader_Read(reader, &type);
+    ok(hr == S_OK, "got %08x\n", hr);
     ok(type == XmlNodeType_EndElement, "got type %d\n", type);
-    TEST_READER_POSITION2(reader, 1, 37, ~0u, 40);
+    TEST_READER_POSITION2(reader, 2, 3, 2, 6);
 
     IXmlReader_SetInput(reader, NULL);
     TEST_READER_STATE2(reader, XmlReadState_Initial, XmlReadState_Closed);




More information about the wine-cvs mailing list