Module: wine Branch: master Commit: 29b1c115fefa7ee0aee12e583961513b27198759 URL: http://source.winehq.org/git/wine.git/?a=commit;h=29b1c115fefa7ee0aee12e5839...
Author: Hans Leidekker hans@codeweavers.com Date: Tue Nov 10 10:46:38 2015 +0100
webservices: Parse self-closing tags.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/webservices/reader.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index 96a3dc3..0e9d533 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -379,6 +379,7 @@ enum reader_state READER_STATE_INITIAL, READER_STATE_BOF, READER_STATE_STARTELEMENT, + READER_STATE_STARTENDELEMENT, READER_STATE_TEXT, READER_STATE_ENDELEMENT, READER_STATE_COMMENT, @@ -928,7 +929,7 @@ static HRESULT read_element( struct reader *reader ) for (;;) { read_skip_whitespace( reader ); - if (!read_cmp( reader, ">", 1 )) break; + if (!read_cmp( reader, ">", 1 ) || !read_cmp( reader, "/>", 2 )) break; if ((hr = read_attribute( reader, &attr )) != S_OK) goto error; if ((hr = append_attribute( elem, attr )) != S_OK) { @@ -938,16 +939,24 @@ static HRESULT read_element( struct reader *reader ) }
read_skip_whitespace( reader ); - if (read_cmp( reader, ">", 1 )) + if (read_cmp( reader, ">", 1 ) && read_cmp( reader, "/>", 2 )) { hr = WS_E_INVALID_FORMAT; goto error; }
read_insert_node( reader, reader->current, node ); - read_skip( reader, 1 ); - reader->state = READER_STATE_STARTELEMENT; - + if (!read_cmp( reader, "/>", 2 )) + { + read_skip( reader, 2 ); + reader->current = reader->current->parent; + reader->state = READER_STATE_STARTENDELEMENT; + } + else + { + read_skip( reader, 1 ); + reader->state = READER_STATE_STARTELEMENT; + } return S_OK;
error: @@ -1056,6 +1065,7 @@ static HRESULT read_endelement( struct reader *reader ) { case READER_STATE_TEXT: case READER_STATE_STARTELEMENT: + case READER_STATE_STARTENDELEMENT: break; default: return WS_E_INVALID_FORMAT;