1 /* Copyright (C) 2004 Manuel Novoa III <mjn3@codepoet.org> 2 * 3 * GNU Library General Public License (LGPL) version 2 or later. 4 * 5 * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details. 6 */ 7 8 #include "_stdio.h" 9 #include <stdarg.h> 10 #include <wchar.h> 11 12 13 /* NB: this file is not used if __USE_OLD_VFPRINTF__ */ 14 15 #ifndef __STDIO_BUFFERS 16 #warning Skipping vswprintf since no buffering! 17 #else /* __STDIO_BUFFERS */ 18 vswprintf(wchar_t * __restrict buf,size_t size,const wchar_t * __restrict format,va_list arg)19int vswprintf(wchar_t *__restrict buf, size_t size, 20 const wchar_t * __restrict format, va_list arg) 21 { 22 FILE f; 23 int rv; 24 25 f.__filedes = __STDIO_STREAM_FAKE_VSWPRINTF_FILEDES; 26 f.__modeflags = (__FLAG_WIDE|__FLAG_WRITEONLY|__FLAG_WRITING); 27 28 f.__ungot_width[0] = 0; 29 #ifdef __STDIO_MBSTATE 30 __INIT_MBSTATE(&(f.__state)); 31 #endif /* __STDIO_MBSTATE */ 32 33 #ifdef __UCLIBC_HAS_THREADS__ 34 f.__user_locking = 1; /* Set user locking. */ 35 STDIO_INIT_MUTEX(f.__lock); 36 #endif /* __UCLIBC_HAS_THREADS__ */ 37 38 f.__nextopen = NULL; 39 40 if (size > ((SIZE_MAX - (size_t) buf)/sizeof(wchar_t))) { 41 size = ((SIZE_MAX - (size_t) buf)/sizeof(wchar_t)); 42 } 43 44 f.__bufstart = (unsigned char *) buf; 45 f.__bufend = (unsigned char *) (buf + size); 46 __STDIO_STREAM_INIT_BUFREAD_BUFPOS(&f); 47 __STDIO_STREAM_DISABLE_GETC(&f); 48 __STDIO_STREAM_DISABLE_PUTC(&f); 49 50 rv = _vfwprintf_internal(&f, format, arg); 51 52 /* NOTE: Return behaviour differs from snprintf... */ 53 if (f.__bufpos == f.__bufend) { 54 rv = -1; 55 if (size) { 56 f.__bufpos = (unsigned char *) (((wchar_t *) f.__bufpos) - 1); 57 } 58 } 59 if (size) { 60 *((wchar_t *) f.__bufpos) = 0; 61 } 62 return rv; 63 } 64 libc_hidden_def(vswprintf) 65 66 #endif /* __STDIO_BUFFERS */ 67