summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-08-11 12:13:48 +0200
committerMaxime Coste <frrrwww@gmail.com>2012-08-11 12:13:48 +0200
commit0a976cd309fa2707a784e005ce380e72a8e84a2f (patch)
treea03d626897815efafef9a7c5681c0a05d1791ac6 /src
parent808e79a53edf4b879aaf85a25f0194b9b9712bcf (diff)
CommandManager: support %reg{<reg>} and %opt{<option>} syntax
Diffstat (limited to 'src')
-rw-r--r--src/command_manager.cc19
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);