[PATCH 3/6] webservices: Return HRESULT from read_cmp.
Hans Leidekker
hans at codeweavers.com
Tue Nov 27 07:13:08 CST 2018
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/webservices/reader.c | 87 +++++++++++++++++++++++++----------------------
1 file changed, 46 insertions(+), 41 deletions(-)
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 8cf3f24d29..b573153c97 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -1050,37 +1050,39 @@ static inline void read_skip_whitespace( struct reader *reader )
reader->read_pos++;
}
-static inline int read_cmp( struct reader *reader, const char *str, int len )
+static inline HRESULT read_cmp( struct reader *reader, const char *str, int len )
{
const unsigned char *ptr = read_current_ptr( reader );
if (len < 0) len = strlen( str );
- if (reader->read_pos + len > reader->read_size) return -1;
+ if (reader->read_pos + len > reader->read_size) return WS_E_INVALID_FORMAT;
while (len--)
{
- if (*str != *ptr) return *ptr - *str;
+ if (*str != *ptr) return WS_E_INVALID_FORMAT;
str++; ptr++;
}
- return 0;
+ return S_OK;
}
static HRESULT read_xmldecl( struct reader *reader )
{
+ HRESULT hr;
+
if (!reader->read_size) return WS_E_INVALID_FORMAT;
- if (read_cmp( reader, "<", 1 ) || read_cmp( reader, "<?", 2 ))
+ if (read_cmp( reader, "<", 1 ) != S_OK || read_cmp( reader, "<?", 2 ) != S_OK)
{
reader->state = READER_STATE_BOF;
return S_OK;
}
- if (read_cmp( reader, "<?xml ", 6 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "<?xml ", 6 )) != S_OK) return hr;
read_skip( reader, 6 );
/* FIXME: parse attributes */
while (reader->read_pos < reader->read_size && reader->read_bufptr[reader->read_pos] != '?')
reader->read_pos++;
- if (read_cmp( reader, "?>", 2 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "?>", 2 )) != S_OK) return hr;
read_skip( reader, 2 );
reader->state = READER_STATE_BOF;
@@ -1295,17 +1297,17 @@ static HRESULT decode_text( const unsigned char *str, ULONG len, unsigned char *
static HRESULT read_attribute_value_text( struct reader *reader, WS_XML_ATTRIBUTE *attr )
{
- WS_XML_UTF8_TEXT *utf8 = NULL;
+ WS_XML_UTF8_TEXT *utf8;
unsigned int len, ch, skip, quote;
const unsigned char *start;
- HRESULT hr = E_OUTOFMEMORY;
+ HRESULT hr;
read_skip_whitespace( reader );
- if (read_cmp( reader, "=", 1 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "=", 1 )) != S_OK) return hr;
read_skip( reader, 1 );
read_skip_whitespace( reader );
- if (read_cmp( reader, "\"", 1 ) && read_cmp( reader, "'", 1 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "\"", 1 )) != S_OK && (hr = read_cmp( reader, "'", 1 )) != S_OK) return hr;
quote = read_utf8_char( reader, &skip );
read_skip( reader, 1 );
@@ -1322,27 +1324,23 @@ static HRESULT read_attribute_value_text( struct reader *reader, WS_XML_ATTRIBUT
if (attr->isXmlNs)
{
- if (!(attr->ns = alloc_xml_string( start, len ))) goto error;
- if ((hr = bind_prefix( reader, attr->prefix, attr->ns )) != S_OK) goto error;
- if (!(utf8 = alloc_utf8_text( NULL, 0 )))
- {
- hr = E_OUTOFMEMORY;
- goto error;
- }
+ if (!(attr->ns = alloc_xml_string( start, len ))) return E_OUTOFMEMORY;
+ if ((hr = bind_prefix( reader, attr->prefix, attr->ns )) != S_OK) return hr;
+ if (!(utf8 = alloc_utf8_text( NULL, 0 ))) return E_OUTOFMEMORY;
}
else
{
- if (!(utf8 = alloc_utf8_text( NULL, len ))) goto error;
- if ((hr = decode_text( start, len, utf8->value.bytes, &utf8->value.length )) != S_OK) goto error;
+ if (!(utf8 = alloc_utf8_text( NULL, len ))) return E_OUTOFMEMORY;
+ if ((hr = decode_text( start, len, utf8->value.bytes, &utf8->value.length )) != S_OK)
+ {
+ heap_free( utf8 );
+ return hr;
+ }
}
attr->value = &utf8->text;
attr->singleQuote = (quote == '\'');
return S_OK;
-
-error:
- heap_free( utf8 );
- return hr;
}
static inline BOOL is_text_type( unsigned char type )
@@ -1924,7 +1922,7 @@ static HRESULT read_attributes_text( struct reader *reader, WS_XML_ELEMENT_NODE
for (;;)
{
read_skip_whitespace( reader );
- if (!read_cmp( reader, ">", 1 ) || !read_cmp( reader, "/>", 2 )) break;
+ if (read_cmp( reader, ">", 1 ) == S_OK || read_cmp( reader, "/>", 2 ) == S_OK) break;
if ((hr = read_attribute_text( reader, &attr )) != S_OK) return hr;
if ((hr = append_attribute( elem, attr )) != S_OK)
{
@@ -1942,7 +1940,7 @@ static HRESULT read_element_text( struct reader *reader )
const unsigned char *start;
struct node *node = NULL, *parent;
WS_XML_ELEMENT_NODE *elem;
- HRESULT hr = WS_E_INVALID_FORMAT;
+ HRESULT hr;
if (read_end_of_data( reader ))
{
@@ -1952,7 +1950,7 @@ static HRESULT read_element_text( struct reader *reader )
return S_OK;
}
- if (read_cmp( reader, "<", 1 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "<", 1 )) != S_OK) return hr;
read_skip( reader, 1 );
if (!read_isnamechar( read_utf8_char( reader, &skip )))
{
@@ -1963,6 +1961,7 @@ static HRESULT read_element_text( struct reader *reader )
if (!(elem = alloc_element_pair())) return E_OUTOFMEMORY;
node = (struct node *)elem;
+ hr = WS_E_INVALID_FORMAT;
start = read_current_ptr( reader );
for (;;)
{
@@ -2609,7 +2608,7 @@ static HRESULT read_node_text( struct reader * );
static HRESULT read_startelement_text( struct reader *reader )
{
read_skip_whitespace( reader );
- if (!read_cmp( reader, "/>", 2 ))
+ if (read_cmp( reader, "/>", 2 ) == S_OK)
{
read_skip( reader, 2 );
reader->current = LIST_ENTRY( list_tail( &reader->current->children ), struct node, entry );
@@ -2617,7 +2616,7 @@ static HRESULT read_startelement_text( struct reader *reader )
reader->state = READER_STATE_ENDELEMENT;
return S_OK;
}
- else if (!read_cmp( reader, ">", 1 ))
+ else if (read_cmp( reader, ">", 1 ) == S_OK)
{
read_skip( reader, 1 );
return read_node_text( reader );
@@ -2744,7 +2743,7 @@ static HRESULT read_endelement_text( struct reader *reader )
WS_XML_STRING prefix, localname;
HRESULT hr;
- if (read_cmp( reader, "</", 2 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "</", 2 )) != S_OK) return hr;
read_skip( reader, 2 );
start = read_current_ptr( reader );
@@ -2817,14 +2816,15 @@ static HRESULT read_comment_text( struct reader *reader )
const unsigned char *start;
struct node *node, *parent;
WS_XML_COMMENT_NODE *comment;
+ HRESULT hr;
- if (read_cmp( reader, "<!--", 4 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "<!--", 4 )) != S_OK) return hr;
read_skip( reader, 4 );
start = read_current_ptr( reader );
for (;;)
{
- if (!read_cmp( reader, "-->", 3 ))
+ if (read_cmp( reader, "-->", 3 ) == S_OK)
{
read_skip( reader, 3 );
break;
@@ -2887,8 +2887,9 @@ static HRESULT read_comment_bin( struct reader *reader )
static HRESULT read_startcdata( struct reader *reader )
{
struct node *node, *endnode, *parent;
+ HRESULT hr;
- if (read_cmp( reader, "<![CDATA[", 9 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "<![CDATA[", 9 )) != S_OK) return hr;
read_skip( reader, 9 );
if (!(parent = find_parent( reader ))) return WS_E_INVALID_FORMAT;
@@ -2918,7 +2919,7 @@ static HRESULT read_cdata( struct reader *reader )
start = read_current_ptr( reader );
for (;;)
{
- if (!read_cmp( reader, "]]>", 3 )) break;
+ if (read_cmp( reader, "]]>", 3 ) == S_OK) break;
if (!(ch = read_utf8_char( reader, &skip ))) return WS_E_INVALID_FORMAT;
read_skip( reader, skip );
len += skip;
@@ -2941,8 +2942,9 @@ static HRESULT read_cdata( struct reader *reader )
static HRESULT read_endcdata( struct reader *reader )
{
struct node *parent;
+ HRESULT hr;
- if (read_cmp( reader, "]]>", 3 )) return WS_E_INVALID_FORMAT;
+ if ((hr = read_cmp( reader, "]]>", 3 )) != S_OK) return hr;
read_skip( reader, 3 );
if (node_type( reader->current ) == WS_XML_NODE_TYPE_TEXT) parent = reader->current->parent;
@@ -2969,16 +2971,19 @@ static HRESULT read_node_text( struct reader *reader )
}
if (reader->state == READER_STATE_STARTCDATA) return read_cdata( reader );
else if (reader->state == READER_STATE_CDATA) return read_endcdata( reader );
- else if (!read_cmp( reader, "<?", 2 ))
+ else if (read_cmp( reader, "<?", 2 ) == S_OK)
{
hr = read_xmldecl( reader );
if (FAILED( hr )) return hr;
}
- else if (!read_cmp( reader, "</", 2 )) return read_endelement_text( reader );
- else if (!read_cmp( reader, "<![CDATA[", 9 )) return read_startcdata( reader );
- else if (!read_cmp( reader, "<!--", 4 )) return read_comment_text( reader );
- else if (!read_cmp( reader, "<", 1 )) return read_element_text( reader );
- else if (!read_cmp( reader, "/>", 2 ) || !read_cmp( reader, ">", 1 )) return read_startelement_text( reader );
+ else if (read_cmp( reader, "</", 2 ) == S_OK) return read_endelement_text( reader );
+ else if (read_cmp( reader, "<![CDATA[", 9 ) == S_OK) return read_startcdata( reader );
+ else if (read_cmp( reader, "<!--", 4 ) == S_OK) return read_comment_text( reader );
+ else if (read_cmp( reader, "<", 1 ) == S_OK) return read_element_text( reader );
+ else if (read_cmp( reader, "/>", 2 ) == S_OK || read_cmp( reader, ">", 1 ) == S_OK)
+ {
+ return read_startelement_text( reader );
+ }
else return read_text_text( reader );
}
}
--
2.11.0
More information about the wine-devel
mailing list