Nikolay Sivov : xmllite: Support standalone declaration.

Alexandre Julliard julliard at winehq.org
Wed Nov 28 14:14:05 CST 2012


Module: wine
Branch: master
Commit: 8b8fb88e4ba32e62d5f3c3ff62ae1c54d1e7484c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8b8fb88e4ba32e62d5f3c3ff62ae1c54d1e7484c

Author: Nikolay Sivov <nsivov at 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);




More information about the wine-cvs mailing list