Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 23 Jul 1998 14:59:16 +0000 (14:59 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 23 Jul 1998 14:59:16 +0000 (14:59 +0000)
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.

ChangeLog
math/libm-test.c
string/string.h
sysdeps/generic/glob.c
sysdeps/libm-ieee754/k_standard.c
sysdeps/libm-ieee754/w_gamma.c
sysdeps/libm-ieee754/w_gammaf.c
sysdeps/libm-ieee754/w_gammal.c

index 1772ea9..9f9cdeb 100644 (file)
--- 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.
index a4e8492..52358d5 100644 (file)
@@ -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;
 }
 
index ee69a78..409fa99 100644 (file)
@@ -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:
 
index 9182c05..56bc0fb 100644 (file)
@@ -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;
 }
index aeaa50f..82cfbe4 100644 (file)
@@ -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);
                }
index 02a3d47..3511b67 100644 (file)
@@ -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)
index 7d78a52..bc251b3 100644 (file)
@@ -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)
index 1b4ae2c..68328f6 100644 (file)
@@ -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)