Fix broken parsing

This commit is contained in:
zawz 2020-11-14 18:23:34 +01:00
parent a71b8d1284
commit 26b21f0214

View file

@ -510,20 +510,20 @@ std::pair<list*, uint32_t> parse_list_until(const char* in, uint32_t size, uint3
{ {
auto pp=parse_condlist(in, size, i); auto pp=parse_condlist(in, size, i);
ret->cls.push_back(pp.first); ret->cls.push_back(pp.first);
if(pp.second < size) i=pp.second;
if(i < size)
{ {
if(in[pp.second] == end_c) // end char, stop here if(in[i] == end_c) // end char, stop here
break; break;
else if(is_in(in[pp.second], COMMAND_SEPARATOR)) // command separator: next char else if(in[i] == '#')
i = skip_unread(in, size, pp.second+1); ; // skip here
else if(is_in(in[pp.second], CONTROL_END)) else if(is_in(in[i], COMMAND_SEPARATOR))
throw PARSE_ERROR(strf("Unexpected token: '%c'", in[pp.second]), pp.second); i++; // skip on next char
else else if(is_in(in[i], CONTROL_END))
i = skip_unread(in, size, pp.second); throw PARSE_ERROR(strf("Unexpected token: '%c'", in[i]), i);
}
else i = skip_unread(in, size, i);
{
i=pp.second;
} }
if(i>=size) if(i>=size)
@ -568,12 +568,19 @@ std::pair<list*, uint32_t> parse_list_until(const char* in, uint32_t size, uint3
// do a parse // do a parse
auto pp=parse_condlist(in, size, i); auto pp=parse_condlist(in, size, i);
ret->cls.push_back(pp.first); ret->cls.push_back(pp.first);
if(is_in(in[pp.second], COMMAND_SEPARATOR)) i=pp.second;
i = skip_unread(in, size, pp.second+1); if(i<size)
else if(is_in(in[pp.second], CONTROL_END)) {
throw PARSE_ERROR(strf("Unexpected token: '%c'", in[pp.second]), pp.second); if(in[i] == '#')
else ; // skip here
i = skip_unread(in, size, pp.second); else if(is_in(in[i], COMMAND_SEPARATOR))
i++;
else if(is_in(in[i], CONTROL_END))
throw PARSE_ERROR(strf("Unexpected token: '%c'", in[i]), i);
i = skip_unread(in, size, i);
}
// word wasn't found // word wasn't found
if(i>=size) if(i>=size)
{ {
@ -627,10 +634,13 @@ std::tuple<list*, uint32_t, std::string> parse_list_until(const char* in, uint32
// do a parse // do a parse
auto pp=parse_condlist(in, size, i); auto pp=parse_condlist(in, size, i);
ret->cls.push_back(pp.first); ret->cls.push_back(pp.first);
if(is_in(in[pp.second], COMMAND_SEPARATOR)) i=pp.second;
i = skip_unread(in, size, pp.second+1); if(in[i] == '#')
else ; // skip here
i = skip_unread(in, size, pp.second); else if(is_in(in[i], COMMAND_SEPARATOR))
i++; // skip on next
i = skip_unread(in, size, i);
// word wasn't found // word wasn't found
if(i>=size) if(i>=size)
{ {