commit 5941ba58a5a6a8590c799e02977f4999a30d23e7
parent dcbbe9b3e64a07b1979363c71637d3e72a65a19e
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Sun, 6 Nov 2022 19:16:38 +0100
libc/wchar: Add wcrtomb()
Diffstat:
3 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/src/libc/objs/common-objs.mk b/src/libc/objs/common-objs.mk
@@ -118,4 +118,5 @@ COMMON_OBJS =\
time/tz.$O\
wchar/mbrlen.$O\
wchar/mbrtowc.$O\
+ wchar/wcrtomb.$O\
wchar/wcwidth.$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\
+ wcrtomb.$O\
wcwidth.$O\
all: $(OBJS)
diff --git a/src/libc/wchar/wcrtomb.c b/src/libc/wchar/wcrtomb.c
@@ -0,0 +1,31 @@
+#include <wchar.h>
+
+#undef wcrtomb
+
+size_t
+wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict ps)
+{
+ int i, n;
+ unsigned long c = wc;
+ static unsigned long limits[] = {
+ 0x80, 0x800, 0x10000, 0x200000, 0x4000000
+ };
+
+ if (!s)
+ return 1;
+
+ for (n = 0; n < 5 && c >= limits[n]; ++n)
+ ;
+
+ *s = 0;
+ for (i = 0; i < n; i++) {
+ *s >>= 1;
+ *s |= 0x80;
+
+ s[n-i] = 0x80 | (c & 0x3f);
+ c >>= 6;
+ }
+ *s |= c;
+
+ return n+1;
+}