template <class ForwardRange>
prefix_ senf::console::GenericNode &
-senf::console::DirectoryNode::traverse(ForwardRange const & range)
+senf::console::DirectoryNode::traverse(ForwardRange const & range, bool autocomplete)
{
typedef typename boost::range_const_iterator<ForwardRange>::type const_iterator;
DirectoryNode::ptr dir (thisptr());
const_iterator i (boost::begin(range));
const_iterator const i_end (boost::end(range));
- if (i != i_end && i->empty()) {
+ if (i != i_end && *i == std::string("")) {
dir = root().thisptr();
++ i;
}
while (i != i_end) {
const_iterator next_i (i);
++ next_i;
- if (*i == "..") {
+ if (*i == std::string("..")) {
dir = dir->parent();
if (! dir)
dir = root().thisptr();
}
- else if (! i->empty() && *i != ".") {
+ else if (*i != std::string("") && *i != std::string(".")) {
+ std::string name (*i);
+ if (! dir->hasChild(name) && autocomplete) {
+ ChildrenRange completions (dir->completions(name));
+ if (completions.size() == 1)
+ name = completions.begin()->first;
+ }
if (next_i == i_end)
- return dir->get(*i);
+ return dir->get(name);
else {
// Why does g++ give an error on this line ???? :
- // dir = dynamic_cast<DirectoryNode&>( dir->get(*i) ).thisptr();
- DirectoryNode & d (dynamic_cast<DirectoryNode&>( dir->get(*i) ));
+ // dir = dynamic_cast<DirectoryNode&>( dir->get(name) ).thisptr();
+ DirectoryNode & d (dynamic_cast<DirectoryNode&>( dir->get(name) ));
dir = d.thisptr();
}
}