Nikolay Sivov : xmllite: Support resuming and value reporting for whitespace nodes in Misc.

Alexandre Julliard julliard at winehq.org
Mon Oct 14 12:39:28 CDT 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Oct 14 08:10:34 2013 +0400

xmllite: Support resuming and value reporting for whitespace nodes in Misc.

---

 dlls/xmllite/reader.c       |   50 ++++++++++++++++++++++++++++++-------------
 dlls/xmllite/tests/reader.c |    9 +++++++
 2 files changed, 44 insertions(+), 15 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index a216951..6d5c99b 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -68,7 +68,8 @@ typedef enum
     XmlReadResumeState_CDATA,
     XmlReadResumeState_Comment,
     XmlReadResumeState_STag,
-    XmlReadResumeState_CharData
+    XmlReadResumeState_CharData,
+    XmlReadResumeState_Whitespace
 } XmlReaderResumeState;
 
 /* saved pointer index to resume from particular input position */
@@ -962,11 +963,11 @@ static inline BOOL is_wchar_space(WCHAR ch)
 static int reader_skipspaces(xmlreader *reader)
 {
     encoded_buffer *buffer = &reader->input->buffer->utf16;
-    const WCHAR *ptr = reader_get_ptr(reader), *start = ptr;
+    const WCHAR *ptr = reader_get_ptr(reader);
+    UINT start = reader_get_cur(reader);
 
     while (is_wchar_space(*ptr))
     {
-        buffer->cur++;
         if (*ptr == '\r')
             reader->pos = 0;
         else if (*ptr == '\n')
@@ -976,10 +977,12 @@ static int reader_skipspaces(xmlreader *reader)
         }
         else
             reader->pos++;
-        ptr++;
+
+        buffer->cur++;
+        ptr = reader_get_ptr(reader);
     }
 
-    return ptr - start;
+    return reader_get_cur(reader) - start;
 }
 
 /* [26] VersionNum ::= '1.' [0-9]+ */
@@ -1488,19 +1491,34 @@ static HRESULT reader_parse_pi(xmlreader *reader)
 /* This one is used to parse significant whitespace nodes, like in Misc production */
 static HRESULT reader_parse_whitespace(xmlreader *reader)
 {
-    WCHAR *start, *ptr;
+    switch (reader->resumestate)
+    {
+    case XmlReadResumeState_Initial:
+        reader_shrink(reader);
+        reader->resumestate = XmlReadResumeState_Whitespace;
+        reader->resume[XmlReadResume_Body] = reader_get_cur(reader);
+        reader->nodetype = XmlNodeType_Whitespace;
+        reader_set_strvalue(reader, StringValue_LocalName, &strval_empty);
+        reader_set_strvalue(reader, StringValue_QualifiedName, &strval_empty);
+        reader_set_strvalue(reader, StringValue_Value, &strval_empty);
+    case XmlReadResumeState_Whitespace:
+    {
+        strval value;
+        UINT start;
 
-    reader_shrink(reader);
-    start = reader_get_ptr(reader);
+        reader_skipspaces(reader);
+        if (is_reader_pending(reader)) return S_OK;
 
-    reader_skipspaces(reader);
-    ptr = reader_get_ptr(reader);
-    TRACE("%s\n", debugstr_wn(start, ptr-start));
+        start = reader->resume[XmlReadResume_Body];
+        reader_init_strvalue(start, reader_get_cur(reader)-start, &value);
+        reader_set_strvalue(reader, StringValue_Value, &value);
+        TRACE("%s\n", debug_strval(reader, &value));
+        reader->resumestate = XmlReadResumeState_Initial;
+    }
+    default:
+        ;
+    }
 
-    reader->nodetype = XmlNodeType_Whitespace;
-    reader_set_strvalue(reader, StringValue_LocalName, &strval_empty);
-    reader_set_strvalue(reader, StringValue_QualifiedName, &strval_empty);
-    reader_set_strvalue(reader, StringValue_Value, &strval_empty);
     return S_OK;
 }
 
@@ -1522,6 +1540,8 @@ static HRESULT reader_parse_misc(xmlreader *reader)
             return reader_parse_pi(reader);
         case XmlReadResumeState_Comment:
             return reader_parse_comment(reader);
+        case XmlReadResumeState_Whitespace:
+            return reader_parse_whitespace(reader);
         default:
             ERR("unknown resume state %d\n", reader->resumestate);
         }
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 5c4f2a6..658bb10 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1000,6 +1000,15 @@ static void test_read_full(void)
         ok(test->types[i] != XmlNodeType_None, "%d: unexpected end of test data\n", i);
         if (test->types[i] == XmlNodeType_None) break;
         ok(type == test->types[i], "%d: got wrong type %d, expected %d\n", i, type, test->types[i]);
+        if (type == XmlNodeType_Whitespace)
+        {
+            const WCHAR *ptr;
+            UINT len = 0;
+
+            hr = IXmlReader_GetValue(reader, &ptr, &len);
+            ok(hr == S_OK, "%d: GetValue failed 0x%08x\n", i, hr);
+            ok(len > 0, "%d: wrong value length %d\n", i, len);
+        }
         hr = IXmlReader_Read(reader, &type);
         i++;
     }




More information about the wine-cvs mailing list