summaryrefslogtreecommitdiff
path: root/src/command_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-02-27 06:41:58 +0000
committerMaxime Coste <frrrwww@gmail.com>2014-02-27 06:44:14 +0000
commitaceee75ed943b284fd905c7c522566fb314431e4 (patch)
treeb6e2bb23f960faf918c4b68e10e0589ab1e2a0d6 /src/command_manager.cc
parentb0c290689091e27f177b3f50a748ec7fe3540375 (diff)
Tolerate invalid %...{} when completing
Diffstat (limited to 'src/command_manager.cc')
-rw-r--r--src/command_manager.cc7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc
index 377089e3..0f0b700c 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -137,6 +137,7 @@ String get_until_delimiter(const String& base, ByteCount& pos,
return base.substr(start, pos - start);
}
+template<bool throw_on_invalid>
Token::Type token_type(const String& type_name)
{
if (type_name == "")
@@ -147,8 +148,10 @@ Token::Type token_type(const String& type_name)
return Token::Type::RegisterExpand;
else if (type_name == "opt")
return Token::Type::OptionExpand;
- else
+ else if (throw_on_invalid)
throw unknown_expand{type_name};
+ else
+ return Token::Type::Raw;
}
void skip_blanks_and_comments(const String& base, ByteCount& pos)
@@ -204,7 +207,7 @@ TokenList parse(const String& line)
if (throw_on_unterminated and pos == length)
throw parse_error{"expected a string delimiter after '%" + type_name + "'"};
- Token::Type type = token_type(type_name);
+ Token::Type type = token_type<throw_on_unterminated>(type_name);
static const std::unordered_map<char, char> matching_delimiters = {
{ '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' }
};