Move custom pugixml changes to pugixml_extra

This commit is contained in:
Edu Garcia
2023-10-04 12:39:27 +01:00
parent d68c65d9d6
commit f1600b3014
5 changed files with 98 additions and 38 deletions

View File

@@ -4799,16 +4799,6 @@ namespace pugi
return xml_node();
}
PUGI__FN xml_node xml_node::child_or_append(const char_t* name_)
{
if (!_root) return xml_node();
for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
if (i->name && impl::strequal(name_, i->name)) return xml_node(i);
return append_child(name_);
}
PUGI__FN xml_attribute xml_node::attribute(const char_t* name_) const
{
if (!_root) return xml_attribute();
@@ -4879,17 +4869,6 @@ namespace pugi
return PUGIXML_TEXT("");
}
PUGI__FN bool xml_node::set_child_value(const char_t* rhs)
{
if (!_root) return false;
for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
if (i->value && impl::is_text_node(i))
return xml_node(i).set_value(rhs);
return append_child(node_pcdata).set_value(rhs);
}
PUGI__FN const char_t* xml_node::child_value(const char_t* name_) const
{
return child(name_).child_value();

View File

@@ -452,14 +452,12 @@ namespace pugi
// Get child, attribute or next/previous sibling with the specified name
xml_node child(const char_t* name) const;
xml_node child_or_append(const char_t* name);
xml_attribute attribute(const char_t* name) const;
xml_node next_sibling(const char_t* name) const;
xml_node previous_sibling(const char_t* name) const;
// Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
const char_t* child_value() const;
bool set_child_value(const char_t* rhs);
// Get child value of child with specified name. Equivalent to child(name).child_value().
const char_t* child_value(const char_t* name) const;

View File

@@ -0,0 +1,63 @@
#include "pugixml.hpp"
#include "pugixml_extra.hpp"
namespace pugi
{
// Compare two strings
// This comes from pugi::impl::strequal
bool strequal(const char_t* src, const char_t* dst)
{
#ifdef PUGIXML_WCHAR_MODE
return wcscmp(src, dst) == 0;
#else
return strcmp(src, dst) == 0;
#endif
}
// This comes from pugi::impl::is_text_node
inline bool is_text_node(const xml_node& node)
{
xml_node_type type = node.type();
return type == node_pcdata || type == node_cdata;
}
xml_node_extra::xml_node_extra(xml_node child) : xml_node(child)
{
}
xml_node_extra xml_node_extra::child_or_append(const char_t* name_)
{
if (!name_ || !_root) return xml_node_extra();
for (xml_node& child : *this)
{
const auto *name = child.name();
if (name && strequal(name_, name)) return xml_node_extra(child);
}
return xml_node_extra(append_child(name_));
}
bool xml_node_extra::set_child_value(const char_t* rhs)
{
if (!_root) return xml_node();
for (xml_node& child : *this)
{
if (child.value() && is_text_node(child))
{
return child.set_value(rhs);
}
}
return append_child(node_pcdata).set_value(rhs);
}
void xml_node_extra::append_child_with_value(const char_t* name_, const char_t* rhs)
{
xml_node_extra child = xml_node_extra(append_child(name_));
child.append_child(node_pcdata).set_value(rhs);
}
}

View File

@@ -0,0 +1,18 @@
#pragma once
#include "pugixml.hpp"
namespace pugi
{
class xml_node_extra : public xml_node
{
public:
xml_node_extra() = default;
xml_node_extra(xml_node child);
xml_node_extra child_or_append(const char_t* name_);
bool set_child_value(const char_t* rhs);
void append_child_with_value(const char_t* name_, const char_t* rhs);
};
}