mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
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:
@@ -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
18
test/asm/nested-if.asm
Normal 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
0
test/asm/nested-if.out
Normal file
0
test/asm/nested-if.out.pipe
Normal file
0
test/asm/nested-if.out.pipe
Normal file
Reference in New Issue
Block a user