scc

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

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:
Msrc/libc/wchar/mbsrtowcs.c | 14+++++++++++---
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; }