commit b5a0cabe41c035760e6adc34c5e1dd031ac34d03
parent 8a590d4b21a22baaacf934ece3f0372e6b72faba
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Sun, 6 Nov 2022 22:01:25 +0100
libc/wchar: Add mbsrtowcs()
Diffstat:
3 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/src/libc/objs/common-objs.mk b/src/libc/objs/common-objs.mk
@@ -119,6 +119,7 @@ COMMON_OBJS =\
time/tz.$O\
wchar/mbrlen.$O\
wchar/mbrtowc.$O\
+ wchar/mbsrtowcs.$O\
wchar/wcrtomb.$O\
wchar/wcwidth.$O\
wchar/_validutf8.$O\
diff --git a/src/libc/wchar/Makefile b/src/libc/wchar/Makefile
@@ -6,6 +6,7 @@ include ../rules.mk
OBJS =\
mbrlen.$O\
mbrtowc.$O\
+ mbsrtowcs.$O\
wcrtomb.$O\
wcwidth.$O\
_validutf8.$O\
diff --git a/src/libc/wchar/mbsrtowcs.c b/src/libc/wchar/mbsrtowcs.c
@@ -0,0 +1,27 @@
+#include <limits.h>
+#include <wchar.h>
+
+#undef mbsrtowcs
+
+size_t
+mbsrtowcs(wchar_t *restrict dest, const char **restrict src, size_t len,
+ mbstate_t *restrict ps)
+{
+ wchar_t wc;
+ size_t cnt, n;
+
+ for (n = 0; !dest || n < len; n++) {
+ cnt = mbrtowc(&wc, *src, MB_LEN_MAX, ps);
+ if (cnt == (size_t) -1)
+ return -1;
+ *src += cnt;
+
+ if (dest)
+ *dest++ = wc;
+ if (wc == L'\0')
+ break;
+ }
+ *src = NULL;
+
+ return n;
+}