Let charmap_ConvertNext advance its output pointer

This commit is contained in:
Rangi
2021-03-08 16:40:36 -05:00
committed by Rangi
parent 2005ed1df9
commit 5108c5643c
2 changed files with 11 additions and 11 deletions

View File

@@ -18,6 +18,6 @@ void charmap_Push(void);
void charmap_Pop(void); void charmap_Pop(void);
void charmap_Add(char *mapping, uint8_t value); void charmap_Add(char *mapping, uint8_t value);
size_t charmap_Convert(char const *input, uint8_t *output); size_t charmap_Convert(char const *input, uint8_t *output);
size_t charmap_ConvertNext(char const **input, uint8_t *output); size_t charmap_ConvertNext(char const **input, uint8_t **output);
#endif /* RGBDS_ASM_CHARMAP_H */ #endif /* RGBDS_ASM_CHARMAP_H */

View File

@@ -193,18 +193,15 @@ void charmap_Add(char *mapping, uint8_t value)
size_t charmap_Convert(char const *input, uint8_t *output) size_t charmap_Convert(char const *input, uint8_t *output)
{ {
size_t outputLen = 0; uint8_t *start = output;
for (size_t charLen = charmap_ConvertNext(&input, output); charLen; while (charmap_ConvertNext(&input, &output))
charLen = charmap_ConvertNext(&input, output)) { ;
output += charLen;
outputLen += charLen;
}
return outputLen; return output - start;
} }
size_t charmap_ConvertNext(char const **input, uint8_t *output) size_t charmap_ConvertNext(char const **input, uint8_t **output)
{ {
/* /*
* The goal is to match the longest mapping possible. * The goal is to match the longest mapping possible.
@@ -238,18 +235,21 @@ size_t charmap_ConvertNext(char const **input, uint8_t *output)
if (match) { /* Arrived at a dead end with a match found */ if (match) { /* Arrived at a dead end with a match found */
if (output) if (output)
*output = match->value; *(*output)++ = match->value;
return 1; return 1;
} else if (**input) { /* No match found */ } else if (**input) { /* No match found */
size_t codepointLen = readUTF8Char(output, *input); size_t codepointLen = readUTF8Char(output ? *output : NULL,
*input);
if (codepointLen == 0) if (codepointLen == 0)
error("Input string is not valid UTF-8!\n"); error("Input string is not valid UTF-8!\n");
/* OK because UTF-8 has no NUL in multi-byte chars */ /* OK because UTF-8 has no NUL in multi-byte chars */
*input += codepointLen; *input += codepointLen;
if (output)
*output += codepointLen;
return codepointLen; return codepointLen;