summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorarseny.kapoulkine@gmail.com <arseny.kapoulkine@gmail.com@99668b35-9821-0410-8761-19e4c4f06640>2010-10-19 14:29:02 +0000
committerarseny.kapoulkine@gmail.com <arseny.kapoulkine@gmail.com@99668b35-9821-0410-8761-19e4c4f06640>2010-10-19 14:29:02 +0000
commitb979d4c2bd1e8f445befd53ea8357b594f1ca3b2 (patch)
treee4cefc7e257b796d07be70488e80f657d9e0160b /src
parentd8c19b201f93dc070fb37472f933b53e49b393bc (diff)
Added prepend_attribute, prepend_child and prepend_copy functions
git-svn-id: http://pugixml.googlecode.com/svn/trunk@769 99668b35-9821-0410-8761-19e4c4f06640
Diffstat (limited to 'src')
-rw-r--r--src/pugixml.cpp71
-rw-r--r--src/pugixml.hpp4
2 files changed, 75 insertions, 0 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index f53ce1d..241eaed 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -3775,6 +3775,31 @@ namespace pugi
return a;
}
+ xml_attribute xml_node::prepend_attribute(const char_t* name)
+ {
+ if (type() != node_element && type() != node_declaration) return xml_attribute();
+
+ xml_attribute a(allocate_attribute(get_allocator(_root)));
+ if (!a) return xml_attribute();
+
+ a.set_name(name);
+
+ xml_attribute_struct* head = _root->first_attribute;
+
+ if (head)
+ {
+ a._attr->prev_attribute_c = head->prev_attribute_c;
+ head->prev_attribute_c = a._attr;
+ }
+ else
+ a._attr->prev_attribute_c = a._attr;
+
+ a._attr->next_attribute = head;
+ _root->first_attribute = a._attr;
+
+ return a;
+ }
+
xml_attribute xml_node::insert_attribute_before(const char_t* name, const xml_attribute& attr)
{
if ((type() != node_element && type() != node_declaration) || attr.empty()) return xml_attribute();
@@ -3841,6 +3866,16 @@ namespace pugi
return result;
}
+ xml_attribute xml_node::prepend_copy(const xml_attribute& proto)
+ {
+ if (!proto) return xml_attribute();
+
+ xml_attribute result = prepend_attribute(proto.name());
+ result.set_value(proto.value());
+
+ return result;
+ }
+
xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr)
{
if (!proto) return xml_attribute();
@@ -3872,6 +3907,33 @@ namespace pugi
return n;
}
+ xml_node xml_node::prepend_child(xml_node_type type)
+ {
+ if (!allow_insert_child(this->type(), type)) return xml_node();
+
+ xml_node n(allocate_node(get_allocator(_root), type));
+ if (!n) return xml_node();
+
+ n._root->parent = _root;
+
+ xml_node_struct* head = _root->first_child;
+
+ if (head)
+ {
+ n._root->prev_sibling_c = head->prev_sibling_c;
+ head->prev_sibling_c = n._root;
+ }
+ else
+ n._root->prev_sibling_c = n._root;
+
+ n._root->next_sibling = head;
+ _root->first_child = n._root;
+
+ if (type == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+ return n;
+ }
+
xml_node xml_node::insert_child_before(xml_node_type type, const xml_node& node)
{
if (!allow_insert_child(this->type(), type)) return xml_node();
@@ -3929,6 +3991,15 @@ namespace pugi
return result;
}
+ xml_node xml_node::prepend_copy(const xml_node& proto)
+ {
+ xml_node result = prepend_child(proto.type());
+
+ if (result) recursive_copy_skip(result, proto, result);
+
+ return result;
+ }
+
xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node)
{
xml_node result = insert_child_after(proto.type(), node);
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index 81fc6c3..cccfb7f 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -412,21 +412,25 @@ namespace pugi
// Add attribute with specified name. Returns added attribute, or empty attribute on errors.
xml_attribute append_attribute(const char_t* name);
+ xml_attribute prepend_attribute(const char_t* name);
xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr);
xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr);
// Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors.
xml_attribute append_copy(const xml_attribute& proto);
+ xml_attribute prepend_copy(const xml_attribute& proto);
xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr);
xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr);
// Add child node with specified type. Returns added node, or empty node on errors.
xml_node append_child(xml_node_type type = node_element);
+ xml_node prepend_child(xml_node_type type = node_element);
xml_node insert_child_after(xml_node_type type, const xml_node& node);
xml_node insert_child_before(xml_node_type type, const xml_node& node);
// Add a copy of the specified node as a child. Returns added node, or empty node on errors.
xml_node append_copy(const xml_node& proto);
+ xml_node prepend_copy(const xml_node& proto);
xml_node insert_copy_after(const xml_node& proto, const xml_node& node);
xml_node insert_copy_before(const xml_node& proto, const xml_node& node);