scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/libc/objs/common-objs.mk | 1+
Msrc/libc/wchar/Makefile | 1+
Asrc/libc/wchar/mbsrtowcs.c | 27+++++++++++++++++++++++++++
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; +}