From 106005004ec79d27c897a338a80eca8941208914 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 28 Oct 1998 04:06:43 +0000 Subject: [PATCH] fixed handling of %.0f in replacement snprintf.c --- lib/snprintf.c | 70 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/lib/snprintf.c b/lib/snprintf.c index 98c189c3..d51627a1 100644 --- a/lib/snprintf.c +++ b/lib/snprintf.c @@ -48,16 +48,20 @@ * missing. Some systems only have snprintf() but not vsnprintf(), so * the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF. * + * Andrew Tridgell (tridge@samba.anu.edu.au) Oct 1998 + * fixed handling of %.0f + * added test for HAVE_LONG_DOUBLE + * **************************************************************/ #include "config.h" -#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) - #include # include #include +#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) + /* Define this as a fall through, HAVE_STDARG_H is probably already set */ #define HAVE_VARARGS_H @@ -84,6 +88,12 @@ # endif #endif +#ifdef HAVE_LONG_DOUBLE +#define LDOUBLE long double +#else +#define LDOUBLE double +#endif + /*int snprintf (char *str, size_t count, const char *fmt, ...);*/ /*int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);*/ @@ -94,7 +104,7 @@ static void fmtstr (char *buffer, size_t *currlen, size_t maxlen, static void fmtint (char *buffer, size_t *currlen, size_t maxlen, long value, int base, int min, int max, int flags); static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, - long double fvalue, int min, int max, int flags); + LDOUBLE fvalue, int min, int max, int flags); static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c ); /* @@ -132,7 +142,7 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args) { char ch; long value; - long double fvalue; + LDOUBLE fvalue; char *strvalue; int min; int max; @@ -297,7 +307,7 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args) break; case 'f': if (cflags == DP_C_LDOUBLE) - fvalue = va_arg (args, long double); + fvalue = va_arg (args, LDOUBLE); else fvalue = va_arg (args, double); /* um, floating point? */ @@ -307,7 +317,7 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args) flags |= DP_F_UP; case 'e': if (cflags == DP_C_LDOUBLE) - fvalue = va_arg (args, long double); + fvalue = va_arg (args, LDOUBLE); else fvalue = va_arg (args, double); break; @@ -315,7 +325,7 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args) flags |= DP_F_UP; case 'g': if (cflags == DP_C_LDOUBLE) - fvalue = va_arg (args, long double); + fvalue = va_arg (args, LDOUBLE); else fvalue = va_arg (args, double); break; @@ -474,8 +484,8 @@ static void fmtint (char *buffer, size_t *currlen, size_t maxlen, spadlen = -spadlen; /* Left Justifty */ #ifdef DEBUG_SNPRINTF - dprint (1, (debugfile, "zpad: %d, spad: %d, min: %d, max: %d, place: %d\n", - zpadlen, spadlen, min, max, place)); + printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n", + zpadlen, spadlen, min, max, place); #endif /* Spaces */ @@ -510,9 +520,9 @@ static void fmtint (char *buffer, size_t *currlen, size_t maxlen, } } -static long double abs_val (long double value) +static LDOUBLE abs_val (LDOUBLE value) { - long double result = value; + LDOUBLE result = value; if (value < 0) result = -value; @@ -520,9 +530,9 @@ static long double abs_val (long double value) return result; } -static long double pow10 (int exp) +static LDOUBLE pow10 (int exp) { - long double result = 1; + LDOUBLE result = 1; while (exp) { @@ -533,7 +543,7 @@ static long double pow10 (int exp) return result; } -static long round (long double value) +static long round (LDOUBLE value) { long intpart; @@ -546,10 +556,10 @@ static long round (long double value) } static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, - long double fvalue, int min, int max, int flags) + LDOUBLE fvalue, int min, int max, int flags) { int signvalue = 0; - long double ufvalue; + LDOUBLE ufvalue; char iconvert[20]; char fconvert[20]; int iplace = 0; @@ -603,7 +613,8 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, } #ifdef DEBUG_SNPRINTF - dprint (1, (debugfile, "fmtfp: %f =? %d.%d\n", fvalue, intpart, fracpart)); + printf("fmtfp: %g %d.%d min=%d max=%d\n", + (double)fvalue, intpart, fracpart, min, max); #endif /* Convert integer part */ @@ -659,14 +670,21 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, while (iplace > 0) dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]); + +#ifdef DEBUG_SNPRINTF + printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen); +#endif + /* * Decimal point. This should probably use locale to find the correct * char to print out. */ - dopr_outch (buffer, currlen, maxlen, '.'); + if (max > 0) { + dopr_outch (buffer, currlen, maxlen, '.'); - while (fplace > 0) - dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]); + while (fplace > 0) + dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]); + } while (zpadlen > 0) { @@ -721,6 +739,12 @@ int snprintf (va_alist) va_dcl return(strlen(str)); } + +#else + /* keep compilers happy about empty files */ + void dummy_snprintf(void) {} +#endif /* !HAVE_SNPRINTF */ + #ifdef TEST_SNPRINTF #ifndef LONG_STRING #define LONG_STRING 1024 @@ -741,6 +765,8 @@ int main (void) "%4f", "%3.1f", "%3.2f", + "%.0f", + "%.1f", NULL }; double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, @@ -795,7 +821,3 @@ int main (void) } #endif /* SNPRINTF_TEST */ -#else - /* keep compilers happy about empty files */ - void dummy_snprintf(void) {} -#endif /* !HAVE_SNPRINTF */ -- 2.34.1