summaryrefslogtreecommitdiff
path: root/src/command_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-03-19 18:58:21 +0100
committerMaxime Coste <frrrwww@gmail.com>2013-03-19 18:58:21 +0100
commita19a788b9417c2c11697ea14a8ef6128ac6f8fcf (patch)
treeba4d9bfbf9cc9ca4a8bc7620461e0afc4edc5c40 /src/command_manager.cc
parent9c78f02903a3d2e0bb7fa94c5393aaba12d3e599 (diff)
CommandManager: fix some crashes
Diffstat (limited to 'src/command_manager.cc')
-rw-r--r--src/command_manager.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc
index 1a55a957..7817fe4a 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -85,6 +85,12 @@ struct unterminated_string : parse_error
{}
};
+struct unknown_expand : parse_error
+{
+ unknown_expand(const String& name)
+ : parse_error{"unknown expand '" + name + "'"} {}
+};
+
TokenList parse(const String& line,
TokenPosList* opt_token_pos_info = nullptr)
{
@@ -132,12 +138,17 @@ TokenList parse(const String& line,
++pos;
String type_name = line.substr(type_start, pos - type_start);
+ if (pos == length)
+ throw parse_error{"expected a string delimiter after '%" + type_name + "'"};
+
if (type_name == "sh")
type = Token::Type::ShellExpand;
- if (type_name == "reg")
+ else if (type_name == "reg")
type = Token::Type::RegisterExpand;
- if (type_name == "opt")
+ else if (type_name == "opt")
type = Token::Type::OptionExpand;
+ else if (type_name != "")
+ throw unknown_expand{type_name};
static const std::unordered_map<char, char> matching_delimiters = {
{ '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' }