diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2012-08-11 12:13:48 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2012-08-11 12:13:48 +0200 |
| commit | 0a976cd309fa2707a784e005ce380e72a8e84a2f (patch) | |
| tree | a03d626897815efafef9a7c5681c0a05d1791ac6 /src/command_manager.cc | |
| parent | 808e79a53edf4b879aaf85a25f0194b9b9712bcf (diff) | |
CommandManager: support %reg{<reg>} and %opt{<option>} syntax
Diffstat (limited to 'src/command_manager.cc')
| -rw-r--r-- | src/command_manager.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc index f07cebcf..beeb6066 100644 --- a/src/command_manager.cc +++ b/src/command_manager.cc @@ -4,6 +4,7 @@ #include "assert.hh" #include "context.hh" #include "shell_manager.hh" +#include "register_manager.hh" #include <algorithm> @@ -39,6 +40,8 @@ struct Token { Raw, ShellExpand, + RegisterExpand, + OptionExpand, CommandSeparator }; Token() : m_type(Type::Raw) {} @@ -111,6 +114,10 @@ TokenList parse(const String& line, if (type_name == "sh") type = Token::Type::ShellExpand; + if (type_name == "reg") + type = Token::Type::RegisterExpand; + if (type_name == "opt") + type = Token::Type::OptionExpand; static const std::unordered_map<Character, Character> matching_delimiters = { { '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' } @@ -218,6 +225,18 @@ void CommandManager::execute(const String& command_line, if (it == tokens.end()) break; } + if (it->type() == Token::Type::RegisterExpand) + { + if (it->content().length() != 1) + throw runtime_error("wrong register name: " + it->content()); + Register& reg = RegisterManager::instance()[it->content()[0]]; + params.push_back(reg.values(context)[0]); + } + if (it->type() == Token::Type::OptionExpand) + { + const Option& option = context.option_manager()[it->content()]; + params.push_back(option.as_string()); + } if (it->type() == Token::Type::CommandSeparator) { execute_single_command(params, context); |
