Index: fusl/src/multibyte/mbrtoc16.c |
diff --git a/fusl/src/multibyte/mbrtoc16.c b/fusl/src/multibyte/mbrtoc16.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..765ff9037cd3554db14e275650adb7c807632777 |
--- /dev/null |
+++ b/fusl/src/multibyte/mbrtoc16.c |
@@ -0,0 +1,30 @@ |
+#include <uchar.h> |
+#include <wchar.h> |
+ |
+size_t mbrtoc16(char16_t *restrict pc16, const char *restrict s, size_t n, mbstate_t *restrict ps) |
+{ |
+ static unsigned internal_state; |
+ if (!ps) ps = (void *)&internal_state; |
+ unsigned *pending = (unsigned *)ps; |
+ |
+ if (!s) return mbrtoc16(0, "", 1, ps); |
+ |
+ /* mbrtowc states for partial UTF-8 characters have the high bit set; |
+ * we use nonzero states without high bit for pending surrogates. */ |
+ if ((int)*pending > 0) { |
+ if (pc16) *pc16 = *pending; |
+ *pending = 0; |
+ return -3; |
+ } |
+ |
+ wchar_t wc; |
+ size_t ret = mbrtowc(&wc, s, n, ps); |
+ if (ret <= 4) { |
+ if (wc >= 0x10000) { |
+ *pending = (wc & 0x3ff) + 0xdc00; |
+ wc = 0xd7c0 + (wc >> 10); |
+ } |
+ if (pc16) *pc16 = wc; |
+ } |
+ return ret; |
+} |