From: Ulrich Drepper Date: Thu, 23 Jul 1998 14:59:16 +0000 (+0000) Subject: Update. X-Git-Tag: cvs/glibc-2_0_95~12 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=cc60175e8cecbedb4c555379c3c667c9cf9420fa;p=glibc.git Update. 1998-07-23 Ulrich Drepper * 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 . * 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. --- diff --git a/ChangeLog b/ChangeLog index 1772ea9fc0..9f9cdebd5f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +1998-07-23 Ulrich Drepper + + * 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 . + + * 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 * 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)