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