summaryrefslogtreecommitdiffstats
path: root/src/uscxml/util/DOM.cpp
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2016-06-13 08:52:55 (GMT)
committerStefan Radomski <github@mintwerk.de>2016-06-13 08:52:55 (GMT)
commit053e9bc973fbe88fc41a34064ffadc0deabac58d (patch)
tree6aeee286577159ffcb612d41972a9d18ab685c6d /src/uscxml/util/DOM.cpp
parent6e13c7b6e0888323223afd5d2e36e86243df57af (diff)
downloaduscxml-053e9bc973fbe88fc41a34064ffadc0deabac58d.zip
uscxml-053e9bc973fbe88fc41a34064ffadc0deabac58d.tar.gz
uscxml-053e9bc973fbe88fc41a34064ffadc0deabac58d.tar.bz2
Fixed dozens of memory leaks
Diffstat (limited to 'src/uscxml/util/DOM.cpp')
-rw-r--r--src/uscxml/util/DOM.cpp45
1 files changed, 16 insertions, 29 deletions
diff --git a/src/uscxml/util/DOM.cpp b/src/uscxml/util/DOM.cpp
index ecf0960..7793fb5 100644
--- a/src/uscxml/util/DOM.cpp
+++ b/src/uscxml/util/DOM.cpp
@@ -52,7 +52,7 @@ std::ostream& operator<< (std::ostream& os, const DOMNode& node) {
}
std::ostream& operator<< (std::ostream& os, const X& xmlString) {
- os << xmlString._localForm;
+ os << xmlString.str();
return os;
}
@@ -236,20 +236,13 @@ void DOMUtils::inPostFixOrder(const std::set<std::string>& elements,
if (root == NULL)
return;
- DOMNodeList* children = root->getChildNodes();
- for (size_t i = 0; i < children->getLength(); i++) {
- if (children->item(i)->getNodeType() != DOMNode::ELEMENT_NODE)
- continue;
- const DOMElement* childElem = dynamic_cast<const DOMElement*>(children->item(i));
+ for (auto childElem = root->getFirstElementChild(); childElem; childElem = childElem->getNextElementSibling()) {
if (!includeEmbeddedDoc && LOCALNAME(childElem) == "scxml")
continue;
inPostFixOrder(elements, childElem, includeEmbeddedDoc, nodes);
}
- for (size_t i = 0; i < children->getLength(); i++) {
- if (children->item(i)->getNodeType() != DOMNode::ELEMENT_NODE)
- continue;
- const DOMElement* childElem = dynamic_cast<const DOMElement*>(children->item(i));
+ for (auto childElem = root->getFirstElementChild(); childElem; childElem = childElem->getNextElementSibling()) {
if (!includeEmbeddedDoc && TAGNAME(childElem) == XML_PREFIX(root).str() + "scxml")
continue;
@@ -278,14 +271,14 @@ void DOMUtils::inDocumentOrder(const std::set<std::string>& elements,
nodes.push_back((DOMElement*)root);
}
- DOMNodeList* children = root->getChildNodes();
- for (size_t i = 0; i < children->getLength(); i++) {
- if (children->item(i)->getNodeType() != DOMNode::ELEMENT_NODE)
- continue;
- const DOMElement* childElem = dynamic_cast<const DOMElement*>(children->item(i));
- if (!includeEmbeddedDoc && TAGNAME(childElem) == XML_PREFIX(root).str() + "scxml")
- continue;
- inDocumentOrder(elements, childElem, includeEmbeddedDoc, nodes);
+ /// @todo: item from getChildNodes is O(N)!
+ DOMElement* child = root->getFirstElementChild();
+ while(child) {
+ if (includeEmbeddedDoc || TAGNAME(child) != XML_PREFIX(root).str() + "scxml") {
+ inDocumentOrder(elements, child, includeEmbeddedDoc, nodes);
+ }
+
+ child = child->getNextElementSibling();
}
}
@@ -350,12 +343,7 @@ std::list<DOMElement*> DOMUtils::filterChildElements(const std::string& tagName,
if (!node)
return filteredChildElems;
- DOMNodeList* children = node->getChildNodes();
- for (unsigned int i = 0; i < children->getLength(); i++) {
- if (children->item(i)->getNodeType() != DOMNode::ELEMENT_NODE)
- continue;
- const DOMElement* childElem = dynamic_cast<const DOMElement*>(children->item(i));
-
+ for (auto childElem = node->getFirstElementChild(); childElem; childElem = childElem->getNextElementSibling()) {
// std::cerr << TAGNAME(childs.item(i)) << std::endl;
if(iequals(TAGNAME(childElem), tagName)) {
filteredChildElems.push_back((DOMElement*)childElem);
@@ -391,12 +379,11 @@ std::list<DOMNode*> DOMUtils::filterChildType(const DOMNode::NodeType type,
if (!node)
return filteredChildTypes;
- DOMNodeList* children = node->getChildNodes();
- for (unsigned int i = 0; i < children->getLength(); i++) {
- if (children->item(i)->getNodeType() == type)
- filteredChildTypes.push_back(children->item(i));
+ for (auto child = node->getFirstChild(); child; child = child->getNextSibling()) {
+ if (child->getNodeType() == type)
+ filteredChildTypes.push_back(child);
if (recurse) {
- std::list<DOMNode*> nested = filterChildType(type, children->item(i), recurse);
+ std::list<DOMNode*> nested = filterChildType(type, child, recurse);
filteredChildTypes.merge(nested);
}