diff --git a/docs/manual.adoc b/docs/manual.adoc
index 6464950..cae6285 100644
--- a/docs/manual.adoc
+++ b/docs/manual.adoc
@@ -1275,6 +1275,7 @@ As discussed before, nodes can have name and value, both of which are strings. D
[source]
----
bool xml_node::set_name(const char_t* rhs);
+bool xml_node::set_name(const char_t* rhs, size_t sz)
bool xml_node::set_value(const char_t* rhs);
bool xml_node::set_value(const char_t* rhs, size_t size);
----
@@ -1297,6 +1298,7 @@ All attributes have name and value, both of which are strings (value may be empt
[source]
----
bool xml_attribute::set_name(const char_t* rhs);
+bool xml_attribute::set_name(const char_t* rhs, size_t sz)
bool xml_attribute::set_value(const char_t* rhs);
bool xml_attribute::set_value(const char_t* rhs, size_t size);
----
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index e02a137..00cd64a 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -5401,6 +5401,13 @@ namespace pugi
return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs));
}
+ PUGI_IMPL_FN bool xml_attribute::set_name(const char_t* rhs, size_t sz)
+ {
+ if (!_attr) return false;
+
+ return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs, sz);
+ }
+
PUGI_IMPL_FN bool xml_attribute::set_value(const char_t* rhs, size_t sz)
{
if (!_attr) return false;
@@ -5798,6 +5805,16 @@ namespace pugi
return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs));
}
+ PUGI_IMPL_FN bool xml_node::set_name(const char_t* rhs, size_t sz)
+ {
+ xml_node_type type_ = _root ? PUGI_IMPL_NODETYPE(_root) : node_null;
+
+ if (type_ != node_element && type_ != node_pi && type_ != node_declaration)
+ return false;
+
+ return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs, sz);
+ }
+
PUGI_IMPL_FN bool xml_node::set_value(const char_t* rhs, size_t sz)
{
xml_node_type type_ = _root ? PUGI_IMPL_NODETYPE(_root) : node_null;
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index 8749759..42414c3 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -418,6 +418,7 @@ namespace pugi
// Set attribute name/value (returns false if attribute is empty or there is not enough memory)
bool set_name(const char_t* rhs);
+ bool set_name(const char_t* rhs, size_t sz);
bool set_value(const char_t* rhs, size_t sz);
bool set_value(const char_t* rhs);
@@ -553,6 +554,7 @@ namespace pugi
// Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)
bool set_name(const char_t* rhs);
+ bool set_name(const char_t* rhs, size_t sz);
bool set_value(const char_t* rhs, size_t sz);
bool set_value(const char_t* rhs);
diff --git a/tests/test_dom_modify.cpp b/tests/test_dom_modify.cpp
index 3451f19..be91609 100644
--- a/tests/test_dom_modify.cpp
+++ b/tests/test_dom_modify.cpp
@@ -46,6 +46,16 @@ TEST_XML(dom_attr_set_name, "")
CHECK_NODE(doc, STR(""));
}
+TEST_XML(dom_attr_set_name_with_size, "")
+{
+ xml_attribute attr = doc.child(STR("node")).attribute(STR("attr"));
+
+ CHECK(attr.set_name(STR("n1234"), 1));
+ CHECK(!xml_attribute().set_name(STR("nfail"), 1));
+
+ CHECK_NODE(doc, STR(""));
+}
+
TEST_XML(dom_attr_set_value, "")
{
xml_node node = doc.child(STR("node"));
@@ -206,6 +216,15 @@ TEST_XML(dom_node_set_name, "text")
CHECK_NODE(doc, STR("text"));
}
+TEST_XML(dom_node_set_name_with_size, "text")
+{
+ CHECK(doc.child(STR("node")).set_name(STR("nlongname"), 1));
+ CHECK(!doc.child(STR("node")).first_child().set_name(STR("n42"), 1));
+ CHECK(!xml_node().set_name(STR("nanothername"), 1));
+
+ CHECK_NODE(doc, STR("text"));
+}
+
TEST_XML(dom_node_set_value, "text")
{
CHECK(doc.child(STR("node")).first_child().set_value(STR("no text")));