From: Nikolay Sivov Subject: [PATCH 03/14] xmllite: Store prefix for elements Message-Id: <20161209133834.699-3-nsivov@codeweavers.com> Date: Fri, 9 Dec 2016 16:38:23 +0300 In-Reply-To: <20161209133834.699-1-nsivov@codeweavers.com> References: <20161209133834.699-1-nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov --- dlls/xmllite/reader.c | 68 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c index c3b68d2..8978d97 100644 --- a/dlls/xmllite/reader.c +++ b/dlls/xmllite/reader.c @@ -228,8 +228,9 @@ struct attribute struct element { struct list entry; - strval qname; + strval prefix; strval localname; + strval qname; }; typedef struct @@ -282,6 +283,14 @@ static inline void *reader_alloc(xmlreader *reader, size_t len) return m_alloc(reader->imalloc, len); } +static inline void *reader_alloc_zero(xmlreader *reader, size_t len) +{ + void *ret = reader_alloc(reader, len); + if (ret) + memset(ret, 0, len); + return ret; +} + static inline void reader_free(xmlreader *reader, void *mem) { m_free(reader->imalloc, mem); @@ -448,39 +457,44 @@ static void reader_dec_depth(xmlreader *reader) if (reader->depth > 1) reader->depth--; } -static HRESULT reader_push_element(xmlreader *reader, strval *qname, strval *localname) +static void reader_free_element(xmlreader *reader, struct element *element) { - struct element *elem; - HRESULT hr; - - elem = reader_alloc(reader, sizeof(*elem)); - if (!elem) return E_OUTOFMEMORY; - - hr = reader_strvaldup(reader, qname, &elem->qname); - if (FAILED(hr)) { - reader_free(reader, elem); - return hr; - } + reader_free_strvalued(reader, &element->prefix); + reader_free_strvalued(reader, &element->localname); + reader_free_strvalued(reader, &element->qname); + reader_free(reader, element); +} - hr = reader_strvaldup(reader, localname, &elem->localname); - if (FAILED(hr)) - { - reader_free_strvalued(reader, &elem->qname); - reader_free(reader, elem); - return hr; - } +static HRESULT reader_push_element(xmlreader *reader, strval *prefix, strval *localname, + strval *qname) +{ + struct element *element; + HRESULT hr; if (!list_empty(&reader->elements)) { hr = reader_inc_depth(reader); - if (FAILED(hr)) { - reader_free(reader, elem); + if (FAILED(hr)) return hr; - } } - list_add_head(&reader->elements, &elem->entry); + element = reader_alloc_zero(reader, sizeof(*element)); + if (!element) + goto failed; + + if ((hr = reader_strvaldup(reader, prefix, &element->prefix)) != S_OK || + (hr = reader_strvaldup(reader, localname, &element->localname)) != S_OK || + (hr = reader_strvaldup(reader, qname, &element->qname)) != S_OK) + { + reader_free_element(reader, element); + goto failed; + } + + list_add_head(&reader->elements, &element->entry); reader->is_empty_element = FALSE; + +failed: + reader_dec_depth(reader); return hr; } @@ -2077,6 +2091,7 @@ static HRESULT reader_parse_stag(xmlreader *reader, strval *prefix, strval *loca /* skip '/>' */ reader_skipn(reader, 2); reader->is_empty_element = TRUE; + reader->empty_element.prefix = *prefix; reader->empty_element.localname = *local; reader->empty_element.qname = *qname; return S_OK; @@ -2087,7 +2102,7 @@ static HRESULT reader_parse_stag(xmlreader *reader, strval *prefix, strval *loca { /* skip '>' */ reader_skipn(reader, 1); - return reader_push_element(reader, qname, local); + return reader_push_element(reader, prefix, local, qname); } hr = reader_parse_attribute(reader); @@ -2134,8 +2149,8 @@ static HRESULT reader_parse_element(xmlreader *reader) reader->nodetype = XmlNodeType_Element; reader->resumestate = XmlReadResumeState_Initial; - reader_set_strvalue(reader, StringValue_LocalName, &local); reader_set_strvalue(reader, StringValue_Prefix, &prefix); + reader_set_strvalue(reader, StringValue_LocalName, &local); reader_set_strvalue(reader, StringValue_QualifiedName, &qname); break; } @@ -2178,6 +2193,7 @@ static HRESULT reader_parse_endtag(xmlreader *reader) reader->instate = XmlReadInState_MiscEnd; reader->nodetype = XmlNodeType_EndElement; + reader_set_strvalue(reader, StringValue_Prefix, &prefix); reader_set_strvalue(reader, StringValue_LocalName, &local); reader_set_strvalue(reader, StringValue_QualifiedName, &qname); -- 2.10.2