mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Let charmap_ConvertNext advance its output pointer
This commit is contained in:
@@ -18,6 +18,6 @@ void charmap_Push(void);
|
||||
void charmap_Pop(void);
|
||||
void charmap_Add(char *mapping, uint8_t value);
|
||||
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 */
|
||||
|
||||
@@ -193,18 +193,15 @@ void charmap_Add(char *mapping, uint8_t value)
|
||||
|
||||
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;
|
||||
charLen = charmap_ConvertNext(&input, output)) {
|
||||
output += charLen;
|
||||
outputLen += charLen;
|
||||
while (charmap_ConvertNext(&input, &output))
|
||||
;
|
||||
|
||||
return output - start;
|
||||
}
|
||||
|
||||
return outputLen;
|
||||
}
|
||||
|
||||
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.
|
||||
@@ -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 (output)
|
||||
*output = match->value;
|
||||
*(*output)++ = match->value;
|
||||
|
||||
return 1;
|
||||
|
||||
} else if (**input) { /* No match found */
|
||||
size_t codepointLen = readUTF8Char(output, *input);
|
||||
size_t codepointLen = readUTF8Char(output ? *output : NULL,
|
||||
*input);
|
||||
|
||||
if (codepointLen == 0)
|
||||
error("Input string is not valid UTF-8!\n");
|
||||
|
||||
/* OK because UTF-8 has no NUL in multi-byte chars */
|
||||
*input += codepointLen;
|
||||
if (output)
|
||||
*output += codepointLen;
|
||||
|
||||
return codepointLen;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user