From 5926d50e2c6ccea1609ccc6530a196627cd8a9bf Mon Sep 17 00:00:00 2001 From: whydoubt Date: Sat, 19 Mar 2005 12:37:11 +0000 Subject: [PATCH] Clean up printing of floating-point values --- src/libmdb/Makefile.am | 2 +- src/libmdb/data.c | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/libmdb/Makefile.am b/src/libmdb/Makefile.am index 4f9cc98..c1bd022 100644 --- a/src/libmdb/Makefile.am +++ b/src/libmdb/Makefile.am @@ -2,4 +2,4 @@ lib_LTLIBRARIES = libmdb.la libmdb_la_SOURCES= catalog.c mem.c file.c kkd.c table.c data.c dump.c backend.c money.c sargs.c index.c like.c write.c stats.c map.c props.c worktable.c options.c iconv.c libmdb_la_LDFLAGS = -version-info 1:0:0 AM_CPPFLAGS = -I$(top_srcdir)/include $(GLIB_CFLAGS) -LIBS = $(GLIB_LIBS) @LIBS@ -lm +LIBS = $(GLIB_LIBS) @LIBS@ diff --git a/src/libmdb/data.c b/src/libmdb/data.c index 9662f20..173a3bc 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -693,10 +693,16 @@ static int trim_trailing_zeros(char * buff) char *p; int n = strlen(buff); + /* Don't need to trim strings with no decimal portion */ + if(!strchr(buff,'.')) + return 0; + + /* Trim the zeros */ p = buff + n - 1; while (p >= buff && *p == '0') *p-- = '\0'; + /* If a decimal sign is left at the end, remove it too */ if (*p == '.') *p = '\0'; @@ -761,7 +767,36 @@ mdb_date_to_string(MdbHandle *mdb, int start) return text; } - + +int floor_log10(double f, int is_single) +{ + unsigned int i; + double y = 10.0; + + if (f < 0.0) + f = -f; + + if ((f == 0.0) || (f == 1.0)) { + return 0; + } else if (f < 1.0) { + if (is_single) { + /* The intermediate value p is necessary to prevent + * promotion of the comparison to type double */ + float p; + for (i=1; (p = f * y) < 1.0; i++) + y *= 10.0; + } else { + for (i=1; f * y < 1.0; i++) + y *= 10.0; + } + return -(int)i; + } else { /* (x > 1.0) */ + for (i=0; f >= y; i++) + y *= 10.0; + return (int)i; + } +} + char *mdb_col_to_string(MdbHandle *mdb, unsigned char *buf, int start, int datatype, int size) { char *text; @@ -787,13 +822,13 @@ char *mdb_col_to_string(MdbHandle *mdb, unsigned char *buf, int start, int datat case MDB_FLOAT: tf = mdb_get_single(mdb->pg_buf, start); text = g_strdup_printf("%.*f", - FLT_DIG - (int)ceil(log10(tf)), tf); + FLT_DIG - floor_log10(tf,1) - 1, tf); trim_trailing_zeros(text); break; case MDB_DOUBLE: td = mdb_get_double(mdb->pg_buf, start); text = g_strdup_printf("%.*f", - DBL_DIG - (int)ceil(log10(td)), td); + DBL_DIG - floor_log10(td,0) - 1, td); trim_trailing_zeros(text); break; case MDB_TEXT: