diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-03-19 18:58:21 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-03-19 18:58:21 +0100 |
| commit | a19a788b9417c2c11697ea14a8ef6128ac6f8fcf (patch) | |
| tree | ba4d9bfbf9cc9ca4a8bc7620461e0afc4edc5c40 /src/command_manager.cc | |
| parent | 9c78f02903a3d2e0bb7fa94c5393aaba12d3e599 (diff) | |
CommandManager: fix some crashes
Diffstat (limited to 'src/command_manager.cc')
| -rw-r--r-- | src/command_manager.cc | 15 |
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 = { { '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' } |
