diff options
Diffstat (limited to 'bdb/clib/snprintf.c')
-rw-r--r-- | bdb/clib/snprintf.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/bdb/clib/snprintf.c b/bdb/clib/snprintf.c index 6aa9e3ae66c..fa1a63425e8 100644 --- a/bdb/clib/snprintf.c +++ b/bdb/clib/snprintf.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997, 1998, 1999, 2000 + * Copyright (c) 1996-2002 * 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.10 2002/01/11 15:51:28 bostic Exp $"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -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); + + /* + * 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__ 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 |