X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FConsole%2FExecutor.cc;h=3bfa19bd41fd6e972416be3a47e4950647136586;hb=d498c7507e2eaa191e859ae525df97dc257e0d7a;hp=04cb75101467d356125d70b3b19c86902bafcd82;hpb=79e54eda6a7fb5ac3fa5b37f408dd386454c5bbd;p=senf.git diff --git a/Utils/Console/Executor.cc b/Utils/Console/Executor.cc index 04cb751..3bfa19b 100644 --- a/Utils/Console/Executor.cc +++ b/Utils/Console/Executor.cc @@ -41,7 +41,7 @@ namespace { - struct TraverseTokens { + struct TraversTokens { typedef std::string const & result_type; result_type operator()(senf::console::Token const & token) const { return token.value(); @@ -67,6 +67,7 @@ prefix_ std::string senf::console::Executor::cwdPath() { if (skipping()) return ""; + (void) cwd(); // ensure, cwd is live. return "/" + senf::stringJoin( senf::make_transform_range( boost::make_iterator_range(boost::next(cwd_.begin()), cwd_.end()), @@ -95,7 +96,7 @@ prefix_ void senf::console::Executor::execute(std::ostream & output, break; try { // The parser ensures, we have exactly one argument - cd(*command.arguments().begin()); + cd(command.commandPath()); } catch (IgnoreCommandException &) { throw SyntaxErrorException( @@ -107,13 +108,15 @@ prefix_ void senf::console::Executor::execute(std::ostream & output, if (skipping()) break; // The parser ensures, we have either one or no argument - ls( output, - command.tokens().empty() ? command.tokens() : *command.arguments().begin() ); + ls( output, command.commandPath() ); break; case ParseCommandInfo::BuiltinPUSHD : // The parser ensures, we have exactly one argument - pushd( *command.arguments().begin() ); + if (skipping()) + pushd(command.commandPath()); + else + exec(output, command); break; case ParseCommandInfo::BuiltinPOPD : @@ -132,17 +135,16 @@ prefix_ void senf::console::Executor::execute(std::ostream & output, if (skipping()) break; // The parser ensures, we have either one or no arguments - help( output, - command.tokens().empty() ? command.tokens() : *command.arguments().begin() ); + help( output, command.commandPath() ); break; } } - catch (InvalidPathException &) { - throw SyntaxErrorException("invalid path"); + catch (InvalidPathException & ex) { + throw SyntaxErrorException("invalid path") << " '" << ex.path << "'"; } - catch (InvalidDirectoryException &) { - throw SyntaxErrorException("invalid directory"); + catch (InvalidDirectoryException & ex) { + throw SyntaxErrorException("invalid directory") << " '" << ex.path << "'"; } catch (InvalidCommandException &) { throw SyntaxErrorException("invalid command"); @@ -153,17 +155,45 @@ prefix_ void senf::console::Executor::execute(std::ostream & output, prefix_ void senf::console::Executor::exec(std::ostream & output, ParseCommandInfo const & command) { - GenericNode & node ( traverseNode(command.commandPath()) ); - DirectoryNode * dir ( dynamic_cast(&node) ); - if ( dir ) { - if (autocd_ && command.tokens().empty()) { - cd( boost::make_iterator_range( - command.commandPath().begin(), - command.commandPath().end()) ); - } else - throw InvalidCommandException(); - } else { - dynamic_cast(node)(output, command); + try { + GenericNode & node ( traverseNode(command.commandPath()) ); + DirectoryNode * dir ( dynamic_cast(&node) ); + if ( dir ) { + if (! command.tokens().empty()) + throw InvalidCommandException(); + if (command.builtin() == ParseCommandInfo::BuiltinPUSHD) + pushd( command.commandPath() ); + else if (autocd_) { + cd(command.commandPath()); + } + else + throw InvalidCommandException(); + } else { + boost::any rv; + dynamic_cast(node)(rv, output, command); + if (command.builtin() == ParseCommandInfo::BuiltinPUSHD) { + DirectoryNode::ptr rvdir; + try { + rvdir = boost::any_cast(rv); + } + catch (boost::bad_any_cast &) { + throw InvalidCommandException(); + } + Path newDir (cwd_); + newDir.push_back(rvdir); + dirstack_.push_back(Path()); + dirstack_.back().swap(cwd_); + cwd_.swap(newDir); + } + } + } + catch (IgnoreCommandException &) { + if (command.builtin() == ParseCommandInfo::BuiltinPUSHD) { + dirstack_.push_back(Path()); + dirstack_.back().swap(cwd_); + } + else + throw; } } @@ -267,7 +297,10 @@ senf::console::Executor::traverseNode(ParseCommandInfo::TokensRange const & path return dir.back().lock()->get(name); } catch (UnknownNodeNameException &) { - throw InvalidPathException(); + throw InvalidPathException( + senf::stringJoin( + senf::make_transform_range(path, boost::bind(&Token::value, _1)), + "/")); } } @@ -275,10 +308,14 @@ prefix_ void senf::console::Executor::traverseDirectory(ParseCommandInfo::TokensRange const & path, Path & dir) { + std::string errorPath; try { ParseCommandInfo::TokensRange::const_iterator i (path.begin()); ParseCommandInfo::TokensRange::const_iterator const i_end (path.end()); for (; i != i_end; ++i) { + if (i != path.begin()) + errorPath += "/"; + errorPath += i->value(); if (*i == NoneToken()) { if (i == path.begin()) { dir.clear(); @@ -301,10 +338,10 @@ senf::console::Executor::traverseDirectory(ParseCommandInfo::TokensRange const & } } catch (std::bad_cast &) { - throw InvalidDirectoryException(); + throw InvalidDirectoryException(errorPath); } catch (UnknownNodeNameException &) { - throw InvalidDirectoryException(); + throw InvalidDirectoryException(errorPath); } } @@ -319,6 +356,15 @@ prefix_ std::string senf::console::Executor::complete(DirectoryNode & dir, return name; } +prefix_ void senf::console::senf_console_format_value(DirectoryNode::ptr value, + std::ostream & os) +{ + if (value) + os << "path() << "'>"; + else + os << ""; +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "Executor.mpp"