summaryrefslogtreecommitdiff
path: root/profile.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2015-03-17 22:54:21 +0200
committerArnold D. Robbins <arnold@skeeve.com>2015-03-17 22:54:21 +0200
commit603eb56251817ac19491b7671ed01402b2d7399c (patch)
tree0cd41c369f4e81c0d6bc6142ddd15e44483a87f5 /profile.c
parent22af5b89f1f31f31b53ef2dd17637ed77353e762 (diff)
parentcd2ff61aaf4938092517880ad7655828d99a3cb9 (diff)
downloadgawk-603eb56251817ac19491b7671ed01402b2d7399c.tar.gz
Merge branch 'master' into wasted-byte
Diffstat (limited to 'profile.c')
-rw-r--r--profile.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/profile.c b/profile.c
index 42fce626..ddbf8ed1 100644
--- a/profile.c
+++ b/profile.c
@@ -1390,16 +1390,30 @@ pp_number(NODE *n)
{
#define PP_PRECISION 6
char *str;
+ size_t count;
- emalloc(str, char *, PP_PRECISION + 10, "pp_number");
#ifdef HAVE_MPFR
- if (is_mpg_float(n))
- mpfr_sprintf(str, "%0.*R*g", PP_PRECISION, ROUND_MODE, n->mpg_numbr);
- else if (is_mpg_integer(n))
+ if (is_mpg_float(n)) {
+ count = mpfr_get_prec(n->mpg_numbr) / 3; /* ~ 3.22 binary digits per decimal digit */
+ emalloc(str, char *, count, "pp_number");
+ /*
+ * 3/2015: Format string used to be "%0.*R*g". That padded
+ * with leading zeros. But it doesn't do that for regular
+ * numbers in the non-MPFR case.
+ */
+ mpfr_sprintf(str, "%.*R*g", PP_PRECISION, ROUND_MODE, n->mpg_numbr);
+ } else if (is_mpg_integer(n)) {
+ count = mpz_sizeinbase(n->mpg_i, 10) + 2; /* +1 for sign, +1 for NUL at end */
+ emalloc(str, char *, count, "pp_number");
mpfr_sprintf(str, "%Zd", n->mpg_i);
- else
+ } else
#endif
- sprintf(str, "%0.*g", PP_PRECISION, n->numbr);
+ {
+ count = PP_PRECISION + 10;
+ emalloc(str, char *, count, "pp_number");
+ sprintf(str, "%0.*g", PP_PRECISION, n->numbr);
+ }
+
return str;
#undef PP_PRECISION
}