Jacek Caban : xmllite: Clear all parser values in SetInput.
Alexandre Julliard
julliard at winehq.org
Thu Mar 30 15:18:02 CDT 2017
Module: wine
Branch: master
Commit: 6917e2aa3ca9ac78bdce9b11e3382bce8e06fe2a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6917e2aa3ca9ac78bdce9b11e3382bce8e06fe2a
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Mar 29 19:47:05 2017 +0200
xmllite: Clear all parser values in SetInput.
Not clearing namespaces was problematic for tests, but clearing other
values also looks like a good idea.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/xmllite/reader.c | 33 +++++++++++++++++++++------------
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index e81f266..eb23f3a 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -2679,17 +2679,36 @@ static void reader_clear_ns(xmlreader *reader)
struct ns *ns, *ns2;
LIST_FOR_EACH_ENTRY_SAFE(ns, ns2, &reader->ns, struct ns, entry) {
+ list_remove(&ns->entry);
reader_free_strvalued(reader, &ns->prefix);
reader_free_strvalued(reader, &ns->uri);
reader_free(reader, ns);
}
LIST_FOR_EACH_ENTRY_SAFE(ns, ns2, &reader->nsdef, struct ns, entry) {
+ list_remove(&ns->entry);
reader_free_strvalued(reader, &ns->uri);
reader_free(reader, ns);
}
}
+static void reader_reset_parser(xmlreader *reader)
+{
+ reader->position.line_number = 0;
+ reader->position.line_position = 0;
+
+ reader_clear_elements(reader);
+ reader_clear_attrs(reader);
+ reader_clear_ns(reader);
+ reader_free_strvalues(reader);
+
+ reader->depth = 0;
+ reader->nodetype = XmlNodeType_None;
+ reader->resumestate = XmlReadResumeState_Initial;
+ memset(reader->resume, 0, sizeof(reader->resume));
+ reader->is_empty_element = FALSE;
+}
+
static ULONG WINAPI xmlreader_Release(IXmlReader *iface)
{
xmlreader *This = impl_from_IXmlReader(iface);
@@ -2700,13 +2719,10 @@ static ULONG WINAPI xmlreader_Release(IXmlReader *iface)
if (ref == 0)
{
IMalloc *imalloc = This->imalloc;
+ reader_reset_parser(This);
if (This->input) IUnknown_Release(&This->input->IXmlReaderInput_iface);
if (This->resolver) IXmlResolver_Release(This->resolver);
if (This->mlang) IUnknown_Release(This->mlang);
- reader_clear_attrs(This);
- reader_clear_ns(This);
- reader_clear_elements(This);
- reader_free_strvalues(This);
reader_free(This, This);
if (imalloc) IMalloc_Release(imalloc);
}
@@ -2729,13 +2745,7 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
This->input = NULL;
}
- This->position.line_number = 0;
- This->position.line_position = 0;
- reader_clear_elements(This);
- This->depth = 0;
- This->nodetype = XmlNodeType_None;
- This->resumestate = XmlReadResumeState_Initial;
- memset(This->resume, 0, sizeof(This->resume));
+ reader_reset_parser(This);
/* just reset current input */
if (!input)
@@ -2776,7 +2786,6 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
This->state = XmlReadState_Initial;
This->instate = XmlReadInState_Initial;
}
-
return hr;
}
More information about the wine-cvs
mailing list