diff options
Diffstat (limited to 'db/clib/printf.c')
-rw-r--r-- | db/clib/printf.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/db/clib/printf.c b/db/clib/printf.c new file mode 100644 index 000000000..62c1daf0f --- /dev/null +++ b/db/clib/printf.c @@ -0,0 +1,143 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2005-2006 + * Oracle Corporation. All rights reserved. + * + * $Id: printf.c,v 1.5 2006/09/13 19:10:57 bostic Exp $ + */ + +#include "db_config.h" + +#include "db_int.h" + +/* + * printf -- + * + * PUBLIC: #ifndef HAVE_PRINTF + * PUBLIC: int printf __P((const char *, ...)); + * PUBLIC: #endif + */ +#ifndef HAVE_PRINTF +int +#ifdef STDC_HEADERS +printf(const char *fmt, ...) +#else +printf(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + va_list ap; + size_t len; + char buf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */ + +#ifdef STDC_HEADERS + va_start(ap, fmt); +#else + va_start(ap); +#endif + len = (size_t)vsnprintf(buf, sizeof(buf), fmt, ap); +#ifdef HAVE_BREW + /* + * The BREW vsnprintf function return count includes the trailing + * nul-termination character. + */ + if (len > 0 && len <= sizeof(buf) && buf[len - 1] == '\0') + --len; +#endif + + va_end(ap); + + /* + * We implement printf/fprintf with fwrite, because Berkeley DB uses + * fwrite in other places. + */ + return (fwrite( + buf, sizeof(char), (size_t)len, stdout) == len ? (int)len: -1); +} +#endif /* HAVE_PRINTF */ + +/* + * fprintf -- + * + * PUBLIC: #ifndef HAVE_PRINTF + * PUBLIC: int fprintf __P((FILE *, const char *, ...)); + * PUBLIC: #endif + */ +#ifndef HAVE_PRINTF +int +#ifdef STDC_HEADERS +fprintf(FILE *fp, const char *fmt, ...) +#else +fprintf(fp, fmt, va_alist) + FILE *fp; + const char *fmt; + va_dcl +#endif +{ + va_list ap; + size_t len; + char buf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */ + +#ifdef STDC_HEADERS + va_start(ap, fmt); +#else + va_start(ap); +#endif + len = vsnprintf(buf, sizeof(buf), fmt, ap); +#ifdef HAVE_BREW + /* + * The BREW vsnprintf function return count includes the trailing + * nul-termination character. + */ + if (len > 0 && len <= sizeof(buf) && buf[len - 1] == '\0') + --len; +#endif + + va_end(ap); + + /* + * We implement printf/fprintf with fwrite, because Berkeley DB uses + * fwrite in other places. + */ + return (fwrite( + buf, sizeof(char), (size_t)len, fp) == len ? (int)len: -1); +} +#endif /* HAVE_PRINTF */ + +/* + * vfprintf -- + * + * PUBLIC: #ifndef HAVE_PRINTF + * PUBLIC: int vfprintf __P((FILE *, const char *, va_list)); + * PUBLIC: #endif + */ +#ifndef HAVE_PRINTF +int +vfprintf(fp, fmt, ap) + FILE *fp; + const char *fmt; + va_list ap; +{ + size_t len; + char buf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */ + + len = vsnprintf(buf, sizeof(buf), fmt, ap); +#ifdef HAVE_BREW + /* + * The BREW vsnprintf function return count includes the trailing + * nul-termination character. + */ + if (len > 0 && len <= sizeof(buf) && buf[len - 1] == '\0') + --len; +#endif + + /* + * We implement printf/fprintf with fwrite, because Berkeley DB uses + * fwrite in other places. + */ + return (fwrite( + buf, sizeof(char), (size_t)len, fp) == len ? (int)len: -1); +} +#endif /* HAVE_PRINTF */ |