aboutsummaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
Diffstat (limited to 'system')
-rw-r--r--system/lib/libc.symbols162
-rw-r--r--system/lib/libc/musl/memcpy.c29
-rw-r--r--system/lib/libc/musl/readme.txt1
-rw-r--r--system/lib/libc/musl/src/internal/libc.c22
-rw-r--r--system/lib/libc/musl/src/internal/libc.h71
-rw-r--r--system/lib/libc/musl/src/multibyte/btowc.c7
-rw-r--r--system/lib/libc/musl/src/multibyte/internal.c38
-rw-r--r--system/lib/libc/musl/src/multibyte/internal.h22
-rw-r--r--system/lib/libc/musl/src/multibyte/mblen.c17
-rw-r--r--system/lib/libc/musl/src/multibyte/mbrlen.c18
-rw-r--r--system/lib/libc/musl/src/multibyte/mbrtowc.c57
-rw-r--r--system/lib/libc/musl/src/multibyte/mbsinit.c17
-rw-r--r--system/lib/libc/musl/src/multibyte/mbsnrtowcs.c65
-rw-r--r--system/lib/libc/musl/src/multibyte/mbsrtowcs.c100
-rw-r--r--system/lib/libc/musl/src/multibyte/mbstowcs.c7
-rw-r--r--system/lib/libc/musl/src/multibyte/mbtowc.c53
-rw-r--r--system/lib/libc/musl/src/multibyte/wcrtomb.c38
-rw-r--r--system/lib/libc/musl/src/multibyte/wcsnrtombs.c52
-rw-r--r--system/lib/libc/musl/src/multibyte/wcsrtombs.c58
-rw-r--r--system/lib/libc/musl/src/multibyte/wcstombs.c7
-rw-r--r--system/lib/libc/musl/src/multibyte/wctob.c8
-rw-r--r--system/lib/libc/musl/src/multibyte/wctomb.c18
-rw-r--r--system/lib/libc/musl/src/string/wcpcpy.c6
-rw-r--r--system/lib/libc/musl/src/string/wcpncpy.c6
-rw-r--r--system/lib/libc/musl/src/string/wcscasecmp.c7
-rw-r--r--system/lib/libc/musl/src/string/wcscasecmp_l.c6
-rw-r--r--system/lib/libc/musl/src/string/wcscat.c7
-rw-r--r--system/lib/libc/musl/src/string/wcschr.c8
-rw-r--r--system/lib/libc/musl/src/string/wcscmp.c7
-rw-r--r--system/lib/libc/musl/src/string/wcscpy.c8
-rw-r--r--system/lib/libc/musl/src/string/wcscspn.c10
-rw-r--r--system/lib/libc/musl/src/string/wcsdup.c11
-rw-r--r--system/lib/libc/musl/src/string/wcslen.c8
-rw-r--r--system/lib/libc/musl/src/string/wcsncasecmp.c9
-rw-r--r--system/lib/libc/musl/src/string/wcsncasecmp_l.c6
-rw-r--r--system/lib/libc/musl/src/string/wcsncat.c10
-rw-r--r--system/lib/libc/musl/src/string/wcsncmp.c7
-rw-r--r--system/lib/libc/musl/src/string/wcsncpy.c9
-rw-r--r--system/lib/libc/musl/src/string/wcsnlen.c8
-rw-r--r--system/lib/libc/musl/src/string/wcspbrk.c7
-rw-r--r--system/lib/libc/musl/src/string/wcsrchr.c8
-rw-r--r--system/lib/libc/musl/src/string/wcsspn.c8
-rw-r--r--system/lib/libc/musl/src/string/wcsstr.c108
-rw-r--r--system/lib/libc/musl/src/string/wcstok.c12
-rw-r--r--system/lib/libc/musl/src/string/wcswcs.c6
-rw-r--r--system/lib/libc/musl/src/string/wmemchr.c8
-rw-r--r--system/lib/libc/musl/src/string/wmemcmp.c8
-rw-r--r--system/lib/libc/musl/src/string/wmemcpy.c9
-rw-r--r--system/lib/libc/musl/src/string/wmemmove.c12
-rw-r--r--system/lib/libc/musl/src/string/wmemset.c9
-rw-r--r--system/lib/libcextra.symbols48
51 files changed, 1133 insertions, 110 deletions
diff --git a/system/lib/libc.symbols b/system/lib/libc.symbols
index 96e995cf..1b126abf 100644
--- a/system/lib/libc.symbols
+++ b/system/lib/libc.symbols
@@ -1,81 +1,81 @@
-_ZNKSt20bad_array_new_length4whatEv
-_ZNKSt9bad_alloc4whatEv
-_ZNSt20bad_array_new_lengthC1Ev
-_ZNSt20bad_array_new_lengthC2Ev
-_ZNSt20bad_array_new_lengthD0Ev
-_ZNSt20bad_array_new_lengthD1Ev
-_ZNSt20bad_array_new_lengthD2Ev
-_ZNSt9bad_allocC1Ev
-_ZNSt9bad_allocC2Ev
-_ZNSt9bad_allocD0Ev
-_ZNSt9bad_allocD1Ev
-_ZNSt9bad_allocD2Ev
-_ZSt15get_new_handlerv
-_ZSt15set_new_handlerPFvvE
-_ZSt17__throw_bad_allocv
-_ZSt7nothrow
-_ZTISt20bad_array_new_length
-_ZTISt9bad_alloc
-_ZTSSt20bad_array_new_length
-_ZTSSt9bad_alloc
-_ZTVSt20bad_array_new_length
-_ZTVSt9bad_alloc
-_ZdaPv
-_ZdaPvRKSt9nothrow_t
-_ZdlPv
-_ZdlPvRKSt9nothrow_t
-_Znaj
-_ZnajRKSt9nothrow_t
-_Znwj
-_ZnwjRKSt9nothrow_t
-_err
-_errx
-_verr
-_verrx
-_vwarn
-_vwarnx
-_warn
-_warnx
-atof
-bulk_free
-calloc
-err
-errx
-free
-getopt
-getopt_long
-getopt_long_only
-independent_calloc
-independent_comalloc
-mallinfo
-malloc
-malloc_footprint
-malloc_footprint_limit
-malloc_max_footprint
-malloc_set_footprint_limit
-malloc_stats
-malloc_trim
-malloc_usable_size
-mallopt
-memalign
-optarg
-opterr
-optind
-optopt
-optreset
-posix_memalign
-pvalloc
-realloc
-realloc_in_place
-strtod
-strtod_l
-strtof
-strtold
-strtold_l
-valloc
-verr
-verrx
-vwarn
-vwarnx
-warn1
-warnx
+ T _ZNKSt20bad_array_new_length4whatEv
+ T _ZNKSt9bad_alloc4whatEv
+ T _ZNSt20bad_array_new_lengthC1Ev
+ T _ZNSt20bad_array_new_lengthC2Ev
+ T _ZNSt20bad_array_new_lengthD0Ev
+ ? _ZNSt20bad_array_new_lengthD1Ev
+ T _ZNSt20bad_array_new_lengthD2Ev
+ T _ZNSt9bad_allocC1Ev
+ T _ZNSt9bad_allocC2Ev
+ T _ZNSt9bad_allocD0Ev
+ T _ZNSt9bad_allocD1Ev
+ T _ZNSt9bad_allocD2Ev
+ T _ZSt15get_new_handlerv
+ T _ZSt15set_new_handlerPFvvE
+ T _ZSt17__throw_bad_allocv
+ D _ZSt7nothrow
+ D _ZTISt20bad_array_new_length
+ D _ZTISt9bad_alloc
+ D _ZTSSt20bad_array_new_length
+ D _ZTSSt9bad_alloc
+ D _ZTVSt20bad_array_new_length
+ D _ZTVSt9bad_alloc
+ W _ZdaPv
+ W _ZdaPvRKSt9nothrow_t
+ W _ZdlPv
+ W _ZdlPvRKSt9nothrow_t
+ W _Znaj
+ W _ZnajRKSt9nothrow_t
+ W _Znwj
+ W _ZnwjRKSt9nothrow_t
+ T _err
+ T _errx
+ T _verr
+ T _verrx
+ T _vwarn
+ T _vwarnx
+ T _warn
+ T _warnx
+ T atof
+ W bulk_free
+ W calloc
+ W err
+ W errx
+ W free
+ T getopt
+ T getopt_long
+ T getopt_long_only
+ W independent_calloc
+ W independent_comalloc
+ W mallinfo
+ W malloc
+ W malloc_footprint
+ W malloc_footprint_limit
+ W malloc_max_footprint
+ W malloc_set_footprint_limit
+ W malloc_stats
+ W malloc_trim
+ T malloc_usable_size
+ W mallopt
+ W memalign
+ C optarg
+ D opterr
+ D optind
+ D optopt
+ C optreset
+ W posix_memalign
+ W pvalloc
+ W realloc
+ W realloc_in_place
+ T strtod
+ T strtod_l
+ T strtof
+ T strtold
+ T strtold_l
+ W valloc
+ W verr
+ W verrx
+ W vwarn
+ W vwarnx
+ W warn1
+ W warnx
diff --git a/system/lib/libc/musl/memcpy.c b/system/lib/libc/musl/memcpy.c
deleted file mode 100644
index 8e98302f..00000000
--- a/system/lib/libc/musl/memcpy.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <string.h>
-#include <stdlib.h>
-#include <stdint.h>
-
-#define SS (sizeof(size_t))
-#define ALIGN (sizeof(size_t)-1)
-#define ONES ((size_t)-1/UCHAR_MAX)
-
-void *memcpy(void *restrict dest, const void *restrict src, size_t n)
-{
- unsigned char *d = dest;
- const unsigned char *s = src;
-
- if (((uintptr_t)d & ALIGN) != ((uintptr_t)s & ALIGN))
- goto misaligned;
-
- for (; ((uintptr_t)d & ALIGN) && n; n--) *d++ = *s++;
- if (n) {
- size_t *wd = (void *)d;
- const size_t *ws = (const void *)s;
-
- for (; n>=SS; n-=SS) *wd++ = *ws++;
- d = (void *)wd;
- s = (const void *)ws;
-misaligned:
- for (; n; n--) *d++ = *s++;
- }
- return dest;
-}
diff --git a/system/lib/libc/musl/readme.txt b/system/lib/libc/musl/readme.txt
new file mode 100644
index 00000000..0df3429d
--- /dev/null
+++ b/system/lib/libc/musl/readme.txt
@@ -0,0 +1 @@
+These sources were downloaded from the musl-0.9.10 release on April 14, 2003.
diff --git a/system/lib/libc/musl/src/internal/libc.c b/system/lib/libc/musl/src/internal/libc.c
new file mode 100644
index 00000000..942f6b44
--- /dev/null
+++ b/system/lib/libc/musl/src/internal/libc.c
@@ -0,0 +1,22 @@
+#include "libc.h"
+
+#ifdef USE_LIBC_ACCESSOR
+struct __libc *__libc_loc()
+{
+ static struct __libc __libc;
+ return &__libc;
+}
+#else
+struct __libc __libc;
+#endif
+
+#ifdef BROKEN_VISIBILITY
+__asm__(".hidden __libc");
+#endif
+
+size_t __hwcap;
+size_t __sysinfo;
+char *__progname=0, *__progname_full=0;
+
+weak_alias(__progname, program_invocation_short_name);
+weak_alias(__progname_full, program_invocation_name);
diff --git a/system/lib/libc/musl/src/internal/libc.h b/system/lib/libc/musl/src/internal/libc.h
new file mode 100644
index 00000000..c9416f07
--- /dev/null
+++ b/system/lib/libc/musl/src/internal/libc.h
@@ -0,0 +1,71 @@
+#ifndef LIBC_H
+#define LIBC_H
+
+#include <stdlib.h>
+#include <stdio.h>
+
+struct __libc {
+ void *main_thread;
+ int threaded;
+ int secure;
+ size_t *auxv;
+ int (*atexit)(void (*)(void));
+ void (*fini)(void);
+ void (*ldso_fini)(void);
+ volatile int threads_minus_1;
+ int canceldisable;
+ FILE *ofl_head;
+ int ofl_lock[2];
+ size_t tls_size;
+};
+
+extern size_t __hwcap;
+
+#if !defined(__PIC__) || (100*__GNUC__+__GNUC_MINOR__ >= 303 && !defined(__PCC__))
+
+#ifdef __PIC__
+#if __GNUC__ < 4
+#define BROKEN_VISIBILITY 1
+#endif
+#define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden")))
+#else
+#define ATTR_LIBC_VISIBILITY
+#endif
+
+extern struct __libc __libc ATTR_LIBC_VISIBILITY;
+#define libc __libc
+
+#else
+
+#define USE_LIBC_ACCESSOR
+#define ATTR_LIBC_VISIBILITY
+extern struct __libc *__libc_loc(void) __attribute__((const));
+#define libc (*__libc_loc())
+
+#endif
+
+
+/* Designed to avoid any overhead in non-threaded processes */
+void __lock(volatile int *) ATTR_LIBC_VISIBILITY;
+void __unlock(volatile int *) ATTR_LIBC_VISIBILITY;
+int __lockfile(FILE *) ATTR_LIBC_VISIBILITY;
+void __unlockfile(FILE *) ATTR_LIBC_VISIBILITY;
+#define LOCK(x) (libc.threads_minus_1 ? (__lock(x),1) : ((void)(x),1))
+#define UNLOCK(x) (libc.threads_minus_1 ? (__unlock(x),1) : ((void)(x),1))
+
+void __synccall(void (*)(void *), void *);
+int __setxid(int, int, int, int);
+
+extern char **__environ;
+
+#undef weak_alias
+#define weak_alias(old, new) \
+ extern __typeof(old) new __attribute__((weak, alias(#old)))
+
+#undef LFS64_2
+#define LFS64_2(x, y) weak_alias(x, y)
+
+#undef LFS64
+#define LFS64(x) LFS64_2(x, x##64)
+
+#endif
diff --git a/system/lib/libc/musl/src/multibyte/btowc.c b/system/lib/libc/musl/src/multibyte/btowc.c
new file mode 100644
index 00000000..9d2c3b16
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/btowc.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include <wchar.h>
+
+wint_t btowc(int c)
+{
+ return c<128U ? c : EOF;
+}
diff --git a/system/lib/libc/musl/src/multibyte/internal.c b/system/lib/libc/musl/src/multibyte/internal.c
new file mode 100644
index 00000000..ab22806e
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/internal.c
@@ -0,0 +1,38 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <inttypes.h>
+
+#include "internal.h"
+
+#define C(x) ( x<2 ? -1 : ( R(0x80,0xc0) | x ) )
+#define D(x) C((x+16))
+#define E(x) ( ( x==0 ? R(0xa0,0xc0) : \
+ x==0xd ? R(0x80,0xa0) : \
+ R(0x80,0xc0) ) \
+ | ( R(0x80,0xc0) >> 6 ) \
+ | x )
+#define F(x) ( ( x>=5 ? 0 : \
+ x==0 ? R(0x90,0xc0) : \
+ x==4 ? R(0x80,0xa0) : \
+ R(0x80,0xc0) ) \
+ | ( R(0x80,0xc0) >> 6 ) \
+ | ( R(0x80,0xc0) >> 12 ) \
+ | x )
+
+const uint32_t bittab[] = {
+ C(0x2),C(0x3),C(0x4),C(0x5),C(0x6),C(0x7),
+ C(0x8),C(0x9),C(0xa),C(0xb),C(0xc),C(0xd),C(0xe),C(0xf),
+ D(0x0),D(0x1),D(0x2),D(0x3),D(0x4),D(0x5),D(0x6),D(0x7),
+ D(0x8),D(0x9),D(0xa),D(0xb),D(0xc),D(0xd),D(0xe),D(0xf),
+ E(0x0),E(0x1),E(0x2),E(0x3),E(0x4),E(0x5),E(0x6),E(0x7),
+ E(0x8),E(0x9),E(0xa),E(0xb),E(0xc),E(0xd),E(0xe),E(0xf),
+ F(0x0),F(0x1),F(0x2),F(0x3),F(0x4)
+};
+
+#ifdef BROKEN_VISIBILITY
+__asm__(".hidden __fsmu8");
+#endif
diff --git a/system/lib/libc/musl/src/multibyte/internal.h b/system/lib/libc/musl/src/multibyte/internal.h
new file mode 100644
index 00000000..25ba240e
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/internal.h
@@ -0,0 +1,22 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#define bittab __fsmu8
+
+#include "libc.h"
+
+extern const uint32_t bittab[] ATTR_LIBC_VISIBILITY;
+
+/* Upper 6 state bits are a negative integer offset to bound-check next byte */
+/* equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f */
+#define OOB(c,b) (((((b)>>3)-0x10)|(((b)>>3)+((int32_t)(c)>>26))) & ~7)
+
+/* Interval [a,b). Either a must be 80 or b must be c0, lower 3 bits clear. */
+#define R(a,b) ((uint32_t)((a==0x80 ? 0x40-b : -a) << 23))
+#define FAILSTATE R(0x80,0x80)
+
+#define SA 0xc2u
+#define SB 0xf4u
diff --git a/system/lib/libc/musl/src/multibyte/mblen.c b/system/lib/libc/musl/src/multibyte/mblen.c
new file mode 100644
index 00000000..26d35649
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mblen.c
@@ -0,0 +1,17 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "internal.h"
+
+int mblen(const char *s, size_t n)
+{
+ return mbtowc(0, s, n);
+}
diff --git a/system/lib/libc/musl/src/multibyte/mbrlen.c b/system/lib/libc/musl/src/multibyte/mbrlen.c
new file mode 100644
index 00000000..c9714ef8
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mbrlen.c
@@ -0,0 +1,18 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "internal.h"
+
+size_t mbrlen(const char *restrict s, size_t n, mbstate_t *restrict st)
+{
+ static unsigned internal;
+ return mbrtowc(0, s, n, st ? st : (mbstate_t *)&internal);
+}
diff --git a/system/lib/libc/musl/src/multibyte/mbrtowc.c b/system/lib/libc/musl/src/multibyte/mbrtowc.c
new file mode 100644
index 00000000..db803661
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mbrtowc.c
@@ -0,0 +1,57 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "internal.h"
+
+size_t mbrtowc(wchar_t *restrict wc, const char *restrict src, size_t n, mbstate_t *restrict st)
+{
+ static unsigned internal_state;
+ unsigned c;
+ const unsigned char *s = (const void *)src;
+ const unsigned N = n;
+
+ if (!st) st = (void *)&internal_state;
+ c = *(unsigned *)st;
+
+ if (!s) {
+ if (c) goto ilseq;
+ return 0;
+ } else if (!wc) wc = (void *)&wc;
+
+ if (!n) return -2;
+ if (!c) {
+ if (*s < 0x80) return !!(*wc = *s);
+ if (*s-SA > SB-SA) goto ilseq;
+ c = bittab[*s++-SA]; n--;
+ }
+
+ if (n) {
+ if (OOB(c,*s)) goto ilseq;
+loop:
+ c = c<<6 | *s++-0x80; n--;
+ if (!(c&(1U<<31))) {
+ *(unsigned *)st = 0;
+ *wc = c;
+ return N-n;
+ }
+ if (n) {
+ if (*s-0x80u >= 0x40) goto ilseq;
+ goto loop;
+ }
+ }
+
+ *(unsigned *)st = c;
+ return -2;
+ilseq:
+ *(unsigned *)st = 0;
+ errno = EILSEQ;
+ return -1;
+}
diff --git a/system/lib/libc/musl/src/multibyte/mbsinit.c b/system/lib/libc/musl/src/multibyte/mbsinit.c
new file mode 100644
index 00000000..c0e7e494
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mbsinit.c
@@ -0,0 +1,17 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "internal.h"
+
+int mbsinit(const mbstate_t *st)
+{
+ return !st || !*(unsigned *)st;
+}
diff --git a/system/lib/libc/musl/src/multibyte/mbsnrtowcs.c b/system/lib/libc/musl/src/multibyte/mbsnrtowcs.c
new file mode 100644
index 00000000..33457f95
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mbsnrtowcs.c
@@ -0,0 +1,65 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <wchar.h>
+#include <errno.h>
+#include <stdio.h>
+
+#include "internal.h"
+
+size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, size_t wn, mbstate_t *restrict st)
+{
+ size_t l, cnt=0, n2;
+ wchar_t *ws, wbuf[256];
+ const char *s = *src;
+
+ if (!wcs) ws = wbuf, wn = sizeof wbuf / sizeof *wbuf;
+ else ws = wcs;
+
+ /* making sure output buffer size is at most n/4 will ensure
+ * that mbsrtowcs never reads more than n input bytes. thus
+ * we can use mbsrtowcs as long as it's practical.. */
+
+ while ( s && wn && ( (n2=n/4)>=wn || n2>32 ) ) {
+ if (n2>=wn) n2=wn;
+ n -= n2;
+ l = mbsrtowcs(ws, &s, n2, st);
+ if (!(l+1)) {
+ cnt = l;
+ wn = 0;
+ break;
+ }
+ if (ws != wbuf) {
+ ws += l;
+ wn -= l;
+ }
+ cnt += l;
+ }
+ if (s) while (wn && n) {
+ l = mbrtowc(ws, s, n, st);
+ if (l+2<=2) {
+ if (!(l+1)) {
+ cnt = l;
+ break;
+ }
+ if (!l) {
+ s = 0;
+ break;
+ }
+ /* have to roll back partial character */
+ *(unsigned *)st = 0;
+ break;
+ }
+ s += l; n -= l;
+ /* safe - this loop runs fewer than sizeof(wbuf)/8 times */
+ ws++; wn--;
+ cnt++;
+ }
+ if (wcs) *src = s;
+ return cnt;
+}
diff --git a/system/lib/libc/musl/src/multibyte/mbsrtowcs.c b/system/lib/libc/musl/src/multibyte/mbsrtowcs.c
new file mode 100644
index 00000000..75a493c4
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mbsrtowcs.c
@@ -0,0 +1,100 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "internal.h"
+
+size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbstate_t *restrict st)
+{
+ const unsigned char *s = (const void *)*src;
+ size_t wn0 = wn;
+ unsigned c = 0;
+
+ if (st && (c = *(unsigned *)st)) {
+ if (ws) {
+ *(unsigned *)st = 0;
+ goto resume;
+ } else {
+ goto resume0;
+ }
+ }
+
+ if (!ws) for (;;) {
+ if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
+ while (!(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
+ s += 4;
+ wn -= 4;
+ }
+ }
+ if (*s-1u < 0x7f) {
+ s++;
+ wn--;
+ continue;
+ }
+ if (*s-SA > SB-SA) break;
+ c = bittab[*s++-SA];
+resume0:
+ if (OOB(c,*s)) { s--; break; }
+ s++;
+ if (c&(1U<<25)) {
+ if (*s-0x80u >= 0x40) { s-=2; break; }
+ s++;
+ if (c&(1U<<19)) {
+ if (*s-0x80u >= 0x40) { s-=3; break; }
+ s++;
+ }
+ }
+ wn--;
+ c = 0;
+ } else for (;;) {
+ if (!wn) return wn0;
+ if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
+ while (wn>=4 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
+ *ws++ = *s++;
+ *ws++ = *s++;
+ *ws++ = *s++;
+ *ws++ = *s++;
+ wn -= 4;
+ }
+ }
+ if (*s-1u < 0x7f) {
+ *ws++ = *s++;
+ wn--;
+ continue;
+ }
+ if (*s-SA > SB-SA) break;
+ c = bittab[*s++-SA];
+resume:
+ if (OOB(c,*s)) { s--; break; }
+ c = (c<<6) | *s++-0x80;
+ if (c&(1U<<31)) {
+ if (*s-0x80u >= 0x40) { s-=2; break; }
+ c = (c<<6) | *s++-0x80;
+ if (c&(1U<<31)) {
+ if (*s-0x80u >= 0x40) { s-=3; break; }
+ c = (c<<6) | *s++-0x80;
+ }
+ }
+ *ws++ = c;
+ wn--;
+ c = 0;
+ }
+
+ if (!c && !*s) {
+ if (ws) {
+ *ws = 0;
+ *src = 0;
+ }
+ return wn0-wn;
+ }
+ errno = EILSEQ;
+ if (ws) *src = (const void *)s;
+ return -1;
+}
diff --git a/system/lib/libc/musl/src/multibyte/mbstowcs.c b/system/lib/libc/musl/src/multibyte/mbstowcs.c
new file mode 100644
index 00000000..dc0d4594
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mbstowcs.c
@@ -0,0 +1,7 @@
+#include <stdlib.h>
+#include <wchar.h>
+
+size_t mbstowcs(wchar_t *restrict ws, const char *restrict s, size_t wn)
+{
+ return mbsrtowcs(ws, (void*)&s, wn, 0);
+}
diff --git a/system/lib/libc/musl/src/multibyte/mbtowc.c b/system/lib/libc/musl/src/multibyte/mbtowc.c
new file mode 100644
index 00000000..ec9e54ad
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/mbtowc.c
@@ -0,0 +1,53 @@
+/*
+ * This code was written by Rich Felker in 2010; no copyright is claimed.
+ * This code is in the public domain. Attribution is appreciated but
+ * unnecessary.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "internal.h"
+#include <stdio.h>
+int mbtowc(wchar_t *restrict wc, const char *restrict src, size_t n)
+{
+ unsigned c;
+ const unsigned char *s = (const void *)src;
+
+ if (!s) return 0;
+ if (!n) goto ilseq;
+ if (!wc) wc = (void *)&wc;
+
+ if (*s < 0x80) return !!(*wc = *s);
+ if (*s-SA > SB-SA) goto ilseq;
+ c = bittab[*s++-SA];
+
+ /* Avoid excessive checks against n: If shifting the state n-1
+ * times does not clear the high bit, then the value of n is
+ * insufficient to read a character */
+ if (n<4 && ((c<<(6*n-6)) & (1U<<31))) goto ilseq;
+
+ if (OOB(c,*s)) goto ilseq;
+ c = c<<6 | *s++-0x80;
+ if (!(c&(1U<<31))) {
+ *wc = c;
+ return 2;
+ }
+
+ if (*s-0x80u >= 0x40) goto ilseq;
+ c = c<<6 | *s++-0x80;
+ if (!(c&(1U<<31))) {
+ *wc = c;
+ return 3;
+ }
+
+ if (*s-0x80u >= 0x40) goto ilseq;
+ *wc = c<<6 | *s++-0x80;
+ return 4;
+
+ilseq:
+ errno = EILSEQ;
+ return -1;
+}
diff --git a/system/lib/libc/musl/src/multibyte/wcrtomb.c b/system/lib/libc/musl/src/multibyte/wcrtomb.c
new f