diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-10-31 22:55:02 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-10-31 22:55:02 +0000 |
commit | 1cab5444231a4a1fab9c3abb107d22af4eb09327 (patch) | |
tree | c58e953fe78f8094b3774b65eb2acf024cc10ded /misc/efgcvt.c | |
parent | fe4635fcae7a29fe688b048a2b1235bb89e05ec0 (diff) | |
download | glibc-1cab5444231a4a1fab9c3abb107d22af4eb09327.tar glibc-1cab5444231a4a1fab9c3abb107d22af4eb09327.tar.gz glibc-1cab5444231a4a1fab9c3abb107d22af4eb09327.tar.bz2 glibc-1cab5444231a4a1fab9c3abb107d22af4eb09327.zip |
Update.cvs/libc-ud-971031
1997-10-31 23:16 Ulrich Drepper <drepper@cygnus.com>
* posix/glob.c (glob): If calling glob_in_dir for a list which was
generated by a glob call disable GLOB_ERR since there might be
non-directories in the list (PR203).
* posix/glob.h (GLOB_ONLYDIR): New flag.
(__GLOB_FLAGS): Add GLOB_ONLYDIR.
* posix/glob.c: Define HAVE_D_TYPE if _DIRENT_HAVE_D_TYPE is defined.
(glob): Add GLOB_ONLYDIR to recursive call to match dirname.
(glob_in_dir) [HAVE_D_TYPE]: While reading directory entries test
whether they are directories if GLOB_ONLYDIR flag is given.
* manual/pattern.texi: Document GLOB_ONLYDIR.
* misc/Makefile (tests): Add tst-fdset.
* sysdeps/i386/bits/select.h: Rewrite asm macros to be cleaner.
* sysdeps/unix/sysv/linux/Dist: Add xstatconv.c.
* sysdeps/unix/sysv/linux/alpha/Dist: Likewise.
* time/strptime.c (strptime_internal): In %y format, regard years
>= 69 as of twentieth century, all other as of twenty-first.
* time/tzset.c: Correct typo and little optimization.
1997-10-31 16:01 Ulrich Drepper <drepper@cygnus.com>
* inet/getnetgrent.c: Allocate buffer dynamically if needed.
Suggested by Joe Keane <jgk@jgk.org>.
1997-10-31 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* io/ftw.h: Declare __ftw64_func_t and __nftw64_func_t only when
__USE_FILE_OFFSET64 || __USE_LARGEFILE64 is true.
1997-10-30 05:47 Ulrich Drepper <drepper@cygnus.com>
* misc/mntent.c: Don't use statically allocated buffer. Allocate
it dynamically if necessary.
* misc/efgcvt.c: Likewise.
Patch by Joe Keane <jgk@jgk.org>.
* misc/mntent.c: Allow freeing of allocated buffer in
__libc_subfreeres.
* misc/efgcvt.c: Likewise.
* misc/efgcvt.c: Call correct reentrant functions.
Use better values for MAXDIG.
* misc/qefgcvt.c: Use better values for MAXDIG.
1997-10-29 18:48 Richard Henderson <rth@cygnus.com>
* sysdeps/unix/sysv/linux/Makefile [io]: Add xstatconv.
* sysdeps/unix/sysv/linux/alpha/xstatconv.c: New file. Convert
between kernel_stat and the userland version indicated.
* sysdeps/unix/sysv/linux/xstatconv.c: Likewise.
* sysdeps/unix/sysv/linux/bits/stat.h: Define _STAT_VER_KERNEL.
* sysdeps/unix/sysv/linux/fxstat.c: Defer to __xstat_conv. Alias
to __*xstat64 if requested.
* sysdeps/unix/sysv/linux/lxstat.c: Likewise.
* sysdeps/unix/sysv/linux/xstat.c: Likewise.
* sysdeps/unix/sysv/linux/alpha/bits/stat.h: Add struct stat64.
Increment _STAT_VER, and make struct stat the same.
* sysdeps/unix/sysv/linux/alpha/bits/types.h: Add __ino64_t, and
__off64_t. Reorganize.
* sysdeps/unix/sysv/linux/alpha/kernel_stat.h: Add struct glibc2_stat
for backward compatibility. Define XSTAT_IS_XSTAT64.
* sysdeps/unix/sysv/linux/alpha/fxstat64.c: Empty file.
* sysdeps/unix/sysv/linux/alpha/lxstat64.c: Likewise.
* sysdeps/unix/sysv/linux/alpha/xstat64.c: Likewise.
* sysdeps/unix/sysv/linux/alpha/bits/dirent.h (struct dirent): For
consistency, force d_ino to use ino_t and supply padding.
1997-10-29 18:47 Richard Henderson <rth@cygnus.com>
* libio/iofopen.c: Correct weak_alias.
Diffstat (limited to 'misc/efgcvt.c')
-rw-r--r-- | misc/efgcvt.c | 75 |
1 files changed, 65 insertions, 10 deletions
diff --git a/misc/efgcvt.c b/misc/efgcvt.c index 24d63176d0..8c92766c63 100644 --- a/misc/efgcvt.c +++ b/misc/efgcvt.c @@ -20,28 +20,60 @@ #include <stdio.h> #include <stdlib.h> #include <float.h> +#include <bits/libc-lock.h> #ifndef FLOAT_TYPE -#define FLOAT_TYPE double -#define FUNC_PREFIX -#define FLOAT_FMT_FLAG -#define MAXDIG (DBL_DIG + DBL_MAX_10_EXP) +# define FLOAT_TYPE double +# define FUNC_PREFIX +# define FLOAT_FMT_FLAG +/* 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) #endif #define APPEND(a, b) APPEND2 (a, b) #define APPEND2(a, b) a##b +#define FCVT_BUFFER APPEND (FUNC_PREFIX, fcvt_buffer) +#define ECVT_BUFFER APPEND (FUNC_PREFIX, ecvt_buffer) + + +static char *FCVT_BUFFER; +static char *ECVT_BUFFER; + + +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; { - static char buf[MAXDIG]; + __libc_once_define (static, once); + __libc_once (once, APPEND (FUNC_PREFIX, fcvt_allocate)); - (void) fcvt_r (value, ndigit, decpt, sign, buf, sizeof buf); + 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; - return buf; + (void) APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, + FCVT_BUFFER, MAXDIG); + + return FCVT_BUFFER; +} + + +static void +APPEND (FUNC_PREFIX, ecvt_allocate) (void) +{ + ECVT_BUFFER = (char *) malloc (MAXDIG); } char * @@ -49,11 +81,19 @@ APPEND (FUNC_PREFIX, ecvt) (value, ndigit, decpt, sign) FLOAT_TYPE value; int ndigit, *decpt, *sign; { - static char buf[MAXDIG]; + __libc_once_define (static, once); + __libc_once (once, APPEND (FUNC_PREFIX, ecvt_allocate)); - (void) ecvt_r (value, ndigit, decpt, sign, buf, sizeof buf); + 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; - return buf; + (void) APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, + ECVT_BUFFER, MAXDIG); + + return ECVT_BUFFER; } char * @@ -65,3 +105,18 @@ APPEND (FUNC_PREFIX, gcvt) (value, ndigit, buf) sprintf (buf, "%.*" FLOAT_FMT_FLAG "g", ndigit, 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); |