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 | |
parent | fe4635fcae7a29fe688b048a2b1235bb89e05ec0 (diff) | |
download | glibc-1cab5444231a4a1fab9c3abb107d22af4eb09327.zip glibc-1cab5444231a4a1fab9c3abb107d22af4eb09327.tar.gz glibc-1cab5444231a4a1fab9c3abb107d22af4eb09327.tar.bz2 |
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')
-rw-r--r-- | misc/Makefile | 2 | ||||
-rw-r--r-- | misc/efgcvt.c | 75 | ||||
-rw-r--r-- | misc/mntent.c | 42 | ||||
-rw-r--r-- | misc/qefgcvt.c | 5 | ||||
-rw-r--r-- | misc/tst-fdset.c | 65 |
5 files changed, 175 insertions, 14 deletions
diff --git a/misc/Makefile b/misc/Makefile index 4cca2f3..7975964 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -64,7 +64,7 @@ install-lib := libbsd-compat.a libg.a non-lib.a := libbsd-compat.a gpl2lgpl := error.c error.h -tests := tst-dirname tst-tsearch +tests := tst-dirname tst-tsearch tst-fdset include ../Rules diff --git a/misc/efgcvt.c b/misc/efgcvt.c index 24d6317..8c92766 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); diff --git a/misc/mntent.c b/misc/mntent.c index 95f745e..b21f24e 100644 --- a/misc/mntent.c +++ b/misc/mntent.c @@ -18,12 +18,50 @@ Boston, MA 02111-1307, USA. */ #include <mntent.h> +#include <stdlib.h> +#include <bits/libc-lock.h> + +/* We don't want to allocate the static buffer all the time since it + is not always used (in fact, rather infrequently). Accept the + extra cost of a `malloc'. */ +static char *getmntent_buffer; + +/* This is the size of the buffer. This is really big. */ +#define BUFFER_SIZE 4096 + + +static void +allocate (void) +{ + getmntent_buffer = (char *) malloc (BUFFER_SIZE); +} + struct mntent * getmntent (FILE *stream) { - static char buf[8192]; static struct mntent m; + __libc_once_define (static, once); + __libc_once (once, allocate); - return __getmntent_r (stream, &m, buf, sizeof buf); + if (getmntent_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 __getmntent_r (stream, &m, getmntent_buffer, BUFFER_SIZE); +} + + +/* 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 (getmntent_buffer != NULL) + free (getmntent_buffer); } + +text_set_element (__libc_subfreeres, free_mem); diff --git a/misc/qefgcvt.c b/misc/qefgcvt.c index 2729dce..853252c 100644 --- a/misc/qefgcvt.c +++ b/misc/qefgcvt.c @@ -20,6 +20,9 @@ #define FLOAT_TYPE long double #define FUNC_PREFIX q #define FLOAT_FMT_FLAG "L" -#define MAXDIG (LDBL_DIG + LDBL_MAX_10_EXP) +/* Actually we have to write (LDBL_DIG + log10 (LDBL_MAX_10_EXP)) but + we don't have log10 available in the preprocessor. Since we cannot + assume anything on the used `long double' format be generous. */ +#define MAXDIG (LDBL_DIG + 12) #include "efgcvt.c" diff --git a/misc/tst-fdset.c b/misc/tst-fdset.c new file mode 100644 index 0000000..ddd25c3 --- /dev/null +++ b/misc/tst-fdset.c @@ -0,0 +1,65 @@ +/* Test FD* macros. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Robert Bihlmeyer <robbe@orcus.priv.at>. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <stdio.h> +#include <sys/types.h> + +int +main (void) +{ + int retval = 0; + int i; + fd_set set; + + FD_ZERO (&set); + for (i=0; i < FD_SETSIZE; ++i) + { + printf ("%d => check:", i); + if (FD_ISSET (i, &set) == 0) + fputs ("ok", stdout); + else + { + fputs ("nok", stdout); + retval = 1; + } + fputs (", set", stdout); + FD_SET (i, &set); + fputs (", check:", stdout); + if (FD_ISSET (i, &set) == 1) + fputs ("ok", stdout); + else + { + fputs ("nok", stdout); + retval = 1; + } + fputs (", clear", stdout); + FD_CLR (i, &set); + fputs (", check:", stdout); + if (FD_ISSET (i, &set) == 0) + puts ("ok"); + else + { + puts ("nok"); + retval = 1; + } + } + + return retval; +} |