summaryrefslogtreecommitdiff
path: root/newlib/libc/stdlib/wcstombs_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdlib/wcstombs_r.c')
-rw-r--r--newlib/libc/stdlib/wcstombs_r.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/newlib/libc/stdlib/wcstombs_r.c b/newlib/libc/stdlib/wcstombs_r.c
new file mode 100644
index 00000000000..69c82d411d4
--- /dev/null
+++ b/newlib/libc/stdlib/wcstombs_r.c
@@ -0,0 +1,32 @@
+#include <stdlib.h>
+
+size_t
+_DEFUN (_wcstombs_r, (reent, s, pwcs, n, state),
+ struct _reent *r _AND
+ char *s _AND
+ const wchar_t *pwcs _AND
+ size_t n _AND
+ int *state)
+{
+ char *ptr = s;
+ size_t max = n;
+ char buff[8];
+ int i, num_to_copy;
+
+ while (n > 0)
+ {
+ int bytes = _wctomb_r (r, buff, *pwcs, state);
+ if (bytes == -1)
+ return -1;
+ num_to_copy = (n > bytes ? bytes : (int)n);
+ for (i = 0; i < num_to_copy; ++i)
+ *ptr++ = buff[i];
+
+ if (*pwcs == 0x00)
+ return ptr - s - (n >= bytes);
+ ++pwcs;
+ n -= num_to_copy;
+ }
+
+ return max;
+}