[PATCH] xmllite: Handle char references within text nodes
Nikolay Sivov
nsivov at codeweavers.com
Sun Feb 5 16:19:30 CST 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/xmllite/reader.c | 16 +++++++++-------
dlls/xmllite/tests/reader.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 1e3c7aa47f..9bb0d56d34 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -2382,6 +2382,8 @@ static HRESULT reader_parse_chardata(xmlreader *reader)
while (*ptr)
{
+ static const WCHAR ampW[] = {'&',0};
+
/* CDATA closing sequence ']]>' is not allowed */
if (ptr[0] == ']' && ptr[1] == ']' && ptr[2] == '>')
return WC_E_CDSECTEND;
@@ -2398,11 +2400,15 @@ static HRESULT reader_parse_chardata(xmlreader *reader)
return S_OK;
}
- reader_skipn(reader, 1);
-
/* this covers a case when text has leading whitespace chars */
if (!is_wchar_space(*ptr)) reader->nodetype = XmlNodeType_Text;
- ptr++;
+
+ if (!reader_cmp(reader, ampW))
+ reader_parse_reference(reader);
+ else
+ reader_skipn(reader, 1);
+
+ ptr = reader_get_ptr(reader);
}
return S_OK;
@@ -2413,7 +2419,6 @@ static HRESULT reader_parse_content(xmlreader *reader)
{
static const WCHAR cdstartW[] = {'<','!','[','C','D','A','T','A','[',0};
static const WCHAR etagW[] = {'<','/',0};
- static const WCHAR ampW[] = {'&',0};
if (reader->resumestate != XmlReadResumeState_Initial)
{
@@ -2448,9 +2453,6 @@ static HRESULT reader_parse_content(xmlreader *reader)
if (!reader_cmp(reader, cdstartW))
return reader_parse_cdata(reader);
- if (!reader_cmp(reader, ampW))
- return reader_parse_reference(reader);
-
if (!reader_cmp(reader, ltW))
return reader_parse_element(reader);
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index dc586e8ada..f7f738e682 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -2049,6 +2049,43 @@ static void test_namespaceuri(void)
IXmlReader_Release(reader);
}
+static void test_read_charref(void)
+{
+ static const char testA[] = "<a b=\"c\">dză</a>";
+ static const WCHAR chardataW[] = {0x01f3,0x0103,0};
+ const WCHAR *value;
+ IXmlReader *reader;
+ XmlNodeType type;
+ IStream *stream;
+ HRESULT hr;
+
+ hr = CreateXmlReader(&IID_IXmlReader, (void **)&reader, NULL);
+ ok(hr == S_OK, "S_OK, got %08x\n", hr);
+
+ stream = create_stream_on_data(testA, sizeof(testA));
+ hr = IXmlReader_SetInput(reader, (IUnknown *)stream);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = IXmlReader_Read(reader, &type);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(type == XmlNodeType_Element, "Unexpected node type %d\n", type);
+
+ hr = IXmlReader_Read(reader, &type);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(type == XmlNodeType_Text, "Unexpected node type %d\n", type);
+
+ hr = IXmlReader_GetValue(reader, &value, NULL);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(!lstrcmpW(value, chardataW), "Text value : %s\n", wine_dbgstr_w(value));
+
+ hr = IXmlReader_Read(reader, &type);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(type == XmlNodeType_EndElement, "Unexpected node type %d\n", type);
+
+ IXmlReader_Release(reader);
+ IStream_Release(stream);
+}
+
START_TEST(reader)
{
test_reader_create();
@@ -2070,4 +2107,5 @@ START_TEST(reader)
test_reader_properties();
test_prefix();
test_namespaceuri();
+ test_read_charref();
}
--
2.11.0
More information about the wine-patches
mailing list