summaryrefslogtreecommitdiff
path: root/system/lib/libc/musl/src/multibyte/wcsrtombs.c
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-04-23 18:50:47 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-04-23 18:50:47 -0700
commitf6fa219f1275b8a98c768d1f8593613ed85d5cfe (patch)
tree89b4848d4bd5a1fbdf9100f346c1583c657b341d /system/lib/libc/musl/src/multibyte/wcsrtombs.c
parent430dcb4c1533a7c2e9486a2bcbb4e0bda3025c0c (diff)
parent029c076151fb9cb47c54af53c52870ef0b620c5c (diff)
Merge pull request #1063 from waywardmonkeys/musl-libc1.3.7
Add wchar and multibyte libc functions
Diffstat (limited to 'system/lib/libc/musl/src/multibyte/wcsrtombs.c')
-rw-r--r--system/lib/libc/musl/src/multibyte/wcsrtombs.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/system/lib/libc/musl/src/multibyte/wcsrtombs.c b/system/lib/libc/musl/src/multibyte/wcsrtombs.c
new file mode 100644
index 00000000..d48a65e7
--- /dev/null
+++ b/system/lib/libc/musl/src/multibyte/wcsrtombs.c
@@ -0,0 +1,58 @@
+/*
+ * 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 wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstate_t *restrict st)
+{
+ const wchar_t *ws2;
+ char buf[4];
+ size_t N = n, l;
+ if (!s) {
+ for (n=0, ws2=*ws; *ws2; ws2++) {
+ if (*ws2 >= 0x80u) {
+ l = wcrtomb(buf, *ws2, 0);
+ if (!(l+1)) return -1;
+ n += l;
+ } else n++;
+ }
+ return n;
+ }
+ while (n>=4 && **ws) {
+ if (**ws >= 0x80u) {
+ l = wcrtomb(s, **ws, 0);
+ if (!(l+1)) return -1;
+ s += l;
+ n -= l;
+ } else {
+ *s++ = **ws;
+ n--;
+ }
+ (*ws)++;
+ }
+ while (n && **ws) {
+ if (**ws >= 0x80u) {
+ l = wcrtomb(buf, **ws, 0);
+ if (!(l+1)) return -1;
+ if (l>n) return N-n;
+ wcrtomb(s, **ws, 0);
+ s += l;
+ n -= l;
+ } else {
+ *s++ = **ws;
+ n--;
+ }
+ (*ws)++;
+ }
+ if (n) *s = 0;
+ *ws = 0;
+ return N-n;
+}