| /* Copyright (C) 2004       Manuel Novoa III    <mjn3@codepoet.org> | 
 |  * | 
 |  * GNU Library General Public License (LGPL) version 2 or later. | 
 |  * | 
 |  * Dedicated to Toni.  See uClibc/DEDICATION.mjn3 for details. | 
 |  */ | 
 |  | 
 | #include "_stdio.h" | 
 | #include <stdarg.h> | 
 | #include <wchar.h> | 
 |  | 
 |  | 
 | /* NB: this file is not used if __USE_OLD_VFPRINTF__ */ | 
 |  | 
 | #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 /* __UCLIBC_HAS_THREADS__ */ | 
 |  | 
 | 	f.__nextopen = NULL; | 
 |  | 
 | 	if (size > ((SIZE_MAX - (size_t) buf)/sizeof(wchar_t))) { | 
 | 		size = ((SIZE_MAX - (size_t) buf)/sizeof(wchar_t)); | 
 | 	} | 
 |  | 
 | 	f.__bufstart = (unsigned char *) buf; | 
 | 	f.__bufend = (unsigned char *) (buf + size); | 
 | 	__STDIO_STREAM_INIT_BUFREAD_BUFPOS(&f); | 
 | 	__STDIO_STREAM_DISABLE_GETC(&f); | 
 | 	__STDIO_STREAM_DISABLE_PUTC(&f); | 
 |  | 
 | 	rv = _vfwprintf_internal(&f, format, arg); | 
 |  | 
 | 	/* NOTE: Return behaviour differs from snprintf... */ | 
 | 	if (f.__bufpos == f.__bufend) { | 
 | 		rv = -1; | 
 | 		if (size) { | 
 | 			f.__bufpos = (unsigned char *) (((wchar_t *) f.__bufpos) - 1); | 
 | 		} | 
 | 	} | 
 | 	if (size) { | 
 | 		*((wchar_t *) f.__bufpos) = 0; | 
 | 	} | 
 | 	return rv; | 
 | } | 
 | libc_hidden_def(vswprintf) | 
 |  | 
 | #endif /* __STDIO_BUFFERS */ |