summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdio/fputws.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdio/fputws.c')
-rw-r--r--newlib/libc/stdio/fputws.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/newlib/libc/stdio/fputws.c b/newlib/libc/stdio/fputws.c
index c88111cb0..0893b3c33 100644
--- a/newlib/libc/stdio/fputws.c
+++ b/newlib/libc/stdio/fputws.c
@@ -84,6 +84,7 @@ _DEFUN(_fputws_r, (ptr, ws, fp),
{
size_t nbytes;
char buf[BUFSIZ];
+#ifdef _FVWRITE_IN_STREAMIO
struct __suio uio;
struct __siov iov;
@@ -108,8 +109,35 @@ _DEFUN(_fputws_r, (ptr, ws, fp),
return (0);
error:
- _newlib_flockfile_end(fp);
+ _newlib_flockfile_end (fp);
return (-1);
+#else
+ _newlib_flockfile_start (fp);
+ ORIENT (fp, 1);
+ if (cantwrite (ptr, fp) != 0)
+ goto error;
+
+ do
+ {
+ size_t i = 0;
+ nbytes = _wcsrtombs_r (ptr, buf, &ws, sizeof (buf), &fp->_mbstate);
+ if (nbytes == (size_t) -1)
+ goto error;
+ while (i < nbytes)
+ {
+ if (__sputc_r (ptr, buf[i], fp) == EOF)
+ goto error;
+ i++;
+ }
+ }
+ while (ws != NULL);
+ _newlib_flockfile_exit (fp);
+ return (0);
+
+error:
+ _newlib_flockfile_end (fp);
+ return (-1);
+#endif
}
int