[1/2] xmllite: Support standalone declaration
Nikolay Sivov
nsivov at codeweavers.com
Wed Nov 28 05:57:24 CST 2012
Support standalone declaration
-------------- next part --------------
>From 581c630524fa1afb7aa4454e5134488038f27f62 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed, 28 Nov 2012 07:59:57 -0500
Subject: [PATCH 1/7] Support standalone declaration
---
dlls/xmllite/reader.c | 64 +++++++++++++++++++++++++++++++++++++++----
dlls/xmllite/tests/reader.c | 3 +-
2 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 87d7936..ee6a4d7 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -510,7 +510,7 @@ static HRESULT reader_parse_versionnum(xmlreader *reader)
ptr++;
if (ptr2 == ptr) return WC_E_DIGIT;
- TRACE("version=%s", debugstr_wn(start, ptr-start));
+ TRACE("version=%s\n", debugstr_wn(start, ptr-start));
reader_skipn(reader, ptr-ptr2);
return S_OK;
}
@@ -592,7 +592,7 @@ static HRESULT reader_parse_encdecl(xmlreader *reader)
if (!reader_skipspaces(reader)) return WC_E_WHITESPACE;
- if (reader_cmp(reader, encodingW)) return S_OK;
+ if (reader_cmp(reader, encodingW)) return S_FALSE;
/* skip 'encoding' */
reader_skipn(reader, 8);
@@ -617,14 +617,55 @@ static HRESULT reader_parse_encdecl(xmlreader *reader)
return S_OK;
}
+/* [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) */
+static HRESULT reader_parse_sddecl(xmlreader *reader)
+{
+ static const WCHAR standaloneW[] = {'s','t','a','n','d','a','l','o','n','e',0};
+ static const WCHAR yesW[] = {'y','e','s',0};
+ static const WCHAR noW[] = {'n','o',0};
+ const WCHAR *start, *ptr;
+
+ if (!reader_skipspaces(reader)) return WC_E_WHITESPACE;
+
+ if (reader_cmp(reader, standaloneW)) return S_FALSE;
+ /* skip 'standalone' */
+ reader_skipn(reader, 10);
+
+ if (reader_cmp(reader, eqW)) return WC_E_EQUAL;
+ /* skip '=' */
+ reader_skipn(reader, 1);
+
+ if (reader_cmp(reader, quoteW) && reader_cmp(reader, dblquoteW))
+ return WC_E_QUOTE;
+ /* skip "'"|'"' */
+ reader_skipn(reader, 1);
+
+ if (reader_cmp(reader, yesW) && reader_cmp(reader, noW))
+ return WC_E_XMLDECL;
+
+ start = reader_get_cur(reader);
+ /* skip 'yes'|'no' */
+ reader_skipn(reader, reader_cmp(reader, yesW) ? 2 : 3);
+ ptr = reader_get_cur(reader);
+ TRACE("standalone=%s\n", debugstr_wn(start, ptr-start));
+
+ if (reader_cmp(reader, quoteW) && reader_cmp(reader, dblquoteW))
+ return WC_E_QUOTE;
+ /* skip "'"|'"' */
+ reader_skipn(reader, 1);
+
+ return S_OK;
+}
+
/* [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' */
static HRESULT reader_parse_xmldecl(xmlreader *reader)
{
static const WCHAR xmldeclW[] = {'<','?','x','m','l',0};
+ static const WCHAR declcloseW[] = {'?','>',0};
HRESULT hr;
/* check if we have "<?xml" */
- if (reader_cmp(reader, xmldeclW)) return S_OK;
+ if (reader_cmp(reader, xmldeclW)) return S_FALSE;
reader_skipn(reader, 5);
hr = reader_parse_versioninfo(reader);
@@ -635,7 +676,15 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader)
if (FAILED(hr))
return hr;
- return E_NOTIMPL;
+ hr = reader_parse_sddecl(reader);
+ if (FAILED(hr))
+ return hr;
+
+ reader_skipspaces(reader);
+ if (reader_cmp(reader, declcloseW)) return WC_E_XMLDECL;
+ reader_skipn(reader, 2);
+
+ return S_OK;
}
static HRESULT WINAPI xmlreader_QueryInterface(IXmlReader *iface, REFIID riid, void** ppvObject)
@@ -803,7 +852,12 @@ static HRESULT WINAPI xmlreader_Read(IXmlReader* iface, XmlNodeType *node_type)
hr = reader_parse_xmldecl(This);
if (FAILED(hr)) return hr;
- This->state = XmlReadState_Interactive;
+ if (hr == S_OK)
+ {
+ This->state = XmlReadState_Interactive;
+ This->nodetype = *node_type = XmlNodeType_XmlDeclaration;
+ return S_OK;
+ }
}
return E_NOTIMPL;
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 729d134..af0ea62 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -611,13 +611,12 @@ static void test_read_xmldeclaration(void)
type = -1;
hr = IXmlReader_Read(reader, &type);
-todo_wine {
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
ok(type == XmlNodeType_XmlDeclaration,
"Expected XmlNodeType_XmlDeclaration, got %s\n", type_to_str(type));
-}
/* new version 1.2.x and 1.3.x properly update position for <?xml ?> */
ok_pos(reader, 1, 3, -1, 55, TRUE);
+ test_read_state(reader, XmlReadState_Interactive, -1, 0);
/* check attributes */
hr = IXmlReader_MoveToNextAttribute(reader);
--
1.7.10.4
More information about the wine-patches
mailing list