X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/224c70764cab4e0e39a26aaf3ad3016552f62f55..7b00c0c43f52e9d27168e67a26aac19065cdb40c:/stdio/vsnprintf-fbsd.c diff --git a/stdio/vsnprintf-fbsd.c b/stdio/vsnprintf-fbsd.c index 1a24ce3..5f9a295 100644 --- a/stdio/vsnprintf-fbsd.c +++ b/stdio/vsnprintf-fbsd.c @@ -13,10 +13,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -38,7 +34,7 @@ static char sccsid[] = "@(#)vsnprintf.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include -__FBSDID("$FreeBSD: src/lib/libc/stdio/vsnprintf.c,v 1.22 2003/07/02 07:08:44 jkh Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/stdio/vsnprintf.c,v 1.24 2008/04/17 22:17:54 jhb Exp $"); #include "xlocale_private.h" @@ -47,7 +43,7 @@ __FBSDID("$FreeBSD: src/lib/libc/stdio/vsnprintf.c,v 1.22 2003/07/02 07:08:44 jk #include "local.h" int -vsnprintf(char * __restrict str, size_t n, const char * __restrict fmt, +vsnprintf_l(char * __restrict str, size_t n, locale_t loc, const char * __restrict fmt, __va_list ap) { size_t on; @@ -55,40 +51,8 @@ vsnprintf(char * __restrict str, size_t n, const char * __restrict fmt, char dummy[2]; FILE f; struct __sFILEX ext; - - on = n; - if (n != 0) - n--; - if (n > INT_MAX) - n = INT_MAX; - /* Stdio internals do not deal correctly with zero length buffer */ - if (n == 0) { - if (on > 0) - *str = '\0'; - str = dummy; - n = 1; - } - f._file = -1; - f._flags = __SWR | __SSTR; - f._bf._base = f._p = (unsigned char *)str; - f._bf._size = f._w = n; f._extra = &ext; INITEXTRA(&f); - ret = __vfprintf(&f, __current_locale(), fmt, ap); - if (on > 0) - *f._p = '\0'; - return (ret); -} - -int -vsnprintf_l(char * __restrict str, size_t n, locale_t loc, - const char * __restrict fmt, __va_list ap) -{ - size_t on; - int ret; - char dummy[2]; - FILE f; - struct __sFILEX ext; NORMALIZE_LOCALE(loc); on = n; @@ -107,10 +71,17 @@ vsnprintf_l(char * __restrict str, size_t n, locale_t loc, f._flags = __SWR | __SSTR; f._bf._base = f._p = (unsigned char *)str; f._bf._size = f._w = n; - f._extra = &ext; - INITEXTRA(&f); + f._orientation = 0; + memset(&f._mbstate, 0, sizeof(mbstate_t)); ret = __vfprintf(&f, loc, fmt, ap); if (on > 0) *f._p = '\0'; return (ret); } + +int +vsnprintf(char * __restrict str, size_t n, const char * __restrict fmt, + __va_list ap) +{ + return vsnprintf_l(str, n, __current_locale(), fmt, ap); +}