scc

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

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