summaryrefslogtreecommitdiffstats
path: root/libc/stdio/vdprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/stdio/vdprintf.c')
-rw-r--r--libc/stdio/vdprintf.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/libc/stdio/vdprintf.c b/libc/stdio/vdprintf.c
index 67adf47be..de54a5c7d 100644
--- a/libc/stdio/vdprintf.c
+++ b/libc/stdio/vdprintf.c
@@ -11,7 +11,9 @@
#include "_stdio.h"
#include <stdarg.h>
+#ifdef __USE_OLD_VFPRINTF__
libc_hidden_proto(vfprintf)
+#endif
libc_hidden_proto(fflush_unlocked)
libc_hidden_proto(vdprintf)
@@ -22,8 +24,8 @@ int vdprintf(int filedes, const char * __restrict format, va_list arg)
#ifdef __STDIO_BUFFERS
char buf[64]; /* TODO: provide _optional_ buffering? */
- f.__bufend = buf + sizeof(buf);
- f.__bufstart = buf;
+ f.__bufend = (unsigned char *) buf + sizeof(buf);
+ f.__bufstart = (unsigned char *) buf;
__STDIO_STREAM_DISABLE_GETC(&f);
__STDIO_STREAM_DISABLE_PUTC(&f);
__STDIO_STREAM_INIT_BUFREAD_BUFPOS(&f);
@@ -48,17 +50,19 @@ int vdprintf(int filedes, const char * __restrict format, va_list arg)
__INIT_MBSTATE(&(f.__state));
#endif /* __STDIO_MBSTATE */
-#ifdef __UCLIBC_HAS_THREADS__
+/* _vfprintf_internal doesn't do any locking, locking init is here
+ * only because of fflush_unlocked. TODO? */
+#if (defined(__STDIO_BUFFERS) || defined(__USE_OLD_VFPRINTF__)) && defined(__UCLIBC_HAS_THREADS__)
f.__user_locking = 1; /* Set user locking. */
-#ifdef __USE_STDIO_FUTEXES__
- _IO_lock_init (f._lock);
-#else
- __stdio_init_mutex(&f.__lock);
-#endif
+ STDIO_INIT_MUTEX(f.__lock);
#endif
f.__nextopen = NULL;
+#ifdef __USE_OLD_VFPRINTF__
rv = vfprintf(&f, format, arg);
+#else
+ rv = _vfprintf_internal(&f, format, arg);
+#endif
#ifdef __STDIO_BUFFERS
/* If not buffering, then fflush is unnecessary. */