ref: 5108c5643cbcab4463c831c44c83a18298edf4cc
parent: 2005ed1df9a6abfbb693889129af15f78569282e
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Mon Mar 8 11:40:36 EST 2021
Let charmap_ConvertNext advance its output pointer
--- a/include/asm/charmap.h
+++ b/include/asm/charmap.h
@@ -18,6 +18,6 @@
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 */
--- a/src/asm/charmap.c
+++ b/src/asm/charmap.c
@@ -193,18 +193,15 @@
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 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.
@@ -238,12 +235,13 @@
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");
@@ -250,6 +248,8 @@
/* OK because UTF-8 has no NUL in multi-byte chars */
*input += codepointLen;
+ if (output)
+ *output += codepointLen;
return codepointLen;