Nikolay Sivov : xmllite: Support whitespace nodes reporting.

Alexandre Julliard julliard at winehq.org
Mon Jan 14 15:55:50 CST 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Jan 13 22:36:30 2013 +0400

xmllite: Support whitespace nodes reporting.

---

 dlls/xmllite/reader.c       |   32 +++++++++++++++++++---
 dlls/xmllite/tests/reader.c |   61 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 4e99f1d..12b1d4a 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -517,14 +517,18 @@ static int readerinput_get_convlen(xmlreaderinput *readerinput)
     return len - (buffer->cur - buffer->data);
 }
 
-/* It's possbile that raw buffer has some leftovers from last conversion - some char
+/* It's possible that raw buffer has some leftovers from last conversion - some char
    sequence that doesn't represent a full code point. Length argument should be calculated with
-   readerinput_get_convlen(). */
+   readerinput_get_convlen(), if it's -1 it will be calculated here. */
 static void readerinput_shrinkraw(xmlreaderinput *readerinput, int len)
 {
     encoded_buffer *buffer = &readerinput->buffer->encoded;
+
+    if (len == -1)
+        len = readerinput_get_convlen(readerinput);
+
     memmove(buffer->data, buffer->cur + (buffer->written - len), len);
-    /* everything lower cur is lost too */
+    /* everything below cur is lost too */
     buffer->written -= len + (buffer->cur - buffer->data);
     /* after this point we don't need cur pointer really,
        it's used only to mark where actual data begins when first chunk is read */
@@ -1099,6 +1103,25 @@ static HRESULT reader_parse_pi(xmlreader *reader)
     return S_OK;
 }
 
+/* This one is used to parse significant whitespace nodes, like in Misc production */
+static HRESULT reader_parse_whitespace(xmlreader *reader)
+{
+    WCHAR *start, *ptr;
+
+    reader_shrink(reader);
+    start = reader_get_cur(reader);
+
+    reader_skipspaces(reader);
+    ptr = reader_get_cur(reader);
+    TRACE("%s\n", debugstr_wn(start, ptr-start));
+
+    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;
+}
+
 /* [27] Misc ::= Comment | PI | S */
 static HRESULT reader_parse_misc(xmlreader *reader)
 {
@@ -1111,7 +1134,7 @@ static HRESULT reader_parse_misc(xmlreader *reader)
         const WCHAR *cur = reader_get_cur(reader);
 
         if (is_wchar_space(*cur))
-            reader_skipspaces(reader);
+            hr = reader_parse_whitespace(reader);
         else if (!reader_cmp(reader, commentW))
             hr = reader_parse_comment(reader);
         else if (!reader_cmp(reader, piW))
@@ -1163,6 +1186,7 @@ static HRESULT reader_parse_nextnode(xmlreader *reader)
                 hr = reader_parse_xmldecl(reader);
                 if (FAILED(hr)) return hr;
 
+                readerinput_shrinkraw(reader->input, -1);
                 reader->instate = XmlReadInState_Misc_DTD;
                 if (hr == S_OK) return hr;
             }
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 140c99e..a8614a1 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -876,6 +876,66 @@ static void test_read_pi(void)
     IXmlReader_Release(reader);
 }
 
+struct nodes_test {
+    const char *xml;
+    XmlNodeType types[10];
+};
+
+static const char misc_test_xml[] =
+    "<!-- comment1 -->"
+    "<!-- comment2 -->"
+    "<?pi1 pi1body ?>"
+    "<!-- comment3 -->"
+    " \t \r \n"
+    "<!-- comment4 -->"
+;
+
+static struct nodes_test misc_test = {
+    misc_test_xml,
+    {
+        XmlNodeType_Comment,
+        XmlNodeType_Comment,
+        XmlNodeType_ProcessingInstruction,
+        XmlNodeType_Comment,
+        XmlNodeType_Whitespace,
+        XmlNodeType_Comment,
+        XmlNodeType_None
+    }
+};
+
+static void test_read_full(void)
+{
+    struct nodes_test *test = &misc_test;
+    IXmlReader *reader;
+    XmlNodeType type;
+    IStream *stream;
+    HRESULT hr;
+    int i;
+
+    hr = pCreateXmlReader(&IID_IXmlReader, (void**)&reader, NULL);
+    ok(hr == S_OK, "S_OK, got %08x\n", hr);
+
+    stream = create_stream_on_data(test->xml, strlen(test->xml)+1);
+    hr = IXmlReader_SetInput(reader, (IUnknown*)stream);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    i = 0;
+    type = XmlNodeType_None;
+    hr = IXmlReader_Read(reader, &type);
+    while (hr == S_OK)
+    {
+        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]);
+        hr = IXmlReader_Read(reader, &type);
+        i++;
+    }
+    ok(test->types[i] == XmlNodeType_None, "incomplete sequence\n");
+
+    IStream_Release(stream);
+    IXmlReader_Release(reader);
+}
+
 START_TEST(reader)
 {
     HRESULT r;
@@ -894,6 +954,7 @@ START_TEST(reader)
     test_reader_state();
     test_read_comment();
     test_read_pi();
+    test_read_full();
     test_read_xmldeclaration();
 
     CoUninitialize();




More information about the wine-cvs mailing list