[7/9] webservices: Insert start/end element nodes at the same time in the reader.

Hans Leidekker hans at codeweavers.com
Mon Jul 4 04:35:43 CDT 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/reader.c | 81 ++++++++++++++++++++++++-----------------------
 1 file changed, 41 insertions(+), 40 deletions(-)

diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 8283e7a..ed59404 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -556,12 +556,7 @@ static void read_insert_bof( struct reader *reader, struct node *bof )
 static void read_insert_node( struct reader *reader, struct node *parent, struct node *node )
 {
     node->parent = parent;
-    if (node->parent == reader->root)
-    {
-        struct list *eof = list_tail( &reader->root->children );
-        list_add_before( eof, &node->entry );
-    }
-    else list_add_tail( &parent->children, &node->entry );
+    list_add_before( list_tail( &parent->children ), &node->entry );
     reader->current = reader->last = node;
 }
 
@@ -1227,13 +1222,8 @@ static inline BOOL is_valid_parent( const struct node *node )
 
 struct node *find_parent( struct node *node )
 {
-    if (node_type( node ) == WS_XML_NODE_TYPE_END_ELEMENT)
-    {
-        if (!node->parent || !is_valid_parent( node->parent->parent )) return NULL;
-        return node->parent->parent;
-    }
-    else if (is_valid_parent( node )) return node;
-    else if (is_valid_parent( node->parent )) return node->parent;
+    if (is_valid_parent( node )) return node;
+    if (is_valid_parent( node->parent )) return node->parent;
     return NULL;
 }
 
@@ -1261,15 +1251,15 @@ static HRESULT read_element( struct reader *reader )
 {
     unsigned int len = 0, ch, skip;
     const unsigned char *start;
-    struct node *node = NULL, *parent;
+    struct node *node = NULL, *endnode, *parent;
     WS_XML_ELEMENT_NODE *elem;
     WS_XML_ATTRIBUTE *attr = NULL;
     HRESULT hr = WS_E_INVALID_FORMAT;
 
     if (read_end_of_data( reader ))
     {
-        struct list *eof = list_tail( &reader->root->children );
-        reader->current = LIST_ENTRY( eof, struct node, entry );
+        reader->current = LIST_ENTRY( list_tail( &reader->root->children ), struct node, entry );
+        reader->last    = reader->current;
         reader->state   = READER_STATE_EOF;
         return S_OK;
     }
@@ -1296,6 +1286,10 @@ static HRESULT read_element( struct reader *reader )
 
     hr = E_OUTOFMEMORY;
     if (!(node = alloc_node( WS_XML_NODE_TYPE_ELEMENT ))) goto error;
+    if (!(endnode = alloc_node( WS_XML_NODE_TYPE_END_ELEMENT ))) goto error;
+    list_add_tail( &node->children, &endnode->entry );
+    endnode->parent = node;
+
     elem = (WS_XML_ELEMENT_NODE *)node;
     if ((hr = parse_name( start, len, &elem->prefix, &elem->localName )) != S_OK) goto error;
 
@@ -1319,7 +1313,7 @@ static HRESULT read_element( struct reader *reader )
     return S_OK;
 
 error:
-    free_node( node );
+    destroy_nodes( node );
     return hr;
 }
 
