diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-12-16 07:54:18 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-12-16 07:54:18 +0000 |
commit | 887e7ab6c5a13398e5986c7054235a135e6429f9 (patch) | |
tree | 04556d2595001782246223937c3a43c58d4b9f63 /misc | |
parent | bafd15679c55e35440a9fd11069614b43559413c (diff) | |
download | glibc-887e7ab6c5a13398e5986c7054235a135e6429f9.zip glibc-887e7ab6c5a13398e5986c7054235a135e6429f9.tar.gz glibc-887e7ab6c5a13398e5986c7054235a135e6429f9.tar.bz2 |
Update.
2000-12-13 Jakub Jelinek <jakub@redhat.com>
* misc/efgcvt.c (FCVT_MAXDIG): Define.
(FCVT_BUFPTR): New variable.
(fcvt): If fcvt_r returns -1 on the static short buffer,
try to malloc a sufficiently large one and retry.
(free_mem): New function.
* misc/qefgcvt.c (FCVT_MAXDIG): Define.
* misc/tst-efgcvt.c (fcvt_tests): Add new test.
2000-12-15 Ulrich Drepper <drepper@redhat.com>
* misc/dirname.c (dirname): Fix search for second to last slash.
2000-12-13 Andreas Jaeger <aj@suse.de>
* misc/tst-dirname.c (main): Fix typo in test to really use
the examples from Unix98.
Reported by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>.
Diffstat (limited to 'misc')
-rw-r--r-- | misc/dirname.c | 21 | ||||
-rw-r--r-- | misc/efgcvt.c | 29 | ||||
-rw-r--r-- | misc/qefgcvt.c | 3 | ||||
-rw-r--r-- | misc/tst-dirname.c | 8 | ||||
-rw-r--r-- | misc/tst-efgcvt.c | 1 |
5 files changed, 47 insertions, 15 deletions
diff --git a/misc/dirname.c b/misc/dirname.c index 26c5a8b..8be25e5 100644 --- a/misc/dirname.c +++ b/misc/dirname.c @@ -1,5 +1,5 @@ /* dirname - return directory part of PATH. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -31,17 +31,20 @@ dirname (char *path) /* Find last '/'. */ last_slash = path != NULL ? strrchr (path, '/') : NULL; - if (last_slash == path) - /* The last slash is the first character in the string. We have to - return "/". */ - ++last_slash; - else if (last_slash != NULL && last_slash[1] == '\0') + if (last_slash != NULL && last_slash != path && last_slash[1] == '\0') /* The '/' is the last character, we have to look further. */ - last_slash = memchr (path, last_slash - path, '/'); + last_slash = __memrchr (path, '/', last_slash - path); if (last_slash != NULL) - /* Terminate the path. */ - last_slash[0] = '\0'; + { + /* Terminate the path. */ + if (last_slash == path) + /* The last slash is the first character in the string. We have to + return "/". */ + ++last_slash; + + last_slash[0] = '\0'; + } else /* This assignment is ill-designed but the XPG specs require to return a string containing "." in any case no directory part is diff --git a/misc/efgcvt.c b/misc/efgcvt.c index 37b4bc0..5196c10 100644 --- a/misc/efgcvt.c +++ b/misc/efgcvt.c @@ -31,6 +31,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 (NDIGIT_MAX + 3) +# define FCVT_MAXDIG (DBL_MAX_10_EXP + MAXDIG) # if DBL_MANT_DIG == 53 # define NDIGIT_MAX 17 # elif DBL_MANT_DIG == 24 @@ -50,22 +51,34 @@ #define FCVT_BUFFER APPEND (FUNC_PREFIX, fcvt_buffer) +#define FCVT_BUFPTR APPEND (FUNC_PREFIX, fcvt_bufptr) #define ECVT_BUFFER APPEND (FUNC_PREFIX, ecvt_buffer) static char FCVT_BUFFER[MAXDIG]; static char ECVT_BUFFER[MAXDIG]; - +static char *FCVT_BUFPTR; char * APPEND (FUNC_PREFIX, fcvt) (value, ndigit, decpt, sign) FLOAT_TYPE value; int ndigit, *decpt, *sign; { + if (FCVT_BUFPTR == NULL) + { + if (APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, + FCVT_BUFFER, MAXDIG) != -1) + return FCVT_BUFFER; + + FCVT_BUFPTR = (char *) malloc (FCVT_MAXDIG); + if (FCVT_BUFPTR == NULL) + return FCVT_BUFFER; + } + (void) APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, - FCVT_BUFFER, MAXDIG); + FCVT_BUFPTR, FCVT_MAXDIG); - return FCVT_BUFFER; + return FCVT_BUFPTR; } @@ -89,3 +102,13 @@ APPEND (FUNC_PREFIX, gcvt) (value, ndigit, buf) sprintf (buf, "%.*" FLOAT_FMT_FLAG "g", MIN (ndigit, NDIGIT_MAX), value); return buf; } + +/* Free all resources if necessary. */ +static void __attribute__ ((unused)) +free_mem (void) +{ + if (FCVT_BUFPTR != NULL) + free (FCVT_BUFPTR); +} + +text_set_element (__libc_subfreeres, free_mem); diff --git a/misc/qefgcvt.c b/misc/qefgcvt.c index 63fc764..2c5d636 100644 --- a/misc/qefgcvt.c +++ b/misc/qefgcvt.c @@ -1,5 +1,5 @@ /* Compatibility functions for floating point formatting, long double version. - Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1999, 2000 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 @@ -26,6 +26,7 @@ we don't have log10 available in the preprocessor. Since we cannot assume anything on the used `long double' format be generous. */ #define MAXDIG (NDIGIT_MAX + 12) +#define FCVT_MAXDIG (LDBL_MAX_10_EXP + MAXDIG) #if LDBL_MANT_DIG == 64 # define NDIGIT_MAX 21 #elif LDBL_MANT_DIG == 53 diff --git a/misc/tst-dirname.c b/misc/tst-dirname.c index fd24488..e688bd3 100644 --- a/misc/tst-dirname.c +++ b/misc/tst-dirname.c @@ -24,7 +24,7 @@ #include <string.h> -int +static int test (const char *input, const char *result) { int retval; @@ -45,11 +45,15 @@ main (void) /* These are the examples given in XPG4.2. */ result |= test ("/usr/lib", "/usr"); - result |= test ("/usr", "/"); + result |= test ("/usr/", "/"); result |= test ("usr", "."); result |= test ("/", "/"); result |= test (".", "."); result |= test ("..", "."); + /* Some more tests. */ + result |= test ("/usr/lib/", "/usr"); + result |= test ("/usr", "/"); + return result != 0; } diff --git a/misc/tst-efgcvt.c b/misc/tst-efgcvt.c index 6eaa8be..f2edb9d 100644 --- a/misc/tst-efgcvt.c +++ b/misc/tst-efgcvt.c @@ -81,6 +81,7 @@ static testcase fcvt_tests[] = { 100.01, -4, 3, "100" }, { 123.01, -4, 3, "100" }, { 126.71, -4, 3, "100" }, + { 322.5, 16, 3, "3225000000000000000" }, /* -1.0 is end marker. */ { -1.0, 0, 0, "" } }; |