Nikolay Sivov : xmllite/reader: Always return local name from element structure.
Alexandre Julliard
julliard at winehq.org
Fri Mar 17 15:19:47 CDT 2017
Module: wine
Branch: master
Commit: 1e015f1e14f6eb6e682253e240ea1c1914aee1ee
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e015f1e14f6eb6e682253e240ea1c1914aee1ee
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Mar 17 16:46:11 2017 +0300
xmllite/reader: Always return local name from element structure.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/xmllite/reader.c | 72 ++++++++++++++++++++++-----------------------------
1 file changed, 31 insertions(+), 41 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 41a6fb8..5ba787e 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -419,6 +419,15 @@ static HRESULT reader_add_attr(xmlreader *reader, strval *prefix, strval *localn
return S_OK;
}
+/* Returns current element, doesn't check if reader is actually positioned on it. */
+static struct element *reader_get_element(xmlreader *reader)
+{
+ if (reader->is_empty_element)
+ return &reader->empty_element;
+
+ return LIST_ENTRY(list_head(&reader->elements), struct element, entry);
+}
+
/* This one frees stored string value if needed */
static void reader_free_strvalued(xmlreader *reader, strval *v)
{
@@ -480,6 +489,7 @@ static void reader_clear_elements(xmlreader *reader)
reader_free(reader, elem);
}
list_init(&reader->elements);
+ reader_free_strvalued(reader, &reader->empty_element.localname);
reader->is_empty_element = FALSE;
}
@@ -2212,13 +2222,18 @@ static HRESULT reader_parse_stag(xmlreader *reader, strval *prefix, strval *loca
/* empty element */
if ((reader->is_empty_element = !reader_cmp(reader, endW)))
{
+ struct element *element = &reader->empty_element;
+
/* skip '/>' */
reader_skipn(reader, 2);
- reader->empty_element.prefix = *prefix;
- reader->empty_element.localname = *local;
- reader->empty_element.qname = *qname;
- reader->empty_element.position = position;
- reader_mark_ns_nodes(reader, &reader->empty_element);
+
+ reader_free_strvalued(reader, &element->localname);
+
+ element->prefix = *prefix;
+ element->qname = *qname;
+ reader_strvaldup(reader, local, &element->localname);
+ element->position = position;
+ reader_mark_ns_nodes(reader, element);
return S_OK;
}
@@ -2983,12 +2998,9 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
break;
case XmlNodeType_Element:
case XmlNodeType_EndElement:
- /* empty elements are not added to the stack */
if (!This->is_empty_element)
{
- struct element *element;
-
- element = LIST_ENTRY(list_head(&This->elements), struct element, entry);
+ struct element *element = reader_get_element(This);
*name = element->qname.str;
*len = element->qname.len;
break;
@@ -3114,6 +3126,7 @@ static HRESULT WINAPI xmlreader_GetNamespaceUri(IXmlReader* iface, const WCHAR *
static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, UINT *len)
{
xmlreader *This = impl_from_IXmlReader(iface);
+ struct element *element;
UINT length;
TRACE("(%p)->(%p %p)\n", This, name, len);
@@ -3132,17 +3145,10 @@ static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, U
break;
case XmlNodeType_Element:
case XmlNodeType_EndElement:
- /* empty elements are not added to the stack */
- if (!This->is_empty_element)
- {
- struct element *element;
-
- element = LIST_ENTRY(list_head(&This->elements), struct element, entry);
- *name = element->localname.str;
- *len = element->localname.len;
- break;
- }
- /* fallthrough */
+ element = reader_get_element(This);
+ *name = element->localname.str;
+ *len = element->localname.len;
+ break;
default:
*name = This->strvalues[StringValue_LocalName].str;
*len = This->strvalues[StringValue_LocalName].len;
@@ -3327,11 +3333,7 @@ static HRESULT WINAPI xmlreader_GetLineNumber(IXmlReader* iface, UINT *line_numb
{
case XmlNodeType_Element:
case XmlNodeType_EndElement:
- if (This->is_empty_element)
- element = &This->empty_element;
- else
- element = LIST_ENTRY(list_head(&This->elements), struct element, entry);
-
+ element = reader_get_element(This);
*line_number = element->position.line_number;
break;
case XmlNodeType_Attribute:
@@ -3363,11 +3365,7 @@ static HRESULT WINAPI xmlreader_GetLinePosition(IXmlReader* iface, UINT *line_po
{
case XmlNodeType_Element:
case XmlNodeType_EndElement:
- if (This->is_empty_element)
- element = &This->empty_element;
- else
- element = LIST_ENTRY(list_head(&This->elements), struct element, entry);
-
+ element = reader_get_element(This);
*line_position = element->position.line_position;
break;
case XmlNodeType_Attribute:
@@ -3519,32 +3517,24 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **obj, IMalloc *imalloc)
reader = IMalloc_Alloc(imalloc, sizeof(*reader));
else
reader = heap_alloc(sizeof(*reader));
- if(!reader) return E_OUTOFMEMORY;
+ if (!reader)
+ return E_OUTOFMEMORY;
+ memset(reader, 0, sizeof(*reader));
reader->IXmlReader_iface.lpVtbl = &xmlreader_vtbl;
reader->ref = 1;
- reader->input = NULL;
reader->state = XmlReadState_Closed;
reader->instate = XmlReadInState_Initial;
reader->resumestate = XmlReadResumeState_Initial;
reader->dtdmode = DtdProcessing_Prohibit;
- reader->resolver = NULL;
- reader->mlang = NULL;
- reader->position.line_number = 0;
- reader->position.line_position = 0;
reader->imalloc = imalloc;
if (imalloc) IMalloc_AddRef(imalloc);
reader->nodetype = XmlNodeType_None;
list_init(&reader->attrs);
- reader->attr_count = 0;
- reader->attr = NULL;
list_init(&reader->nsdef);
list_init(&reader->ns);
list_init(&reader->elements);
- reader->depth = 0;
reader->max_depth = 256;
- reader->is_empty_element = FALSE;
- memset(reader->resume, 0, sizeof(reader->resume));
for (i = 0; i < StringValue_Last; i++)
reader->strvalues[i] = strval_empty;
More information about the wine-cvs
mailing list