libc/wchar: Use hidden state in mblen and mbrlen - scc - simple c99 compiler
HTML git clone git://git.simple-cc.org/scc
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 6f13ed360e15b5daa1df2c2de39dc93422db4255
DIR parent abc7bb9f69d648be0457170d1f491594cbb2f7e7
HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date: Thu, 20 Mar 2025 20:07:17 +0100
libc/wchar: Use hidden state in mblen and mbrlen
These functions have a hidden state and they should
behave as if they don't call mbrtowc (not using the
internal hidden state of mbrtowc) and the return value
of mblen() has to be adjusted because it cannot
return -2 in the same way that mbrtowc() does.
Diffstat:
M src/libc/stdlib/mblen.c | 9 ++++++++-
M src/libc/wchar/mbrlen.c | 4 ++++
2 files changed, 12 insertions(+), 1 deletion(-)
---
DIR diff --git a/src/libc/stdlib/mblen.c b/src/libc/stdlib/mblen.c
@@ -1,9 +1,16 @@
#include <stdlib.h>
+#include <wchar.h>
#undef mblen
int
mblen(const char *s, size_t n)
{
- return mbtowc(NULL, s, n);
+ int ret;
+ static mbstate_t st;
+
+ ret = mbrtowc(NULL, s, n, &st);
+ if (ret < 0)
+ ret = -1;
+ return ret;
}
DIR diff --git a/src/libc/wchar/mbrlen.c b/src/libc/wchar/mbrlen.c
@@ -5,5 +5,9 @@
size_t
mbrlen(const char *restrict s, size_t n, mbstate_t *restrict ps)
{
+ static mbstate_t st;
+
+ if (!ps)
+ ps = &st;
return mbrtowc(NULL, s, n, ps);
}