Nikolay Sivov : xmllite: Support standalone declaration.
Module: wine Branch: master Commit: 8b8fb88e4ba32e62d5f3c3ff62ae1c54d1e7484c URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b8fb88e4ba32e62d5f3c3ff62... Author: Nikolay Sivov <nsivov(a)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);
participants (1)
-
Alexandre Julliard