Module: wine Branch: master Commit: 619ceae967ed6520b6dea3edbb7f04c58d3545d0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=619ceae967ed6520b6dea3edbb...
Author: Nikolay Sivov nsivov@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++; }