diff options
Diffstat (limited to 'db/clib/snprintf.c')
-rw-r--r-- | db/clib/snprintf.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/db/clib/snprintf.c b/db/clib/snprintf.c index 6aa9e3ae6..e41272dde 100644 --- a/db/clib/snprintf.c +++ b/db/clib/snprintf.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997, 1998, 1999, 2000 + * Copyright (c) 1996-2003 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: snprintf.c,v 11.5 2000/12/22 19:38:37 bostic Exp $"; +static const char revid[] = "$Id: snprintf.c,v 11.12 2003/05/02 16:10:41 bostic Exp $"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -29,7 +29,7 @@ static const char revid[] = "$Id: snprintf.c,v 11.5 2000/12/22 19:38:37 bostic E */ #ifndef HAVE_SNPRINTF int -#ifdef __STDC__ +#ifdef STDC_HEADERS snprintf(char *str, size_t n, const char *fmt, ...) #else snprintf(str, n, fmt, va_alist) @@ -39,23 +39,36 @@ snprintf(str, n, fmt, va_alist) va_dcl #endif { + static int ret_charpnt = -1; va_list ap; - int rval; + int len; COMPQUIET(n, 0); -#ifdef __STDC__ + + /* + * Some old versions of sprintf return a pointer to the first argument + * instead of a character count. Assume the return value of snprintf, + * vsprintf, etc. will be the same as sprintf, and check the easy one. + * + * We do this test at run-time because it's not a test we can do in a + * cross-compilation environment. + */ + if (ret_charpnt == -1) { + char buf[10]; + + ret_charpnt = + sprintf(buf, "123") != 3 || + sprintf(buf, "123456789") != 9 || + sprintf(buf, "1234") != 4; + } + +#ifdef STDC_HEADERS va_start(ap, fmt); #else va_start(ap); #endif -#ifdef SPRINTF_RET_CHARPNT - (void)vsprintf(str, fmt, ap); + len = vsprintf(str, fmt, ap); va_end(ap); - return (strlen(str)); -#else - rval = vsprintf(str, fmt, ap); - va_end(ap); - return (rval); -#endif + return (ret_charpnt ? (int)strlen(str) : len); } #endif |