about summary refs log tree commit diff
path: root/misc/efgcvt_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/efgcvt_r.c')
-rw-r--r--misc/efgcvt_r.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/misc/efgcvt_r.c b/misc/efgcvt_r.c
index 6a65583a6a..cbd5c271ba 100644
--- a/misc/efgcvt_r.c
+++ b/misc/efgcvt_r.c
@@ -1,5 +1,5 @@
 /* [efg]cvt -- compatibility functions for floating point formatting,
-   reentrent versions.
+   reentrant versions.
 Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
@@ -25,9 +25,24 @@ Boston, MA 02111-1307, USA.  */
 #include <math.h>
 #include <stdlib.h>
 
+#ifndef FLOAT_TYPE
+#define FLOAT_TYPE double
+#define FUNC_PREFIX
+#define FLOAT_FMT_FLAG
+#define FLOAT_NAME_EXT
+#endif
+
+#define APPEND(a, b) APPEND2 (a, b)
+#define APPEND2(a, b) a##b
+
+#define FLOOR APPEND(floor, FLOAT_NAME_EXT)
+#define FABS APPEND(fabs, FLOAT_NAME_EXT)
+#define LOG10 APPEND(log10, FLOAT_NAME_EXT)
+
+
 int
-fcvt_r (value, ndigit, decpt, sign, buf, len)
-     double value;
+APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
+     FLOAT_TYPE value;
      int ndigit, *decpt, *sign;
      char *buf;
      size_t len;
@@ -44,7 +59,7 @@ fcvt_r (value, ndigit, decpt, sign, buf, len)
   if (*sign)
     value = - value;
 
-  n = snprintf (buf, len, "%.*f", ndigit, value);
+  n = snprintf (buf, len, "%.*" FLOAT_FMT_FLAG "f", ndigit, value);
   if (n < 0)
     return -1;
 
@@ -60,33 +75,34 @@ fcvt_r (value, ndigit, decpt, sign, buf, len)
   return 0;
 }
 
-weak_extern (floor) weak_extern (log10) weak_extern (fabs)
+#define weak_extern2(name) weak_extern (name)
+weak_extern2 (FLOOR) weak_extern2 (LOG10) weak_extern2 (FABS)
 
 int
-ecvt_r (value, ndigit, decpt, sign, buf, len)
-     double value;
+APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
+     FLOAT_TYPE value;
      int ndigit, *decpt, *sign;
      char *buf;
      size_t len;
 {
-  double (*log10_function) (double) = &log10;
+  FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
 
   if (log10_function)
     {
       /* Use the reasonable code if -lm is included.  */
-      ndigit -= (int) floor (log10 (fabs (value)));
+      ndigit -= (int) FLOOR (LOG10 (FABS (value)));
       if (ndigit < 0)
 	ndigit = 0;
     }
   else
     {
       /* Slow code that doesn't require -lm functions.  */
-      double d;
+      FLOAT_TYPE d;
       for (d = value < 0.0 ? - value : value;
 	   ndigit > 0 && d >= 10.0;
 	   d *= 0.1)
 	--ndigit;
     }
 
-  return fcvt_r (value, ndigit, decpt, sign, buf, len);
+  return APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len);
 }