@@ -1368,15 +1362,13 @@ static HRESULT read_node( struct reader * );
 
 static HRESULT read_startelement( struct reader *reader )
 {
-    struct node *node;
-
     read_skip_whitespace( reader );
     if (!read_cmp( reader, "/>", 2 ))
     {
         read_skip( reader, 2 );
-        if (!(node = alloc_node( WS_XML_NODE_TYPE_END_ELEMENT ))) return E_OUTOFMEMORY;
-        read_insert_node( reader, reader->current, node );
-        reader->state = READER_STATE_ENDELEMENT;
+        reader->current = LIST_ENTRY( list_tail( &reader->current->children ), struct node, entry );
+        reader->last    = reader->current;
+        reader->state   = READER_STATE_ENDELEMENT;
         return S_OK;
     }
     else if (!read_cmp( reader, ">", 1 ))
@@ -1425,15 +1417,14 @@ static int cmp_name( const unsigned char *name1, ULONG len1, const unsigned char
     return 0;
 }
 
-static struct node *read_find_start_element( struct reader *reader, const WS_XML_STRING *prefix,
-                                             const WS_XML_STRING *localname )
+static struct node *read_find_startelement( struct reader *reader, const WS_XML_STRING *prefix,
+                                            const WS_XML_STRING *localname )
 {
     struct node *parent;
     const WS_XML_STRING *str;
 
     for (parent = reader->current; parent; parent = parent->parent)
     {
-        if (node_type( parent ) == WS_XML_NODE_TYPE_BOF) return NULL;
         if (node_type( parent ) == WS_XML_NODE_TYPE_ELEMENT)
         {
             str = parent->hdr.prefix;
@@ -1443,13 +1434,12 @@ static struct node *read_find_start_element( struct reader *reader, const WS_XML
             return parent;
        }
     }
-
     return NULL;
 }
 
 static HRESULT read_endelement( struct reader *reader )
 {
-    struct node *node, *parent;
+    struct node *parent;
     unsigned int len = 0, ch, skip;
     const unsigned char *start;
     WS_XML_STRING *prefix, *localname;
@@ -1459,8 +1449,8 @@ static HRESULT read_endelement( struct reader *reader )
 
     if (read_end_of_data( reader ))
     {
-        struct list *eof = list_tail( &reader->root->children );
-        reader->current = LIST_ENTRY( eof, struct node, entry );
+        reader->current = LIST_ENTRY( list_tail( &reader->root->children ), struct node, entry );
+        reader->last    = reader->current;
         reader->state   = READER_STATE_EOF;
         return S_OK;
     }
@@ -1483,14 +1473,14 @@ static HRESULT read_endelement( struct reader *reader )
     }
 
     if ((hr = parse_name( start, len, &prefix, &localname )) != S_OK) return hr;
-    parent = read_find_start_element( reader, prefix, localname );
+    parent = read_find_startelement( reader, prefix, localname );
     heap_free( prefix );
     heap_free( localname );
     if (!parent) return WS_E_INVALID_FORMAT;
 
-    if (!(node = alloc_node( WS_XML_NODE_TYPE_END_ELEMENT ))) return E_OUTOFMEMORY;
-    read_insert_node( reader, parent, node );
-    reader->state = READER_STATE_ENDELEMENT;
+    reader->current = LIST_ENTRY( list_tail( &parent->children ), struct node, entry );
+    reader->last    = reader->current;
+    reader->state   = READER_STATE_ENDELEMENT;
     return S_OK;
 }
 
@@ -1536,7 +1526,7 @@ static HRESULT read_comment( struct reader *reader )
 
 static HRESULT read_startcdata( struct reader *reader )
 {
-    struct node *node, *parent;
+    struct node *node, *endnode, *parent;
 
     if (read_cmp( reader, "<![CDATA[", 9 )) return WS_E_INVALID_FORMAT;
     read_skip( reader, 9 );
@@ -1544,6 +1534,14 @@ static HRESULT read_startcdata( struct reader *reader )
     if (!(parent = find_parent( reader->current ))) return WS_E_INVALID_FORMAT;
 
     if (!(node = alloc_node( WS_XML_NODE_TYPE_CDATA ))) return E_OUTOFMEMORY;
+    if (!(endnode = alloc_node( WS_XML_NODE_TYPE_END_CDATA )))
+    {
+        heap_free( node );
+        return E_OUTOFMEMORY;
+    }
+    list_add_tail( &node->children, &endnode->entry );
+    endnode->parent = node;
+
     read_insert_node( reader, parent, node );
     reader->state = READER_STATE_STARTCDATA;
     return S_OK;
@@ -1582,14 +1580,17 @@ static HRESULT read_cdata( struct reader *reader )
 
 static HRESULT read_endcdata( struct reader *reader )
 {
-    struct node *node;
+    struct node *parent;
 
     if (read_cmp( reader, "]]>", 3 )) return WS_E_INVALID_FORMAT;
     read_skip( reader, 3 );
 
-    if (!(node = alloc_node( WS_XML_NODE_TYPE_END_CDATA ))) return E_OUTOFMEMORY;
-    read_insert_node( reader, reader->current->parent, node );
-    reader->state = READER_STATE_ENDCDATA;
+    if (node_type( reader->current ) == WS_XML_NODE_TYPE_TEXT) parent = reader->current->parent;
+    else parent = reader->current;
+
+    reader->current = LIST_ENTRY( list_tail( &parent->children ), struct node, entry );
+    reader->last    = reader->current;
+    reader->state   = READER_STATE_ENDCDATA;
     return S_OK;
 }
 
@@ -1601,8 +1602,8 @@ static HRESULT read_node( struct reader *reader )
     {
         if (read_end_of_data( reader ))
         {
-            struct list *eof = list_tail( &reader->root->children );
-            reader->current = LIST_ENTRY( eof, struct node, entry );
+            reader->current = LIST_ENTRY( list_tail( &reader->root->children ), struct node, entry );
+            reader->last    = reader->current;
             reader->state   = READER_STATE_EOF;
             return S_OK;
         }
-- 
2.8.1




More information about the wine-patches mailing list