summaryrefslogtreecommitdiff
path: root/lib/ftoastr.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2017-03-03 08:45:10 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2017-03-03 08:46:11 -0800
commitf1fe3fcfc568c1527714ff3a95e678816e2787d4 (patch)
treebfe4792f57ae62222ba05b3c4d69706f3e83b212 /lib/ftoastr.c
parentaaf86f30f709b22e9bae8cdb23ec89342dcaa55f (diff)
downloademacs-f1fe3fcfc568c1527714ff3a95e678816e2787d4.tar.gz
Merge from gnulib
This incorporates: 2017-02-25 maintainer-makefile: Fix AC_PROG_SED with autoconf cache. 2017-02-24 ftoastr: port to -Wdouble-promotion * lib/ftoastr.c, m4/gnulib-common.m4: Copy from gnulib.
Diffstat (limited to 'lib/ftoastr.c')
-rw-r--r--lib/ftoastr.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/ftoastr.c b/lib/ftoastr.c
index 826340c3f77..ef861e2237a 100644
--- a/lib/ftoastr.c
+++ b/lib/ftoastr.c
@@ -39,6 +39,7 @@
# define FLOAT_MIN LDBL_MIN
# define FLOAT_PREC_BOUND _GL_LDBL_PREC_BOUND
# define FTOASTR ldtoastr
+# define PROMOTED_FLOAT long double
# if HAVE_C99_STRTOLD
# define STRTOF strtold
# endif
@@ -48,6 +49,7 @@
# define FLOAT_MIN DBL_MIN
# define FLOAT_PREC_BOUND _GL_DBL_PREC_BOUND
# define FTOASTR dtoastr
+# define PROMOTED_FLOAT double
#else
# define LENGTH 1
# define FLOAT float
@@ -55,6 +57,7 @@
# define FLOAT_MIN FLT_MIN
# define FLOAT_PREC_BOUND _GL_FLT_PREC_BOUND
# define FTOASTR ftoastr
+# define PROMOTED_FLOAT double
# if HAVE_STRTOF
# define STRTOF strtof
# endif
@@ -77,20 +80,21 @@ static int
ftoastr_snprintf (char *buf, size_t bufsize, char const *format,
int width, int prec, FLOAT x)
{
+ PROMOTED_FLOAT promoted_x = x;
char width_0_buffer[LENGTH == 1 ? FLT_BUFSIZE_BOUND
: LENGTH == 2 ? DBL_BUFSIZE_BOUND
: LDBL_BUFSIZE_BOUND];
int n = width;
if (bufsize < sizeof width_0_buffer)
{
- n = sprintf (width_0_buffer, format, 0, prec, x);
+ n = sprintf (width_0_buffer, format, 0, prec, promoted_x);
if (n < 0)
return n;
if (n < width)
n = width;
}
if (n < bufsize)
- n = sprintf (buf, format, width, prec, x);
+ n = sprintf (buf, format, width, prec, promoted_x);
return n;
}
#endif
@@ -106,6 +110,7 @@ FTOASTR (char *buf, size_t bufsize, int flags, int width, FLOAT x)
<http://dx.doi.org/10.1145/1809028.1806623>; also see the
2010-03-21 draft <http://florian.loitsch.com/tmp/article.pdf>. */
+ PROMOTED_FLOAT promoted_x = x;
char format[sizeof "%-+ 0*.*Lg"];
FLOAT abs_x = x < 0 ? -x : x;
int prec;
@@ -128,7 +133,7 @@ FTOASTR (char *buf, size_t bufsize, int flags, int width, FLOAT x)
for (prec = abs_x < FLOAT_MIN ? 1 : FLOAT_DIG; ; prec++)
{
- int n = snprintf (buf, bufsize, format, width, prec, x);
+ int n = snprintf (buf, bufsize, format, width, prec, promoted_x);
if (n < 0
|| FLOAT_PREC_BOUND <= prec
|| (n < bufsize && STRTOF (buf, NULL) == x))