1 /* Copyright (C) 2004 Manuel Novoa III <mjn3@codepoet.org>
3 * GNU Library General Public License (LGPL) version 2 or later.
5 * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details.
13 /* NB: this file is not used if __USE_OLD_VFPRINTF__ */
15 #ifndef __STDIO_BUFFERS
16 #warning Skipping vswprintf since no buffering!
17 #else /* __STDIO_BUFFERS */
19 int vswprintf(wchar_t *__restrict buf
, size_t size
,
20 const wchar_t * __restrict format
, va_list arg
)
25 f
.__filedes
= __STDIO_STREAM_FAKE_VSWPRINTF_FILEDES
;
26 f
.__modeflags
= (__FLAG_WIDE
|__FLAG_WRITEONLY
|__FLAG_WRITING
);
28 f
.__ungot_width
[0] = 0;
29 #ifdef __STDIO_MBSTATE
30 __INIT_MBSTATE(&(f
.__state
));
31 #endif /* __STDIO_MBSTATE */
33 #ifdef __UCLIBC_HAS_THREADS__
34 f
.__user_locking
= 1; /* Set user locking. */
35 STDIO_INIT_MUTEX(f
.__lock
);
36 #endif /* __UCLIBC_HAS_THREADS__ */
40 if (size
> ((SIZE_MAX
- (size_t) buf
)/sizeof(wchar_t))) {
41 size
= ((SIZE_MAX
- (size_t) buf
)/sizeof(wchar_t));
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
);
50 rv
= _vfwprintf_internal(&f
, format
, arg
);
52 /* NOTE: Return behaviour differs from snprintf... */
53 if (f
.__bufpos
== f
.__bufend
) {
56 f
.__bufpos
= (unsigned char *) (((wchar_t *) f
.__bufpos
) - 1);
60 *((wchar_t *) f
.__bufpos
) = 0;
64 libc_hidden_def(vswprintf
)
66 #endif /* __STDIO_BUFFERS */