diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-06-23 12:38:51 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-06-23 12:38:51 +0000 |
commit | 67994d6f6010739c22b1b4ab99aa88b4fe1ab8bd (patch) | |
tree | 4e1bea455bb81a13bad448cacbb5582e1f6f78f4 /misc/efgcvt.c | |
parent | 7df789e05906a883d03ed2cb2c400356350767cc (diff) | |
download | glibc-67994d6f6010739c22b1b4ab99aa88b4fe1ab8bd.zip glibc-67994d6f6010739c22b1b4ab99aa88b4fe1ab8bd.tar.gz glibc-67994d6f6010739c22b1b4ab99aa88b4fe1ab8bd.tar.bz2 |
Update.
1999-06-23 Ulrich Drepper <drepper@cygnus.com>
* manual/arith.texi: Document restriction of ndigit parameter of
ecvt and friends.
* misc/efgcvt.c: Define NDIGIT_MAX.
(gcvt): Limit precision in sprintf call to NDIGIT_MAX.
Do not dynamically allocate the static buffers. They are small enough.
* misc/efgcvt_r.c: Define NDIGIT_MAX.
(fcvt_r): Limit precision in snprintf call to NDIGIT_MAX.
* misc/qefgcvt.c: Define NDIGIT_MAX.
* misc/qefgcvt_r.c: Likewise.
* misc/tst-efgcvt.c (special): Add test for large ndigit parameter.
Diffstat (limited to 'misc/efgcvt.c')
-rw-r--r-- | misc/efgcvt.c | 55 |
1 files changed, 6 insertions, 49 deletions
diff --git a/misc/efgcvt.c b/misc/efgcvt.c index 8c92766..9348914 100644 --- a/misc/efgcvt.c +++ b/misc/efgcvt.c @@ -1,5 +1,5 @@ /* Compatibility functions for floating point formatting. - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,6 +19,7 @@ #include <stdio.h> #include <stdlib.h> +#include <sys/param.h> #include <float.h> #include <bits/libc-lock.h> @@ -29,6 +30,7 @@ /* Actually we have to write (DBL_DIG + log10 (DBL_MAX_10_EXP)) but we don't have log10 available in the preprocessor. */ # define MAXDIG (DBL_DIG + 3) +# define NDIGIT_MAX DBL_DIG #endif #define APPEND(a, b) APPEND2 (a, b) @@ -39,30 +41,15 @@ #define ECVT_BUFFER APPEND (FUNC_PREFIX, ecvt_buffer) -static char *FCVT_BUFFER; -static char *ECVT_BUFFER; +static char FCVT_BUFFER[MAXDIG]; +static char ECVT_BUFFER[MAXDIG]; -static void -APPEND (FUNC_PREFIX, fcvt_allocate) (void) -{ - FCVT_BUFFER = (char *) malloc (MAXDIG); -} - char * APPEND (FUNC_PREFIX, fcvt) (value, ndigit, decpt, sign) FLOAT_TYPE value; int ndigit, *decpt, *sign; { - __libc_once_define (static, once); - __libc_once (once, APPEND (FUNC_PREFIX, fcvt_allocate)); - - if (FCVT_BUFFER == NULL) - /* If no core is available we don't have a chance to run the - program successfully and so returning NULL is an acceptable - result. */ - return NULL; - (void) APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, FCVT_BUFFER, MAXDIG); @@ -70,26 +57,11 @@ APPEND (FUNC_PREFIX, fcvt) (value, ndigit, decpt, sign) } -static void -APPEND (FUNC_PREFIX, ecvt_allocate) (void) -{ - ECVT_BUFFER = (char *) malloc (MAXDIG); -} - char * APPEND (FUNC_PREFIX, ecvt) (value, ndigit, decpt, sign) FLOAT_TYPE value; int ndigit, *decpt, *sign; { - __libc_once_define (static, once); - __libc_once (once, APPEND (FUNC_PREFIX, ecvt_allocate)); - - if (ECVT_BUFFER == NULL) - /* If no core is available we don't have a chance to run the - program successfully and so returning NULL is an acceptable - result. */ - return NULL; - (void) APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, ECVT_BUFFER, MAXDIG); @@ -102,21 +74,6 @@ APPEND (FUNC_PREFIX, gcvt) (value, ndigit, buf) int ndigit; char *buf; { - sprintf (buf, "%.*" FLOAT_FMT_FLAG "g", ndigit, value); + sprintf (buf, "%.*" FLOAT_FMT_FLAG "g", MIN (ndigit, NDIGIT_MAX), value); return buf; } - - -/* Make sure the memory is freed if the programs ends while in - memory-debugging mode and something actually was allocated. */ -static void -__attribute__ ((unused)) -free_mem (void) -{ - if (FCVT_BUFFER != NULL) - free (FCVT_BUFFER); - if (ECVT_BUFFER != NULL) - free (ECVT_BUFFER); -} - -text_set_element (__libc_subfreeres, free_mem); |