mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Merge pull request #364 from dbrotz/fix-362
Don't append invalid characters to symbol name
This commit is contained in:
@@ -124,19 +124,19 @@ static int32_t ascii2bin(char *s)
|
|||||||
|
|
||||||
uint32_t ParseFixedPoint(char *s, uint32_t size)
|
uint32_t ParseFixedPoint(char *s, uint32_t size)
|
||||||
{
|
{
|
||||||
uint32_t i = 0, dot = 0;
|
uint32_t i;
|
||||||
|
uint32_t dot = 0;
|
||||||
|
|
||||||
while (size && dot != 2) {
|
for (i = 0; i < size; i++) {
|
||||||
if (s[i] == '.')
|
if (s[i] == '.') {
|
||||||
dot += 1;
|
dot++;
|
||||||
|
|
||||||
if (dot < 2) {
|
if (dot == 2)
|
||||||
size -= 1;
|
break;
|
||||||
i += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
yyunputbytes(size);
|
yyskipbytes(i);
|
||||||
|
|
||||||
yylval.nConstValue = (int32_t)(atof(s) * 65536);
|
yylval.nConstValue = (int32_t)(atof(s) * 65536);
|
||||||
|
|
||||||
@@ -147,56 +147,100 @@ uint32_t ParseNumber(char *s, uint32_t size)
|
|||||||
{
|
{
|
||||||
char dest[256];
|
char dest[256];
|
||||||
|
|
||||||
|
if (size > 255)
|
||||||
|
fatalerror("Number token too long");
|
||||||
|
|
||||||
strncpy(dest, s, size);
|
strncpy(dest, s, size);
|
||||||
dest[size] = 0;
|
dest[size] = 0;
|
||||||
yylval.nConstValue = ascii2bin(dest);
|
yylval.nConstValue = ascii2bin(dest);
|
||||||
|
|
||||||
|
yyskipbytes(size);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the symbol name ends before the end of the macro arg, return true
|
||||||
|
* and point "rest" to the rest of the macro arg.
|
||||||
|
* Otherwise, return false.
|
||||||
|
*/
|
||||||
|
bool AppendMacroArg(char whichArg, char *dest, size_t *destIndex, char **rest)
|
||||||
|
{
|
||||||
|
char *marg;
|
||||||
|
|
||||||
|
if (whichArg == '@')
|
||||||
|
marg = sym_FindMacroArg(-1);
|
||||||
|
else if (whichArg >= '0' && whichArg <= '9')
|
||||||
|
marg = sym_FindMacroArg(whichArg - '0');
|
||||||
|
else
|
||||||
|
fatalerror("Malformed ID");
|
||||||
|
|
||||||
|
if (!marg)
|
||||||
|
fatalerror("Macro argument '\\%c' not defined", whichArg);
|
||||||
|
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
while ((ch = *marg) != 0) {
|
||||||
|
if ((ch >= 'a' && ch <= 'z')
|
||||||
|
|| (ch >= 'A' && ch <= 'Z')
|
||||||
|
|| (ch >= '0' && ch <= '9')
|
||||||
|
|| ch == '_'
|
||||||
|
|| ch == '@'
|
||||||
|
|| ch == '#') {
|
||||||
|
if (*destIndex >= MAXSYMLEN)
|
||||||
|
fatalerror("Symbol too long");
|
||||||
|
|
||||||
|
dest[*destIndex] = ch;
|
||||||
|
(*destIndex)++;
|
||||||
|
} else {
|
||||||
|
*rest = marg;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
marg++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t ParseSymbol(char *src, uint32_t size)
|
uint32_t ParseSymbol(char *src, uint32_t size)
|
||||||
{
|
{
|
||||||
char dest[MAXSYMLEN + 1];
|
char dest[MAXSYMLEN + 1];
|
||||||
int32_t copied = 0, size_backup = size;
|
size_t srcIndex = 0;
|
||||||
|
size_t destIndex = 0;
|
||||||
|
char *rest = NULL;
|
||||||
|
|
||||||
while (size && copied < MAXSYMLEN) {
|
while (srcIndex < size) {
|
||||||
if (*src == '\\') {
|
char ch = src[srcIndex++];
|
||||||
char *marg;
|
|
||||||
|
|
||||||
src += 1;
|
if (ch == '\\') {
|
||||||
size -= 1;
|
/*
|
||||||
|
* We don't check if srcIndex is still less than size,
|
||||||
|
* but that can only fail to be true when the
|
||||||
|
* following char is neither '@' nor a digit.
|
||||||
|
* In that case, AppendMacroArg() will catch the error.
|
||||||
|
*/
|
||||||
|
ch = src[srcIndex++];
|
||||||
|
|
||||||
if (*src == '@') {
|
if (AppendMacroArg(ch, dest, &destIndex, &rest))
|
||||||
marg = sym_FindMacroArg(-1);
|
break;
|
||||||
} else if (*src >= '0' && *src <= '9') {
|
|
||||||
marg = sym_FindMacroArg(*src - '0');
|
|
||||||
} else {
|
|
||||||
fatalerror("Malformed ID");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
src += 1;
|
|
||||||
size -= 1;
|
|
||||||
|
|
||||||
if (marg) {
|
|
||||||
while (*marg)
|
|
||||||
dest[copied++] = *marg++;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
dest[copied++] = *src++;
|
if (destIndex >= MAXSYMLEN)
|
||||||
size -= 1;
|
fatalerror("Symbol too long");
|
||||||
|
dest[destIndex++] = ch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copied >= MAXSYMLEN)
|
dest[destIndex] = 0;
|
||||||
fatalerror("Symbol too long");
|
|
||||||
|
|
||||||
dest[copied] = 0;
|
|
||||||
|
|
||||||
if (!oDontExpandStrings && sym_isString(dest)) {
|
if (!oDontExpandStrings && sym_isString(dest)) {
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
yyskipbytes(size_backup);
|
yyskipbytes(srcIndex);
|
||||||
|
|
||||||
|
if (rest)
|
||||||
|
yyunputstr(rest);
|
||||||
|
|
||||||
yyunputstr(s = sym_GetStringValue(dest));
|
yyunputstr(s = sym_GetStringValue(dest));
|
||||||
|
|
||||||
while (*s) {
|
while (*s) {
|
||||||
@@ -206,6 +250,11 @@ uint32_t ParseSymbol(char *src, uint32_t size)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yyskipbytes(srcIndex);
|
||||||
|
|
||||||
|
if (rest)
|
||||||
|
yyunputstr(rest);
|
||||||
|
|
||||||
strcpy(yylval.tzSym, dest);
|
strcpy(yylval.tzSym, dest);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -821,8 +821,6 @@ scanagain:
|
|||||||
goto scanagain;
|
goto scanagain;
|
||||||
}
|
}
|
||||||
|
|
||||||
pLexBuffer += nFloatLen;
|
|
||||||
|
|
||||||
if (token->nToken == T_ID && linestart)
|
if (token->nToken == T_ID && linestart)
|
||||||
return T_LABEL;
|
return T_LABEL;
|
||||||
else
|
else
|
||||||
|
|||||||
27
test/asm/label-macro-arg.asm
Normal file
27
test/asm/label-macro-arg.asm
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
m1: MACRO
|
||||||
|
x\1
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
S EQUS "y"
|
||||||
|
S2 EQUS "yy"
|
||||||
|
|
||||||
|
m2: MACRO
|
||||||
|
S\1
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
m1 = 5
|
||||||
|
m2 = 6
|
||||||
|
m1 x = 7
|
||||||
|
m2 2 = 8
|
||||||
|
|
||||||
|
printv x
|
||||||
|
printt "\n"
|
||||||
|
|
||||||
|
printv y
|
||||||
|
printt "\n"
|
||||||
|
|
||||||
|
printv xx
|
||||||
|
printt "\n"
|
||||||
|
|
||||||
|
printv yy
|
||||||
|
printt "\n"
|
||||||
4
test/asm/label-macro-arg.out
Normal file
4
test/asm/label-macro-arg.out
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
$5
|
||||||
|
$6
|
||||||
|
$7
|
||||||
|
$8
|
||||||
4
test/asm/label-macro-arg.out.pipe
Normal file
4
test/asm/label-macro-arg.out.pipe
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
$5
|
||||||
|
$6
|
||||||
|
$7
|
||||||
|
$8
|
||||||
Reference in New Issue
Block a user