commit 1a210c4013e2c6f78fafacc3655b54640541e4a2
parent ec59ea3508bd670fa1743b75d390451cedfb7c1f
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Wed, 9 Nov 2022 20:23:38 +0100
libc/wchar: Fix mbsrtowc()
mbsrtowc() had several problems:
- It added the L'\0' to the count of written characters
- It didn't handled the case of a NULL ps
Diffstat:
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/libc/wchar/mbsrtowcs.c b/src/libc/wchar/mbsrtowcs.c
@@ -9,15 +9,23 @@ mbsrtowcs(wchar_t *restrict dest, const char **restrict src, size_t len,
{
wchar_t wc;
size_t cnt, n;
+ static mbstate_t p;
- for (n = 0; !dest || n < len; n++) {
+ if (!ps)
+ ps = &p;
+
+ for (n = 0; ; n++) {
cnt = mbrtowc(&wc, *src, MB_LEN_MAX, ps);
if (cnt == (size_t) -1)
return -1;
- *src += cnt;
- if (dest)
+ if (dest) {
+ if (n == len)
+ return n;
*dest++ = wc;
+ }
+ *src += cnt;
+
if (wc == L'\0')
break;
}