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:
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;
+}