CommandManager: fix some crashes
This commit is contained in:
parent
9c78f02903
commit
a19a788b94
|
@ -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,
|
TokenList parse(const String& line,
|
||||||
TokenPosList* opt_token_pos_info = nullptr)
|
TokenPosList* opt_token_pos_info = nullptr)
|
||||||
{
|
{
|
||||||
|
@ -132,12 +138,17 @@ TokenList parse(const String& line,
|
||||||
++pos;
|
++pos;
|
||||||
String type_name = line.substr(type_start, pos - type_start);
|
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")
|
if (type_name == "sh")
|
||||||
type = Token::Type::ShellExpand;
|
type = Token::Type::ShellExpand;
|
||||||
if (type_name == "reg")
|
else if (type_name == "reg")
|
||||||
type = Token::Type::RegisterExpand;
|
type = Token::Type::RegisterExpand;
|
||||||
if (type_name == "opt")
|
else if (type_name == "opt")
|
||||||
type = Token::Type::OptionExpand;
|
type = Token::Type::OptionExpand;
|
||||||
|
else if (type_name != "")
|
||||||
|
throw unknown_expand{type_name};
|
||||||
|
|
||||||
static const std::unordered_map<char, char> matching_delimiters = {
|
static const std::unordered_map<char, char> matching_delimiters = {
|
||||||
{ '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' }
|
{ '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user