Nikolay Sivov : xmllite/reader: Return same string for local and qualified names for attributes when appropriate.
Alexandre Julliard
julliard at winehq.org
Fri Mar 17 15:19:47 CDT 2017
Module: wine
Branch: master
Commit: 253f233e52a94283cf884004d11dc8c39b1a8d6b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=253f233e52a94283cf884004d11dc8c39b1a8d6b
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Mar 17 16:46:13 2017 +0300
xmllite/reader: Return same string for local and qualified names for attributes when appropriate.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/xmllite/reader.c | 67 +++++++++++++++++++++++++++++++++++++++------------
1 file changed, 51 insertions(+), 16 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index ca8602c..b28a4b1 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -230,6 +230,12 @@ struct reader_position
UINT line_position;
};
+enum attribute_flags
+{
+ ATTRIBUTE_NS_DEFINITION = 0x1,
+ ATTRIBUTE_DEFAULT_NS_DEFINITION = 0x2,
+};
+
struct attribute
{
struct list entry;
@@ -238,6 +244,7 @@ struct attribute
strval qname;
strval value;
struct reader_position position;
+ unsigned int flags;
};
struct element
@@ -398,7 +405,7 @@ static void reader_clear_attrs(xmlreader *reader)
/* attribute data holds pointers to buffer data, so buffer shrink is not possible
while we are on a node with attributes */
static HRESULT reader_add_attr(xmlreader *reader, strval *prefix, strval *localname, strval *qname,
- strval *value, const struct reader_position *position)
+ strval *value, const struct reader_position *position, unsigned int flags)
{
struct attribute *attr;
@@ -413,6 +420,7 @@ static HRESULT reader_add_attr(xmlreader *reader, strval *prefix, strval *localn
attr->qname = qname ? *qname : *localname;
attr->value = *value;
attr->position = *position;
+ attr->flags = flags;
list_add_tail(&reader->attrs, &attr->entry);
reader->attr_count++;
@@ -1179,7 +1187,7 @@ static HRESULT reader_parse_versioninfo(xmlreader *reader)
/* skip "'"|'"' */
reader_skipn(reader, 1);
- return reader_add_attr(reader, NULL, &name, NULL, &val, &position);
+ return reader_add_attr(reader, NULL, &name, NULL, &val, &position, 0);
}
/* ([A-Za-z0-9._] | '-') */
@@ -1257,7 +1265,7 @@ static HRESULT reader_parse_encdecl(xmlreader *reader)
/* skip "'"|'"' */
reader_skipn(reader, 1);
- return reader_add_attr(reader, NULL, &name, NULL, &val, &position);
+ return reader_add_attr(reader, NULL, &name, NULL, &val, &position, 0);
}
/* [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) */
@@ -1301,7 +1309,7 @@ static HRESULT reader_parse_sddecl(xmlreader *reader)
/* skip "'"|'"' */
reader_skipn(reader, 1);
- return reader_add_attr(reader, NULL, &name, NULL, &val, &position);
+ return reader_add_attr(reader, NULL, &name, NULL, &val, &position, 0);
}
/* [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' */
@@ -1774,7 +1782,7 @@ static HRESULT reader_parse_externalid(xmlreader *reader)
if (FAILED(hr)) return hr;
reader_init_cstrvalue(publicW, strlenW(publicW), &name);
- hr = reader_add_attr(reader, NULL, &name, NULL, &pub, &position);
+ hr = reader_add_attr(reader, NULL, &name, NULL, &pub, &position, 0);
if (FAILED(hr)) return hr;
cnt = reader_skipspaces(reader);
@@ -1785,7 +1793,7 @@ static HRESULT reader_parse_externalid(xmlreader *reader)
if (FAILED(hr)) return S_OK;
reader_init_cstrvalue(systemW, strlenW(systemW), &name);
- hr = reader_add_attr(reader, NULL, &name, NULL, &sys, &position);
+ hr = reader_add_attr(reader, NULL, &name, NULL, &sys, &position, 0);
if (FAILED(hr)) return hr;
return S_OK;
@@ -1799,7 +1807,7 @@ static HRESULT reader_parse_externalid(xmlreader *reader)
if (FAILED(hr)) return hr;
reader_init_cstrvalue(systemW, strlenW(systemW), &name);
- return reader_add_attr(reader, NULL, &name, NULL, &sys, &position);
+ return reader_add_attr(reader, NULL, &name, NULL, &sys, &position, 0);
}
return S_FALSE;
@@ -2179,17 +2187,17 @@ static HRESULT reader_parse_attribute(xmlreader *reader)
{
struct reader_position position = reader->position;
strval prefix, local, qname, value;
- BOOL ns = FALSE, nsdef = FALSE;
+ enum attribute_flags flags = 0;
HRESULT hr;
hr = reader_parse_qname(reader, &prefix, &local, &qname);
if (FAILED(hr)) return hr;
if (strval_eq(reader, &prefix, &strval_xmlns))
- ns = TRUE;
+ flags |= ATTRIBUTE_NS_DEFINITION;
if (strval_eq(reader, &qname, &strval_xmlns))
- ns = nsdef = TRUE;
+ flags |= ATTRIBUTE_DEFAULT_NS_DEFINITION;
hr = reader_parse_eq(reader);
if (FAILED(hr)) return hr;
@@ -2197,11 +2205,11 @@ static HRESULT reader_parse_attribute(xmlreader *reader)
hr = reader_parse_attvalue(reader, &value);
if (FAILED(hr)) return hr;
- if (ns)
- reader_push_ns(reader, nsdef ? &strval_xmlns : &local, &value, nsdef);
+ if (flags & (ATTRIBUTE_NS_DEFINITION | ATTRIBUTE_DEFAULT_NS_DEFINITION))
+ reader_push_ns(reader, &local, &value, !!(flags & ATTRIBUTE_DEFAULT_NS_DEFINITION));
TRACE("%s=%s\n", debug_strval(reader, &local), debug_strval(reader, &value));
- return reader_add_attr(reader, &prefix, &local, &qname, &value, &position);
+ return reader_add_attr(reader, &prefix, &local, &qname, &value, &position, flags);
}
/* [12 NS] STag ::= '<' QName (S Attribute)* S? '>'
@@ -2982,6 +2990,7 @@ static HRESULT WINAPI xmlreader_MoveToElement(IXmlReader* iface)
static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *name, UINT *len)
{
xmlreader *This = impl_from_IXmlReader(iface);
+ struct attribute *attribute = This->attr;
struct element *element;
UINT length;
@@ -3013,6 +3022,22 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
*len = element->localname.len;
}
break;
+ case XmlNodeType_Attribute:
+ if (attribute->flags & ATTRIBUTE_DEFAULT_NS_DEFINITION)
+ {
+ *name = xmlnsW;
+ *len = 5;
+ } else if (attribute->prefix.len)
+ {
+ *name = This->strvalues[StringValue_QualifiedName].str;
+ *len = This->strvalues[StringValue_QualifiedName].len;
+ }
+ else
+ {
+ *name = This->strvalues[StringValue_LocalName].str;
+ *len = This->strvalues[StringValue_LocalName].len;
+ }
+ break;
default:
*name = This->strvalues[StringValue_QualifiedName].str;
*len = This->strvalues[StringValue_QualifiedName].len;
@@ -3156,6 +3181,18 @@ static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, U
*name = element->localname.str;
*len = element->localname.len;
break;
+ case XmlNodeType_Attribute:
+ if (This->attr->flags & ATTRIBUTE_DEFAULT_NS_DEFINITION)
+ {
+ *name = xmlnsW;
+ *len = 5;
+ }
+ else
+ {
+ *name = This->strvalues[StringValue_LocalName].str;
+ *len = This->strvalues[StringValue_LocalName].len;
+ }
+ break;
default:
*name = This->strvalues[StringValue_LocalName].str;
*len = This->strvalues[StringValue_LocalName].len;
@@ -3246,11 +3283,9 @@ static HRESULT WINAPI xmlreader_GetValue(IXmlReader* iface, const WCHAR **value,
case XmlNodeType_Attribute:
{
const strval *local = &reader->strvalues[StringValue_LocalName];
- const strval *prefix = &reader->strvalues[StringValue_Prefix];
/* For namespace definition attributes return values from namespace list */
- if (((strval_eq(reader, prefix, &strval_empty) && strval_eq(reader, local, &strval_xmlns)) ||
- strval_eq(reader, prefix, &strval_xmlns)))
+ if (reader->attr->flags & (ATTRIBUTE_NS_DEFINITION | ATTRIBUTE_DEFAULT_NS_DEFINITION))
{
struct ns *ns;
More information about the wine-cvs
mailing list