mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +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_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 */
|
||||||
|
|||||||
@@ -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 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.
|
* 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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user