aboutsummaryrefslogtreecommitdiff
path: root/src/system/utf8.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/system/utf8.c')
-rw-r--r--src/system/utf8.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/system/utf8.c b/src/system/utf8.c
index 35b0f2f..201fedf 100644
--- a/src/system/utf8.c
+++ b/src/system/utf8.c
@@ -20,19 +20,31 @@ static inline bool utf8_get_codepoint_length(unsigned char b, size_t *codepoint_
/* TODO: Optimize (remove branching, etc) */
bool mgl_utf8_decode(const unsigned char *str, size_t size, uint32_t *decoded_codepoint, size_t *codepoint_length) {
- if(size == 0)
+ if(size == 0) {
+ *decoded_codepoint = 0;
+ *codepoint_length = 0;
return false;
+ }
size_t clen;
- if(!utf8_get_codepoint_length(str[0], &clen))
+ if(!utf8_get_codepoint_length(str[0], &clen)) {
+ *decoded_codepoint = str[0];
+ *codepoint_length = 1;
return false;
+ }
- if(size < clen)
+ if(size < clen) {
+ *decoded_codepoint = str[0];
+ *codepoint_length = 1;
return false;
+ }
for(size_t i = 1; i < clen; ++i) {
- if((str[i] & 0xC0) != 0x80)
+ if((str[i] & 0xC0) != 0x80) {
+ *decoded_codepoint = str[0];
+ *codepoint_length = 1;
return false;
+ }
}
uint32_t codepoint;