Module: wine Branch: master Commit: 8b8fb88e4ba32e62d5f3c3ff62ae1c54d1e7484c URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b8fb88e4ba32e62d5f3c3ff62...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Nov 28 07:59:57 2012 -0500
xmllite: 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);