diff options
| author | David Chisnall <theraven@FreeBSD.org> | 2011-11-20 14:45:42 +0000 |
|---|---|---|
| committer | David Chisnall <theraven@FreeBSD.org> | 2011-11-20 14:45:42 +0000 |
| commit | 3c87aa1d3dc1d8dad3efad322852a8e1e76dee55 (patch) | |
| tree | 909189922493cddbeeac84af2e316dc897661311 /lib/libc/stdio/snprintf.c | |
| parent | 9e134d91bf553c39d4590a9e373837326c465758 (diff) | |
Notes
Diffstat (limited to 'lib/libc/stdio/snprintf.c')
| -rw-r--r-- | lib/libc/stdio/snprintf.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/lib/libc/stdio/snprintf.c b/lib/libc/stdio/snprintf.c index e6d7115fb37f..74af42de23a7 100644 --- a/lib/libc/stdio/snprintf.c +++ b/lib/libc/stdio/snprintf.c @@ -2,6 +2,11 @@ * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * * This code is derived from software contributed to Berkeley by * Chris Torek. * @@ -39,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include <limits.h> #include <stdio.h> #include <stdarg.h> +#include "xlocale_private.h" #include "local.h" @@ -59,7 +65,32 @@ snprintf(char * __restrict str, size_t n, char const * __restrict fmt, ...) f._flags = __SWR | __SSTR; f._bf._base = f._p = (unsigned char *)str; f._bf._size = f._w = n; - ret = __vfprintf(&f, fmt, ap); + ret = __vfprintf(&f, __get_locale(), fmt, ap); + if (on > 0) + *f._p = '\0'; + va_end(ap); + return (ret); +} +int +snprintf_l(char * __restrict str, size_t n, locale_t locale, + char const * __restrict fmt, ...) +{ + size_t on; + int ret; + va_list ap; + FILE f = FAKE_FILE; + FIX_LOCALE(locale); + + on = n; + if (n != 0) + n--; + if (n > INT_MAX) + n = INT_MAX; + va_start(ap, fmt); + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *)str; + f._bf._size = f._w = n; + ret = __vfprintf(&f, locale, fmt, ap); if (on > 0) *f._p = '\0'; va_end(ap); |
