Add 'unflatten' to doxygen/dot processing
[senf.git] / Utils / Console / Node.cc
index 39c2685..69e1bfb 100644 (file)
@@ -39,6 +39,31 @@ prefix_ senf::console::DirectoryNode & senf::console::root()
     return *rootNode;
 }
 
+namespace {
+    void dodump(std::ostream & output, unsigned level, senf::console::DirectoryNode & node)
+    {
+        std::string pad (2*level, ' ');
+        senf::console::DirectoryNode::child_iterator i (node.children().begin());
+        senf::console::DirectoryNode::child_iterator const i_end (node.children().end());
+        for (; i != i_end; ++i) {
+            output << pad << i->first;
+            if (i->second->isDirectory()) {
+                output << "/\n";
+                dodump(output, level+1,static_cast<senf::console::DirectoryNode&>(*i->second));
+            }
+            else if (i->second->isLink()) 
+                output << "@ -> " << i->second->followLink().path() << '\n';
+            else
+                output << '\n';
+        }
+    }
+}
+
+prefix_ void senf::console::dump(std::ostream & os, DirectoryNode & dir)
+{
+    dodump(os,0,dir);
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::GenericNode
 
@@ -95,13 +120,26 @@ prefix_ bool senf::console::GenericNode::isChildOf(DirectoryNode & parent)
 prefix_ void senf::console::LinkNode::v_help(std::ostream & os)
     const
 {
-    os << "link to ";
     follow().help(os);
 }
 
+prefix_ std::string senf::console::LinkNode::v_shorthelp()
+    const
+{
+    return follow().shorthelp();
+}
+
 ///////////////////////////////////////////////////////////////////////////
 //senf::console::DirectoryNode
 
+prefix_ senf::console::DirectoryNode::~DirectoryNode()
+{
+    ChildMap::iterator i (children_.begin());
+    ChildMap::iterator const i_end (children_.end());
+    for (; i != i_end; ++i)
+        i->second->parent_ = 0;
+}
+
 prefix_ senf::console::GenericNode::ptr
 senf::console::DirectoryNode::remove(std::string const & name)
 {
@@ -153,6 +191,14 @@ prefix_ void senf::console::DirectoryNode::v_help(std::ostream & output)
     output << doc_ << "\n";
 }
 
+prefix_ std::string senf::console::DirectoryNode::v_shorthelp()
+    const
+{
+    if (! shortdoc_.empty())
+        return shortdoc_;
+    return doc_.substr(0,doc_.find('\n'));
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::detail::NodeTraverser
 
@@ -209,11 +255,19 @@ prefix_ void senf::console::SimpleCommandNode::v_help(std::ostream & output)
     output << doc_ << "\n";
 }
 
-prefix_ void senf::console::SimpleCommandNode::v_execute(std::ostream & output,
+prefix_ std::string senf::console::SimpleCommandNode::v_shorthelp()
+    const
+{
+    if (! shortdoc_.empty())
+        return shortdoc_;
+    return doc_.substr(0,doc_.find('\n'));
+}
+
+prefix_ void senf::console::SimpleCommandNode::v_execute(boost::any & rv, std::ostream & os,
                                                          ParseCommandInfo const & command)
     const
 {
-    fn_(output, command);
+    fn_(os, command);
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////