diff --git a/include/asm/charmap.hpp b/include/asm/charmap.hpp index b92e36a2..aa416236 100644 --- a/include/asm/charmap.hpp +++ b/include/asm/charmap.hpp @@ -4,17 +4,18 @@ #define RGBDS_ASM_CHARMAP_H #include +#include #include #define DEFAULT_CHARMAP_NAME "main" -void charmap_New(char const *name, char const *baseName); -void charmap_Set(char const *name); +void charmap_New(std::string const &name, std::string const *baseName); +void charmap_Set(std::string const &name); void charmap_Push(); void charmap_Pop(); -void charmap_Add(char const *mapping, uint8_t value); -bool charmap_HasChar(char const *input); -void charmap_Convert(char const *input, std::vector &output); +void charmap_Add(std::string const &mapping, uint8_t value); +bool charmap_HasChar(std::string const &input); +void charmap_Convert(std::string const &input, std::vector &output); size_t charmap_ConvertNext(char const *&input, std::vector *output); #endif // RGBDS_ASM_CHARMAP_H diff --git a/src/asm/charmap.cpp b/src/asm/charmap.cpp index ec2d08d4..649f79fd 100644 --- a/src/asm/charmap.cpp +++ b/src/asm/charmap.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include "util.hpp" @@ -36,20 +35,20 @@ static std::unordered_map charmaps; static Charmap *currentCharmap; std::stack charmapStack; -void charmap_New(char const *name, char const *baseName) { +void charmap_New(std::string const &name, std::string const *baseName) { Charmap *base = nullptr; if (baseName != nullptr) { - auto search = charmaps.find(baseName); + auto search = charmaps.find(*baseName); if (search == charmaps.end()) - error("Base charmap '%s' doesn't exist\n", baseName); + error("Base charmap '%s' doesn't exist\n", baseName->c_str()); else base = &search->second; } if (charmaps.find(name) != charmaps.end()) { - error("Charmap '%s' already exists\n", name); + error("Charmap '%s' already exists\n", name.c_str()); return; } @@ -65,11 +64,11 @@ void charmap_New(char const *name, char const *baseName) { currentCharmap = &charmap; } -void charmap_Set(char const *name) { +void charmap_Set(std::string const &name) { auto search = charmaps.find(name); if (search == charmaps.end()) - error("Charmap '%s' doesn't exist\n", name); + error("Charmap '%s' doesn't exist\n", name.c_str()); else currentCharmap = &search->second; } @@ -88,12 +87,12 @@ void charmap_Pop() { charmapStack.pop(); } -void charmap_Add(char const *mapping, uint8_t value) { +void charmap_Add(std::string const &mapping, uint8_t value) { Charmap &charmap = *currentCharmap; size_t nodeIdx = 0; - for (; *mapping; mapping++) { - size_t &nextIdxRef = charmap.nodes[nodeIdx].next[(uint8_t)*mapping - 1]; + for (char c : mapping) { + size_t &nextIdxRef = charmap.nodes[nodeIdx].next[(uint8_t)c - 1]; size_t nextIdx = nextIdxRef; if (!nextIdx) { @@ -117,12 +116,12 @@ void charmap_Add(char const *mapping, uint8_t value) { node.value = value; } -bool charmap_HasChar(char const *input) { +bool charmap_HasChar(std::string const &input) { Charmap const &charmap = *currentCharmap; size_t nodeIdx = 0; - for (; *input; input++) { - nodeIdx = charmap.nodes[nodeIdx].next[(uint8_t)*input - 1]; + for (char c : input) { + nodeIdx = charmap.nodes[nodeIdx].next[(uint8_t)c - 1]; if (!nodeIdx) return false; @@ -131,8 +130,9 @@ bool charmap_HasChar(char const *input) { return charmap.nodes[nodeIdx].isTerminal; } -void charmap_Convert(char const *input, std::vector &output) { - while (charmap_ConvertNext(input, &output)) +void charmap_Convert(std::string const &input, std::vector &output) { + char const *ptr = input.c_str(); + while (charmap_ConvertNext(ptr, &output)) ; } diff --git a/src/asm/parser.y b/src/asm/parser.y index 1da30043..53dc634c 100644 --- a/src/asm/parser.y +++ b/src/asm/parser.y @@ -1141,22 +1141,22 @@ incbin: charmap: POP_CHARMAP string COMMA const_8bit { - charmap_Add($2.c_str(), (uint8_t)$4); + charmap_Add($2, (uint8_t)$4); } ; newcharmap: POP_NEWCHARMAP ID { - charmap_New($2.c_str(), nullptr); + charmap_New($2, nullptr); } | POP_NEWCHARMAP ID COMMA ID { - charmap_New($2.c_str(), $4.c_str()); + charmap_New($2, &$4); } ; setcharmap: POP_SETCHARMAP ID { - charmap_Set($2.c_str()); + charmap_Set($2); } ; @@ -1224,7 +1224,7 @@ constlist_8bit_entry: | string { std::vector output; - charmap_Convert($1.c_str(), output); + charmap_Convert($1, output); sect_AbsByteGroup(output.data(), output.size()); } ; @@ -1241,7 +1241,7 @@ constlist_16bit_entry: | string { std::vector output; - charmap_Convert($1.c_str(), output); + charmap_Convert($1, output); sect_AbsWordGroup(output.data(), output.size()); } ; @@ -1258,7 +1258,7 @@ constlist_32bit_entry: | string { std::vector output; - charmap_Convert($1.c_str(), output); + charmap_Convert($1, output); sect_AbsLongGroup(output.data(), output.size()); } ; @@ -1309,7 +1309,7 @@ relocexpr: | string { std::vector output; - charmap_Convert($1.c_str(), output); + charmap_Convert($1, output); rpn_Number($$, str2int2(output)); } ; @@ -1492,7 +1492,7 @@ relocexpr_no_str: rpn_Number($$, charlenUTF8($3)); } | OP_INCHARMAP LPAREN string RPAREN { - rpn_Number($$, charmap_HasChar($3.c_str())); + rpn_Number($$, charmap_HasChar($3)); } | LPAREN relocexpr RPAREN { $$ = std::move($2);