aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog20
-rw-r--r--math/libm-test.c15
-rw-r--r--string/string.h2
-rw-r--r--sysdeps/generic/glob.c32
-rw-r--r--sysdeps/libm-ieee754/k_standard.c3
-rw-r--r--sysdeps/libm-ieee754/w_gamma.c26
-rw-r--r--sysdeps/libm-ieee754/w_gammaf.c32
-rw-r--r--sysdeps/libm-ieee754/w_gammal.c26
8 files changed, 115 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog
index 1772ea9fc0..9f9cdebd5f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+1998-07-23 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/generic/glob.c: Fix two problems with GLOB_DOOFFS.
+ Reported by bwelling@anomaly.munge.com [PR libc/720].
+
+ * sysdeps/libm-ieee754/k_standard.c: Return NAN for libm not in
+ SVID more for gamma(x) with x interger <= 0.
+ Reported by Stephen L Moshier <moshier@mediaone.net>.
+
+ * math/libm-test.c (gamma_test): Add test for gamma(-1) and gamma(0).
+ Correct test for SVID version of gamma.
+
+ * sysdeps/libm-ieee754/w_gamma.c: Use correct matherr call in SVID
+ emulation mode.
+ * sysdeps/libm-ieee754/w_gammaf.c: Likewise.
+ * sysdeps/libm-ieee754/w_gammal.c: Likewise.
+
+ * string/string.h: Don't use string function optimization for C++
+ as long as we use macros.
+
1998-07-22 23:47 Ulrich Drepper <drepper@cygnus.com>
* posix/fnmatch.c: Fix completely broken range matching.
diff --git a/math/libm-test.c b/math/libm-test.c
index a4e8492bf4..52358d5b34 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -1433,17 +1433,17 @@ gamma_test (void)
_LIB_VERSION = _SVID_;
check_isinfp ("gamma (+inf) == +inf", FUNC(gamma) (plus_infty));
- check_isinfp_exc ("gamma (0) == +inf plus divide by zero exception",
- FUNC(gamma) (0), DIVIDE_BY_ZERO_EXCEPTION);
+ check_exc ("gamma (0) == HUGE plus divide by zero exception",
+ FUNC(gamma) (0), HUGE, DIVIDE_BY_ZERO_EXCEPTION);
- check_isinfp_exc ("gamma (x) == +inf plus divide by zero exception for integer x <= 0",
- FUNC(gamma) (-3), DIVIDE_BY_ZERO_EXCEPTION);
+ check_exc ("gamma (x) == HUGE plus divide by zero exception for integer x <= 0",
+ FUNC(gamma) (-3), HUGE, DIVIDE_BY_ZERO_EXCEPTION);
check_isnan_exc ("gamma (-inf) == NaN plus invalid exception",
FUNC(gamma) (minus_infty), INVALID_EXCEPTION);
signgam = 0;
check ("gamma (1) == 0", FUNC(gamma) (1), 0);
- check_int ("gamma (0) sets signgam to 1", signgam, 1);
+ check_int ("gamma (1) sets signgam to 1", signgam, 1);
signgam = 0;
check ("gamma (3) == M_LN2", FUNC(gamma) (3), M_LN2l);
@@ -1486,6 +1486,11 @@ gamma_test (void)
1.29805533264755778568L, CHOOSE(0, 3e-16, 2e-7));
check ("gamma (1.2) == 0.91816...", FUNC(gamma) (1.2), 0.91816874239976061064L);
+ check_isnan_exc ("gamma (0.0) == NaN plus invalid exception",
+ FUNC(gamma) (0.0), INVALID_EXCEPTION);
+ check_isnan_exc ("gamma (-1.0) == NaN plus invalid exception",
+ FUNC(gamma) (-1.0), INVALID_EXCEPTION);
+
_LIB_VERSION = save_lib_version;
}
diff --git a/string/string.h b/string/string.h
index ee69a78d55..409fa99283 100644
--- a/string/string.h
+++ b/string/string.h
@@ -299,7 +299,7 @@ extern char *basename __P ((__const char *__filename));
#if defined __GNUC__ && __GNUC__ >= 2
-# if defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__
+# if defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ && !defined __cplusplus
/* When using GNU CC we provide some optimized versions of selected
functions from this header. There are two kinds of optimizations:
diff --git a/sysdeps/generic/glob.c b/sysdeps/generic/glob.c
index 9182c0585a..56bc0fbd53 100644
--- a/sysdeps/generic/glob.c
+++ b/sysdeps/generic/glob.c
@@ -693,7 +693,7 @@ glob (pattern, flags, errfunc, pglob)
appending the results to PGLOB. */
for (i = 0; i < dirs.gl_pathc; ++i)
{
- int oldcount;
+ int old_pathc;
#ifdef SHELL
{
@@ -709,7 +709,7 @@ glob (pattern, flags, errfunc, pglob)
}
#endif /* SHELL. */
- oldcount = pglob->gl_pathc;
+ old_pathc = pglob->gl_pathc;
status = glob_in_dir (filename, dirs.gl_pathv[i],
((flags | GLOB_APPEND)
& ~(GLOB_NOCHECK | GLOB_ERR)),
@@ -727,8 +727,8 @@ glob (pattern, flags, errfunc, pglob)
/* Stick the directory on the front of each name. */
if (prefix_array (dirs.gl_pathv[i],
- &pglob->gl_pathv[oldcount],
- pglob->gl_pathc - oldcount))
+ &pglob->gl_pathv[old_pathc],
+ pglob->gl_pathc - old_pathc))
{
globfree (&dirs);
globfree (pglob);
@@ -781,9 +781,14 @@ glob (pattern, flags, errfunc, pglob)
if (dirlen > 0)
{
/* Stick the directory on the front of each name. */
+ int ignore = oldcount;
+
+ if ((flags & GLOB_DOOFFS) && ignore < pglob->gl_offs)
+ ignore = pglob->gl_offs;
+
if (prefix_array (dirname,
- &pglob->gl_pathv[oldcount],
- pglob->gl_pathc - oldcount))
+ &pglob->gl_pathv[ignore],
+ pglob->gl_pathc - ignore))
{
globfree (pglob);
return GLOB_NOSPACE;
@@ -815,10 +820,17 @@ glob (pattern, flags, errfunc, pglob)
}
if (!(flags & GLOB_NOSORT))
- /* Sort the vector. */
- qsort ((__ptr_t) &pglob->gl_pathv[oldcount],
- pglob->gl_pathc - oldcount,
- sizeof (char *), collated_compare);
+ {
+ /* Sort the vector. */
+ int non_sort = oldcount;
+
+ if ((flags & GLOB_DOOFFS) && pglob->gl_offs > oldcount)
+ non_sort = pglob->gl_offs;
+
+ qsort ((__ptr_t) &pglob->gl_pathv[non_sort],
+ pglob->gl_pathc - non_sort,
+ sizeof (char *), collated_compare);
+ }
return 0;
}
diff --git a/sysdeps/libm-ieee754/k_standard.c b/sysdeps/libm-ieee754/k_standard.c
index aeaa50f2ee..82cfbe467a 100644
--- a/sysdeps/libm-ieee754/k_standard.c
+++ b/sysdeps/libm-ieee754/k_standard.c
@@ -845,12 +845,13 @@ static double zero = 0.0; /* used as const */
exc.type = SING;
exc.name = type < 100 ? "gamma" : (type < 200
? "gammaf" : "gammal");
- exc.retval = HUGE_VAL;
+ exc.retval = NAN;
if (_LIB_VERSION == _POSIX_)
__set_errno (EDOM);
else if (!matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("gamma: SING error\n", 18);
+ exc.retval = HUGE_VAL;
}
__set_errno (EDOM);
}
diff --git a/sysdeps/libm-ieee754/w_gamma.c b/sysdeps/libm-ieee754/w_gamma.c
index 02a3d47669..3511b67d77 100644
--- a/sysdeps/libm-ieee754/w_gamma.c
+++ b/sysdeps/libm-ieee754/w_gamma.c
@@ -32,7 +32,18 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
double y;
#ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_)
- y = __ieee754_lgamma_r(x,&signgam);
+ {
+ y = __ieee754_lgamma_r(x,&signgam);
+
+ if(!__finite(y)&&__finite(x)) {
+ if(__floor(x)==x&&x<=(double)0.0)
+ /* lgamma pole */
+ return __kernel_standard(x,x,15);
+ else
+ /* lgamma overflow */
+ return __kernel_standard(x,x,14);
+ }
+ }
else
{
#endif
@@ -43,14 +54,15 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
- }
- if(!__finite(y)&&__finite(x)) {
- if(__floor(x)==x&&x<=0.0)
+
+ if(!__finite(y)&&__finite(x)) {
+ if(__floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,41); /* gamma pole */
- else
+ else
return __kernel_standard(x,x,40); /* gamma overflow */
- } else
- return y;
+ }
+ }
+ return y;
#endif
}
weak_alias (__gamma, gamma)
diff --git a/sysdeps/libm-ieee754/w_gammaf.c b/sysdeps/libm-ieee754/w_gammaf.c
index 7d78a52908..bc251b3554 100644
--- a/sysdeps/libm-ieee754/w_gammaf.c
+++ b/sysdeps/libm-ieee754/w_gammaf.c
@@ -30,7 +30,18 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
float y;
#ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_)
- y = __ieee754_lgammaf_r(x,&signgam);
+ {
+ y = __ieee754_lgammaf_r(x,&signgam);
+
+ if(!__finitef(y)&&__finitef(x)) {
+ if(__floorf(x)==x&&x<=(float)0.0)
+ /* lgammaf pole */
+ return (float)__kernel_standard((double)x,(double)x,115);
+ else
+ /* lgammaf overflow */
+ return (float)__kernel_standard((double)x,(double)x,114);
+ }
+ }
else
{
#endif
@@ -41,16 +52,17 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
+
+ if(!__finitef(y)&&__finitef(x)) {
+ if(__floorf(x)==x&&x<=(float)0.0)
+ /* gammaf pole */
+ return (float)__kernel_standard((double)x,(double)x,141);
+ else
+ /* gammaf overflow */
+ return (float)__kernel_standard((double)x,(double)x,140);
+ }
}
- if(!__finitef(y)&&__finitef(x)) {
- if(__floorf(x)==x&&x<=(float)0.0)
- /* gammaf pole */
- return (float)__kernel_standard((double)x,(double)x,141);
- else
- /* gammaf overflow */
- return (float)__kernel_standard((double)x,(double)x,140);
- } else
- return y;
+ return y;
#endif
}
weak_alias (__gammaf, gammaf)
diff --git a/sysdeps/libm-ieee754/w_gammal.c b/sysdeps/libm-ieee754/w_gammal.c
index 1b4ae2cc7b..68328f652a 100644
--- a/sysdeps/libm-ieee754/w_gammal.c
+++ b/sysdeps/libm-ieee754/w_gammal.c
@@ -35,7 +35,18 @@ static char rcsid[] = "$NetBSD: $";
long double y;
#ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_)
- y = __ieee754_lgammal_r(x,&signgam);
+ {
+ y = __ieee754_lgammal_r(x,&signgam);
+
+ if(!__finitel(y)&&__finitel(x)) {
+ if(__floorl(x)==x&&x<=(long double)0.0)
+ /* lgamma pole */
+ return (long double)__kernel_standard((double)x,(double)x,15);
+ else
+ /* lgamma overflow */
+ return (long double)__kernel_standard((double)x,(double)x,14);
+ }
+ }
else
{
#endif
@@ -46,14 +57,15 @@ static char rcsid[] = "$NetBSD: $";
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
- }
- if(!__finitel(y)&&__finitel(x)) {
- if(__floorl(x)==x&&x<=0.0)
+
+ if(!__finitel(y)&&__finitel(x)) {
+ if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,241); /* gamma pole */
- else
+ else
return __kernel_standard(x,x,240); /* gamma overflow */
- } else
- return y;
+ }
+ }
+ return y;
#endif
}
weak_alias (__gammal, gammal)