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