diff --git a/include/asm/charmap.hpp b/include/asm/charmap.hpp index ba49c029..8d291b8d 100644 --- a/include/asm/charmap.hpp +++ b/include/asm/charmap.hpp @@ -9,6 +9,7 @@ #define DEFAULT_CHARMAP_NAME "main" struct Charmap *charmap_New(char const *name, char const *baseName); +void charmap_Cleanup(void); void charmap_Set(char const *name); void charmap_Push(void); void charmap_Pop(void); diff --git a/src/asm/charmap.cpp b/src/asm/charmap.cpp index f6b94790..e3cff375 100644 --- a/src/asm/charmap.cpp +++ b/src/asm/charmap.cpp @@ -104,6 +104,19 @@ struct Charmap *charmap_New(char const *name, char const *baseName) return charmap; } +static void freeCharmap(void *_charmap, void *) +{ + struct Charmap *charmap = (struct Charmap *)_charmap; + + free(charmap->name); + free(charmap); +} + +void charmap_Cleanup(void) +{ + hash_ForEach(charmaps, freeCharmap, NULL); +} + void charmap_Set(char const *name) { struct Charmap **charmap = (struct Charmap **)hash_GetNode(charmaps, name); diff --git a/src/asm/main.cpp b/src/asm/main.cpp index f28e4bb0..12e44d92 100644 --- a/src/asm/main.cpp +++ b/src/asm/main.cpp @@ -412,6 +412,9 @@ int main(int argc, char *argv[]) if (yyparse() != 0 && nbErrors == 0) nbErrors = 1; + // Free all charmaps (they're not needed after parsing) + charmap_Cleanup(); + if (dependfile) fclose(dependfile); free(targetFileName); diff --git a/src/link/main.cpp b/src/link/main.cpp index 7ff9fb97..5a31c43b 100644 --- a/src/link/main.cpp +++ b/src/link/main.cpp @@ -193,13 +193,6 @@ static void printUsage(void) stderr); } -// Cleans up what has been done -// Mostly here to please tools such as `valgrind` so actual errors can be seen -static void cleanup(void) -{ - obj_Cleanup(); -} - enum ScrambledRegion { SCRAMBLE_ROMX, SCRAMBLE_SRAM, @@ -465,5 +458,6 @@ int main(int argc, char *argv[]) out_WriteFiles(); // Do cleanup before quitting, though. - cleanup(); + // Mostly here to please tools such as `valgrind` so actual errors can be seen + obj_Cleanup(); }