CommandManager: support %reg{<reg>} and %opt{<option>} syntax

This commit is contained in:
Maxime Coste 2012-08-11 12:13:48 +02:00
parent 808e79a53e
commit 0a976cd309

View File

@ -4,6 +4,7 @@
#include "assert.hh" #include "assert.hh"
#include "context.hh" #include "context.hh"
#include "shell_manager.hh" #include "shell_manager.hh"
#include "register_manager.hh"
#include <algorithm> #include <algorithm>
@ -39,6 +40,8 @@ struct Token
{ {
Raw, Raw,
ShellExpand, ShellExpand,
RegisterExpand,
OptionExpand,
CommandSeparator CommandSeparator
}; };
Token() : m_type(Type::Raw) {} Token() : m_type(Type::Raw) {}
@ -111,6 +114,10 @@ TokenList parse(const String& line,
if (type_name == "sh") if (type_name == "sh")
type = Token::Type::ShellExpand; 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 = { static const std::unordered_map<Character, Character> matching_delimiters = {
{ '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' } { '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' }
@ -218,6 +225,18 @@ void CommandManager::execute(const String& command_line,
if (it == tokens.end()) if (it == tokens.end())
break; 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) if (it->type() == Token::Type::CommandSeparator)
{ {
execute_single_command(params, context); execute_single_command(params, context);