mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Use std::string for PURGE args
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#define RGBDS_SYMBOL_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
@@ -128,7 +129,7 @@ struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body,
|
||||
struct Symbol *sym_Ref(char const *symName);
|
||||
struct Symbol *sym_AddString(char const *symName, char const *value);
|
||||
struct Symbol *sym_RedefString(char const *symName, char const *value);
|
||||
void sym_Purge(char const *symName);
|
||||
void sym_Purge(std::string const &symName);
|
||||
void sym_Init(time_t now);
|
||||
|
||||
// Functions to save and restore the current symbol scope.
|
||||
|
||||
@@ -361,20 +361,13 @@ static void initDsArgList(std::vector<struct Expression> *&args)
|
||||
fatalerror("Failed to allocate memory for ds arg list: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
static void initPurgeArgList(std::vector<char *> *&args)
|
||||
static void initPurgeArgList(std::vector<std::string> *&args)
|
||||
{
|
||||
args = new(std::nothrow) std::vector<char *>();
|
||||
args = new(std::nothrow) std::vector<std::string>();
|
||||
if (!args)
|
||||
fatalerror("Failed to allocate memory for purge arg list: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
static void freePurgeArgList(std::vector<char *> *&args)
|
||||
{
|
||||
for (char *arg : *args)
|
||||
free(arg);
|
||||
delete args;
|
||||
}
|
||||
|
||||
static void failAssert(enum AssertionType type)
|
||||
{
|
||||
switch (type) {
|
||||
@@ -468,7 +461,7 @@ enum {
|
||||
enum AssertionType assertType;
|
||||
struct AlignmentSpec alignSpec;
|
||||
std::vector<struct Expression> *dsArgs;
|
||||
std::vector<char *> *purgeArgs;
|
||||
std::vector<std::string> *purgeArgs;
|
||||
struct ForArgs forArgs;
|
||||
struct StrFmtArgList strfmtArgs;
|
||||
bool captureTerminated;
|
||||
@@ -1235,19 +1228,19 @@ redef_equs : redef_id T_POP_EQUS string { sym_RedefString($1, $3); }
|
||||
purge : T_POP_PURGE {
|
||||
lexer_ToggleStringExpansion(false);
|
||||
} purge_args trailing_comma {
|
||||
for (char *arg : *$3)
|
||||
for (std::string &arg : *$3)
|
||||
sym_Purge(arg);
|
||||
freePurgeArgList($3);
|
||||
delete $3;
|
||||
lexer_ToggleStringExpansion(true);
|
||||
}
|
||||
;
|
||||
|
||||
purge_args : scoped_id {
|
||||
initPurgeArgList($$);
|
||||
$$->push_back(strdup($1));
|
||||
$$->push_back($1);
|
||||
}
|
||||
| purge_args T_COMMA scoped_id {
|
||||
$1->push_back(strdup($3));
|
||||
$1->push_back($3);
|
||||
$$ = $1;
|
||||
}
|
||||
;
|
||||
|
||||
@@ -199,16 +199,16 @@ static bool isReferenced(struct Symbol const *sym)
|
||||
}
|
||||
|
||||
// Purge a symbol
|
||||
void sym_Purge(char const *symName)
|
||||
void sym_Purge(std::string const &symName)
|
||||
{
|
||||
struct Symbol *sym = sym_FindScopedValidSymbol(symName);
|
||||
struct Symbol *sym = sym_FindScopedValidSymbol(symName.c_str());
|
||||
|
||||
if (!sym) {
|
||||
error("'%s' not defined\n", symName);
|
||||
error("'%s' not defined\n", symName.c_str());
|
||||
} else if (sym->isBuiltin) {
|
||||
error("Built-in symbol '%s' cannot be purged\n", symName);
|
||||
error("Built-in symbol '%s' cannot be purged\n", symName.c_str());
|
||||
} else if (isReferenced(sym)) {
|
||||
error("Symbol \"%s\" is referenced and thus cannot be purged\n", symName);
|
||||
error("Symbol \"%s\" is referenced and thus cannot be purged\n", symName.c_str());
|
||||
} else {
|
||||
// Do not keep a reference to the label's name after purging it
|
||||
if (sym->name == labelScope)
|
||||
|
||||
Reference in New Issue
Block a user