Fix nested if statements that don't have following whitespace

When trying to skip over nested if statements, if there was no whitespace
after an "if", then that "if" would not be recognized. That's a problem since
"if(" and "if{" are also valid ways to start an if statement. This change
will make it so that they are recognized correctly.
This commit is contained in:
dbrotz
2019-08-29 12:37:59 -07:00
parent 3a1b47129e
commit 8f287eeef9
4 changed files with 26 additions and 2 deletions

View File

@@ -9,6 +9,7 @@
%{
#include <ctype.h>
#include <errno.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -289,16 +290,21 @@ static void copymacro(void)
yyskipbytes(ulNewMacroSize + 4);
}
static bool endsIf(char c)
{
return isWhiteSpace(c) || c == '(' || c == '{';
}
static uint32_t isIf(char *s)
{
return (strncasecmp(s, "IF", 2) == 0)
&& isWhiteSpace(s[-1]) && isWhiteSpace(s[2]);
&& isWhiteSpace(s[-1]) && endsIf(s[2]);
}
static uint32_t isElif(char *s)
{
return (strncasecmp(s, "ELIF", 4) == 0)
&& isWhiteSpace(s[-1]) && isWhiteSpace(s[4]);
&& isWhiteSpace(s[-1]) && endsIf(s[4]);
}
static uint32_t isElse(char *s)

18
test/asm/nested-if.asm Normal file
View File

@@ -0,0 +1,18 @@
if 0
if(1)
endc
if 1
endc
if{x}
endc
endc
if 1
else
if(1)
endc
if 1
endc
if{x}
endc
endc

0
test/asm/nested-if.out Normal file
View File

View File