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)19 int 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