From 082e680bd54e999f2bb4eb77141958938b1e9ee9 Mon Sep 17 00:00:00 2001 From: Manuel Novoa III Date: Wed, 11 Feb 2004 23:48:50 +0000 Subject: New stdio core. Should be more maintainable. Fixes a couple of bugs. Codepaths streamlined. Improved performance for nonthreaded apps when linked with a thread-enabled libc. Minor iconv bug and some locale/thread related startup issues fixed. These showed up in getting a gcj-compiled java helloworld app running. Removed some old extension functions... _stdio_fdout and _stdio_fsfopen. --- libc/stdio/vswprintf.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 libc/stdio/vswprintf.c (limited to 'libc/stdio/vswprintf.c') diff --git a/libc/stdio/vswprintf.c b/libc/stdio/vswprintf.c new file mode 100644 index 000000000..a5839b7bd --- /dev/null +++ b/libc/stdio/vswprintf.c @@ -0,0 +1,70 @@ +/* Copyright (C) 2004 Manuel Novoa III + * + * GNU Library General Public License (LGPL) version 2 or later. + * + * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details. + */ + +#include "_stdio.h" +#include +#include + +#ifndef __STDIO_BUFFERS +#warning Skipping vswprintf since no buffering! +#else /* __STDIO_BUFFERS */ + +int vswprintf(wchar_t *__restrict buf, size_t size, + const wchar_t * __restrict format, va_list arg) +{ + FILE f; + int rv; + +/* __STDIO_STREAM_RESET_GCS(&f); */ +#ifdef __UCLIBC_HAS_GLIBC_CUSTOM_STREAMS__ + f.__cookie = &(f.__filedes); + f.__gcs.read = NULL; + f.__gcs.write = NULL; + f.__gcs.seek = NULL; + f.__gcs.close = NULL; +#endif + + f.__filedes = __STDIO_STREAM_FAKE_VSWPRINTF_FILEDES; + f.__modeflags = (__FLAG_WIDE|__FLAG_WRITEONLY|__FLAG_WRITING); + + f.__ungot_width[0] = 0; +#ifdef __STDIO_MBSTATE + __INIT_MBSTATE(&(f.__state)); +#endif /* __STDIO_MBSTATE */ + +#ifdef __UCLIBC_HAS_THREADS__ + f.__user_locking = 1; /* Set user locking. */ + __stdio_init_mutex(&f.__lock); +#endif + f.__nextopen = NULL; + + if (size > ((SIZE_MAX - (size_t) buf)/sizeof(wchar_t))) { + size = ((SIZE_MAX - (size_t) buf)/sizeof(wchar_t)); + } + + f.__bufstart = (char *) buf; + f.__bufend = (char *)(buf + size); + __STDIO_STREAM_INIT_BUFREAD_BUFPOS(&f); + __STDIO_STREAM_DISABLE_GETC(&f); + __STDIO_STREAM_DISABLE_PUTC(&f); + + rv = vfwprintf(&f, format, arg); + + /* NOTE: Return behaviour differs from snprintf... */ + if (f.__bufpos == f.__bufend) { + rv = -1; + if (size) { + f.__bufpos = (char *)(((wchar_t *) f.__bufpos) - 1); + } + } + if (size) { + *((wchar_t *) f.__bufpos) = 0; + } + return rv; +} + +#endif /* __STDIO_BUFFERS */ -- cgit v1.2.3