mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Prevent deletion of built-in symbols
This commit is contained in:
@@ -32,6 +32,7 @@ struct sSymbol {
|
|||||||
enum SymbolType type;
|
enum SymbolType type;
|
||||||
bool isConstant; /* Whether the symbol's value is currently known */
|
bool isConstant; /* Whether the symbol's value is currently known */
|
||||||
bool isExported; /* Whether the symbol is to be exported */
|
bool isExported; /* Whether the symbol is to be exported */
|
||||||
|
bool isBuiltin; /* Whether the symbol is a built-in */
|
||||||
struct sSymbol *pScope;
|
struct sSymbol *pScope;
|
||||||
struct sSymbol *pNext;
|
struct sSymbol *pNext;
|
||||||
struct Section *pSection;
|
struct Section *pSection;
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ static struct sSymbol *createsymbol(char const *s)
|
|||||||
|
|
||||||
(*ppsym)->isConstant = false;
|
(*ppsym)->isConstant = false;
|
||||||
(*ppsym)->isExported = false;
|
(*ppsym)->isExported = false;
|
||||||
|
(*ppsym)->isBuiltin = false;
|
||||||
(*ppsym)->pScope = NULL;
|
(*ppsym)->pScope = NULL;
|
||||||
(*ppsym)->pNext = NULL;
|
(*ppsym)->pNext = NULL;
|
||||||
(*ppsym)->pSection = NULL;
|
(*ppsym)->pSection = NULL;
|
||||||
@@ -231,7 +232,11 @@ void sym_Purge(char const *tzName)
|
|||||||
|
|
||||||
ppSym = findpsymbol(tzName, pscope);
|
ppSym = findpsymbol(tzName, pscope);
|
||||||
|
|
||||||
if (ppSym) {
|
if (!ppSym) {
|
||||||
|
yyerror("'%s' not defined", tzName);
|
||||||
|
} else if ((*ppSym)->isBuiltin) {
|
||||||
|
yyerror("Built-in symbol '%s' cannot be purged", tzName);
|
||||||
|
} else {
|
||||||
struct sSymbol *pSym;
|
struct sSymbol *pSym;
|
||||||
|
|
||||||
pSym = *ppSym;
|
pSym = *ppSym;
|
||||||
@@ -241,8 +246,6 @@ void sym_Purge(char const *tzName)
|
|||||||
free(pSym->pMacro);
|
free(pSym->pMacro);
|
||||||
|
|
||||||
free(pSym);
|
free(pSym);
|
||||||
} else {
|
|
||||||
yyerror("'%s' not defined", tzName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -736,11 +739,16 @@ void sym_Init(void)
|
|||||||
|
|
||||||
pPCSymbol = sym_AddReloc("@");
|
pPCSymbol = sym_AddReloc("@");
|
||||||
pPCSymbol->Callback = CallbackPC;
|
pPCSymbol->Callback = CallbackPC;
|
||||||
|
pPCSymbol->isBuiltin = true;
|
||||||
p_NARGSymbol = sym_AddEqu("_NARG", 0);
|
p_NARGSymbol = sym_AddEqu("_NARG", 0);
|
||||||
p_NARGSymbol->Callback = Callback_NARG;
|
p_NARGSymbol->Callback = Callback_NARG;
|
||||||
|
p_NARGSymbol->isBuiltin = true;
|
||||||
p__LINE__Symbol = sym_AddEqu("__LINE__", 0);
|
p__LINE__Symbol = sym_AddEqu("__LINE__", 0);
|
||||||
p__LINE__Symbol->Callback = Callback__LINE__;
|
p__LINE__Symbol->Callback = Callback__LINE__;
|
||||||
sym_AddSet("_RS", 0);
|
p__LINE__Symbol->isBuiltin = true;
|
||||||
|
struct sSymbol *_RSSymbol = sym_AddSet("_RS", 0);
|
||||||
|
|
||||||
|
_RSSymbol->isBuiltin = true;
|
||||||
|
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
|
|
||||||
@@ -772,17 +780,22 @@ void sym_Init(void)
|
|||||||
strftime(SavedMINUTE, sizeof(SavedMINUTE), "%M", time_utc);
|
strftime(SavedMINUTE, sizeof(SavedMINUTE), "%M", time_utc);
|
||||||
strftime(SavedSECOND, sizeof(SavedSECOND), "%S", time_utc);
|
strftime(SavedSECOND, sizeof(SavedSECOND), "%S", time_utc);
|
||||||
|
|
||||||
sym_AddString("__TIME__", SavedTIME);
|
#define addString(name, val) do { \
|
||||||
sym_AddString("__DATE__", SavedDATE);
|
struct sSymbol *symbol = sym_AddString(name, val); \
|
||||||
sym_AddString("__ISO_8601_LOCAL__", SavedTIMESTAMP_ISO8601_LOCAL);
|
symbol->isBuiltin = true; \
|
||||||
sym_AddString("__ISO_8601_UTC__", SavedTIMESTAMP_ISO8601_UTC);
|
} while (0)
|
||||||
|
addString("__TIME__", SavedTIME);
|
||||||
|
addString("__DATE__", SavedDATE);
|
||||||
|
addString("__ISO_8601_LOCAL__", SavedTIMESTAMP_ISO8601_LOCAL);
|
||||||
|
addString("__ISO_8601_UTC__", SavedTIMESTAMP_ISO8601_UTC);
|
||||||
/* This cannot start with zeros */
|
/* This cannot start with zeros */
|
||||||
sym_AddString("__UTC_YEAR__", SavedYEAR);
|
addString("__UTC_YEAR__", SavedYEAR);
|
||||||
sym_AddString("__UTC_MONTH__", removeLeadingZeros(SavedMONTH));
|
addString("__UTC_MONTH__", removeLeadingZeros(SavedMONTH));
|
||||||
sym_AddString("__UTC_DAY__", removeLeadingZeros(SavedDAY));
|
addString("__UTC_DAY__", removeLeadingZeros(SavedDAY));
|
||||||
sym_AddString("__UTC_HOUR__", removeLeadingZeros(SavedHOUR));
|
addString("__UTC_HOUR__", removeLeadingZeros(SavedHOUR));
|
||||||
sym_AddString("__UTC_MINUTE__", removeLeadingZeros(SavedMINUTE));
|
addString("__UTC_MINUTE__", removeLeadingZeros(SavedMINUTE));
|
||||||
sym_AddString("__UTC_SECOND__", removeLeadingZeros(SavedSECOND));
|
addString("__UTC_SECOND__", removeLeadingZeros(SavedSECOND));
|
||||||
|
#undef addString
|
||||||
|
|
||||||
pScope = NULL;
|
pScope = NULL;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user