scc

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

commit 0b0912907edf1f93e405cb9ba00f8b6a146d09b5
parent d45d56e1f22b2acc7e7fe9ca996b426ac6da438d
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sun,  6 Nov 2022 14:30:15 +0100

libc/wchar: Add mbrtowc()

Diffstat:
Msrc/libc/objs/common-objs.mk | 1+
Msrc/libc/stdlib/mbtowc.c | 32++------------------------------
Msrc/libc/wchar/Makefile | 1+
Asrc/libc/wchar/mbrtowc.c | 39+++++++++++++++++++++++++++++++++++++++
4 files changed, 43 insertions(+), 30 deletions(-)

diff --git a/src/libc/objs/common-objs.mk b/src/libc/objs/common-objs.mk @@ -116,4 +116,5 @@ COMMON_OBJS =\ time/mktime.$O\ time/strftime.$O\ time/tz.$O\ + wchar/mbrtowc.$O\ wchar/wcwidth.$O\ diff --git a/src/libc/stdlib/mbtowc.c b/src/libc/stdlib/mbtowc.c @@ -1,38 +1,10 @@ #include <stdlib.h> +#include <wchar.h> #undef mbtowc int mbtowc(wchar_t *restrict pwc, const char *restrict s, size_t n) { - unsigned char *t = (unsigned char *) s; - unsigned long wc; - unsigned c; - size_t i, len; - - if (s == NULL) - return 0; - - wc = c = *t++; - for (len = 0; n > 0 && c & 0x80; --n, ++len) - c <<= 1; - if (n == 0 || len == 1 || len == 8) - return -1; - if (len == 0) - goto return_code; - - wc = (c & 0xFF) >> len; - for (i = 0; i < len-1; i++) { - if (((c = *t++) & 0xC0) != 0x80) - return -1; - wc <<= 6; - wc |= c & 0x3F; - } - -return_code: - if (pwc) - *pwc = wc; - if (*s == '\0') - return 0; - return t - (unsigned char *) s; + return mbrtowc(pwc, s, n, NULL); } diff --git a/src/libc/wchar/Makefile b/src/libc/wchar/Makefile @@ -4,6 +4,7 @@ include $(PROJECTDIR)/scripts/rules.mk include ../rules.mk OBJS =\ + mbrtowc.$O\ wcwidth.$O\ all: $(OBJS) diff --git a/src/libc/wchar/mbrtowc.c b/src/libc/wchar/mbrtowc.c @@ -0,0 +1,39 @@ +#include <wchar.h> + +#undef mbrtowc + +size_t +mbrtowc(wchar_t *restrict pwc, const char *restrict s, size_t n, + mbstate_t *restrict ps) +{ + unsigned char *t = (unsigned char *) s; + unsigned long wc; + unsigned c; + size_t i, len; + + if (s == NULL) + return 0; + + wc = c = *t++; + for (len = 0; n > 0 && c & 0x80; --n, ++len) + c <<= 1; + if (n == 0 || len == 1 || len == 8) + return -1; + if (len == 0) + goto return_code; + + wc = (c & 0xFF) >> len; + for (i = 0; i < len-1; i++) { + if (((c = *t++) & 0xC0) != 0x80) + return -1; + wc <<= 6; + wc |= c & 0x3F; + } + +return_code: + if (pwc) + *pwc = wc; + if (*s == '\0') + return 0; + return t - (unsigned char *) s; +}