]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 15 May 1999 23:31:55 +0000 (23:31 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 15 May 1999 23:31:55 +0000 (23:31 +0000)
* stdlib/strtol.c: Optimize inner loop of long long versions.

ChangeLog
FAQ
FAQ.in
stdlib/strtol.c

index 2aadaf0f77310686585116b685a76368b6794e67..82e8051c07a1ec889bb0783849621fd09a9407c1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 1999-05-15  Ulrich Drepper  <drepper@cygnus.com>
 
+       * stdlib/strtol.c: Optimize inner loop of long long versions.
+
        * sysdeps/gnu/utmpx.h: Add needed type definitions according to
        Unix98.  Add forward declaration of struct utmp.
 
diff --git a/FAQ b/FAQ
index 69edb3d48e41d22488b82446b9882ea3215f55f5..71e0afb389817ca08023fd645bdd2b3070a44598 100644 (file)
--- a/FAQ
+++ b/FAQ
@@ -226,8 +226,8 @@ to use EGCS.  Comparing the sizes of glibc on Intel compiled with a recent
 EGCS and gcc 2.8.1 shows this:
 
                  text    data     bss     dec     hex filename
-egcs-2.93.10   862897   15944   12824  891665   d9b11 libc.so
-gcc-2.8.1      959965   16468   12152  988585   f15a9 libc.so
+   egcs-2.93.10        862897   15944   12824  891665   d9b11 libc.so
+   gcc-2.8.1   959965   16468   12152  988585   f15a9 libc.so
 
 Make up your own decision.
 
@@ -838,7 +838,7 @@ ypbind.  ypbind 3.3 and older versions don't always remove these files, so
 glibc will continue to use them.  Other BSD versions seem to work correctly.
 Until ypbind 3.4 is released, you can find a patch at
 
-    ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc4.diff.gz
+    <ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc4.diff.gz>
 
 
 2.14.  Under Linux/Alpha, I always get "do_ypcall: clnt_call:
@@ -929,7 +929,7 @@ gcc-2.8.1 together with libstdc++ 2.8.1.1.  egcs 1.1 has the better C++
 support and works directly with glibc 2.1.  If you use gcc-2.8.1 with
 libstdc++ 2.8.1.1, you need to modify libstdc++ a bit.  A patch is available
 as:
-       ftp://alpha.gnu.org/gnu/libstdc++-2.8.1.1-glibc2.1-diff.gz
+       <ftp://alpha.gnu.org/gnu/libstdc++-2.8.1.1-glibc2.1-diff.gz>
 
 Please note that libg++ 2.7.2 (and the Linux Versions 2.7.2.x) doesn't work
 very well with the GNU C library due to vtable thunks.  If you're upgrading
@@ -1071,7 +1071,7 @@ The glibc-compat add-on will provide the libcompat.a library, the older
 nss modules, and a few other files.  Together, they should make it
 possible to do development with old static libraries on a glibc 2.1
 system.  This add-on is still in development.  You can get it from
-       ftp://alpha.gnu.org/gnu/glibc-compat-2.1.tar.gz
+       <ftp://alpha.gnu.org/gnu/glibc-compat-2.1.tar.gz>
 but please keep in mind that it is experimental.
 
 
@@ -1346,7 +1346,7 @@ This disables the optimization for that specific call.
        stdin/stdout/stderr. Why?
 
 {RM,AJ} Constructs like:
-static FILE *InPtr = stdin;
+   static FILE *InPtr = stdin;
 
 lead to this message.  This is correct behaviour with glibc since stdin is
 not a constant expression.  Please note that a strict reading of ISO C does
@@ -1361,17 +1361,17 @@ this way were versioning problems with the size of the FILE structure.
 To fix those programs you've got to initialize the variable at run time.
 This can be done, e.g. in main, like:
 
-static FILE *InPtr;
-int main(void)
-{
-  InPtr = stdin;
-}
+   static FILE *InPtr;
+   int main(void)
+   {
+     InPtr = stdin;
+   }
 
 or by constructors (beware this is gcc specific):
 
-static FILE *InPtr;
-static void inPtr_construct (void) __attribute__((constructor));
-static void inPtr_construct (void) { InPtr = stdin; }
+   static FILE *InPtr;
+   static void inPtr_construct (void) __attribute__((constructor));
+   static void inPtr_construct (void) { InPtr = stdin; }
 
 
 3.10.  I can't compile with gcc -traditional (or
@@ -1380,9 +1380,9 @@ static void inPtr_construct (void) { InPtr = stdin; }
 {AJ} glibc2 does break -traditional and -traditonal-cpp - and will continue
 to do so.  For example constructs of the form:
 
-enum {foo
-#define foo foo
-}
+   enum {foo
+   #define foo foo
+   }
 
 are useful for debugging purposes (you can use foo with your debugger that's
 why we need the enum) and for compatibility (other systems use defines and
diff --git a/FAQ.in b/FAQ.in
index 6a841a07a3581af4337a91c0edb1046dad9f4451..b593dcc5d97d423f721ab74940bbd6e5bbe8413c 100644 (file)
--- a/FAQ.in
+++ b/FAQ.in
@@ -68,8 +68,8 @@ to use EGCS.  Comparing the sizes of glibc on Intel compiled with a recent
 EGCS and gcc 2.8.1 shows this:
 
                  text    data     bss     dec     hex filename
-egcs-2.93.10   862897   15944   12824  891665   d9b11 libc.so
-gcc-2.8.1      959965   16468   12152  988585   f15a9 libc.so
+   egcs-2.93.10        862897   15944   12824  891665   d9b11 libc.so
+   gcc-2.8.1   959965   16468   12152  988585   f15a9 libc.so
 
 Make up your own decision.
 
@@ -651,7 +651,7 @@ ypbind.  ypbind 3.3 and older versions don't always remove these files, so
 glibc will continue to use them.  Other BSD versions seem to work correctly.
 Until ypbind 3.4 is released, you can find a patch at
 
-    ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc4.diff.gz
+    <ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc4.diff.gz>
 
 ??     Under Linux/Alpha, I always get "do_ypcall: clnt_call:
        RPC: Unable to receive; errno = Connection refused" when using NIS.
@@ -736,7 +736,7 @@ gcc-2.8.1 together with libstdc++ 2.8.1.1.  egcs 1.1 has the better C++
 support and works directly with glibc 2.1.  If you use gcc-2.8.1 with
 libstdc++ 2.8.1.1, you need to modify libstdc++ a bit.  A patch is available
 as:
-       ftp://alpha.gnu.org/gnu/libstdc++-2.8.1.1-glibc2.1-diff.gz
+       <ftp://alpha.gnu.org/gnu/libstdc++-2.8.1.1-glibc2.1-diff.gz>
 
 Please note that libg++ 2.7.2 (and the Linux Versions 2.7.2.x) doesn't work
 very well with the GNU C library due to vtable thunks.  If you're upgrading
@@ -872,7 +872,7 @@ The glibc-compat add-on will provide the libcompat.a library, the older
 nss modules, and a few other files.  Together, they should make it
 possible to do development with old static libraries on a glibc 2.1
 system.  This add-on is still in development.  You can get it from
-       ftp://alpha.gnu.org/gnu/glibc-compat-2.1.tar.gz
+       <ftp://alpha.gnu.org/gnu/glibc-compat-2.1.tar.gz>
 but please keep in mind that it is experimental.
 
 ??     Why is extracting files via tar so slow?
@@ -1135,7 +1135,7 @@ This disables the optimization for that specific call.
        stdin/stdout/stderr. Why?
 
 {RM,AJ} Constructs like:
-static FILE *InPtr = stdin;
+   static FILE *InPtr = stdin;
 
 lead to this message.  This is correct behaviour with glibc since stdin is
 not a constant expression.  Please note that a strict reading of ISO C does
@@ -1150,17 +1150,17 @@ this way were versioning problems with the size of the FILE structure.
 To fix those programs you've got to initialize the variable at run time.
 This can be done, e.g. in main, like:
 
-static FILE *InPtr;
-int main(void)
-{
-  InPtr = stdin;
-}
+   static FILE *InPtr;
+   int main(void)
+   {
+     InPtr = stdin;
+   }
 
 or by constructors (beware this is gcc specific):
 
-static FILE *InPtr;
-static void inPtr_construct (void) __attribute__((constructor));
-static void inPtr_construct (void) { InPtr = stdin; }
+   static FILE *InPtr;
+   static void inPtr_construct (void) __attribute__((constructor));
+   static void inPtr_construct (void) { InPtr = stdin; }
 
 
 ??     I can't compile with gcc -traditional (or
@@ -1169,9 +1169,9 @@ static void inPtr_construct (void) { InPtr = stdin; }
 {AJ} glibc2 does break -traditional and -traditonal-cpp - and will continue
 to do so.  For example constructs of the form:
 
-enum {foo
-#define foo foo
-}
+   enum {foo
+   #define foo foo
+   }
 
 are useful for debugging purposes (you can use foo with your debugger that's
 why we need the enum) and for compatibility (other systems use defines and
index 96157ef400c75a15970b5f9ac0b26d4e16912464..6ba2960f295ca04ebd5b060249af41867f21b59f 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert string representation of a number into an integer value.
-   Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
+   Copyright (C) 1991,92,94,95,96,97,98,99 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
@@ -344,27 +344,63 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
 
   overflow = 0;
   i = 0;
-  for (c = *s; c != L_('\0'); c = *++s)
+  c = *s;
+  if (sizeof (long int) != sizeof (LONG int))
     {
-      if (s == end)
-       break;
-      if (c >= L_('0') && c <= L_('9'))
-       c -= L_('0');
-      else if (ISALPHA (c))
-       c = TOUPPER (c) - L_('A') + 10;
-      else
-       break;
-      if ((int) c >= base)
-       break;
-      /* Check for overflow.  */
-      if (i > cutoff || (i == cutoff && c > cutlim))
-       overflow = 1;
-      else
+      unsigned long int j = 0;
+
+      for (;c != L_('\0'); c = *++s)
        {
-         i *= (unsigned LONG int) base;
-         i += c;
+         if (s == end)
+           break;
+         if (c >= L_('0') && c <= L_('9'))
+           c -= L_('0');
+         else if (ISALPHA (c))
+           c = TOUPPER (c) - L_('A') + 10;
+         else
+           break;
+         if ((int) c >= base)
+           break;
+         /* Note that we never can have an overflow.  */
+         else
+           {
+             unsigned long int jj = j * (unsigned long int) base;
+             if (jj < j)
+               {
+                 /* We have an overflow.  Now use the long representation.  */
+                 i = (unsigned LONG int) j;
+                 goto use_long;
+               }
+             j = jj;
+             j += c;
+           }
        }
+
+      i = (unsigned LONG int) j;
     }
+  else
+    for (;c != L_('\0'); c = *++s)
+      {
+       if (s == end)
+         break;
+       if (c >= L_('0') && c <= L_('9'))
+         c -= L_('0');
+       else if (ISALPHA (c))
+         c = TOUPPER (c) - L_('A') + 10;
+       else
+         break;
+       if ((int) c >= base)
+         break;
+       /* Check for overflow.  */
+       if (i > cutoff || (i == cutoff && c > cutlim))
+         overflow = 1;
+       else
+         {
+         use_long:
+           i *= (unsigned LONG int) base;
+           i += c;
+         }
+      }
 
   /* Check if anything actually happened.  */
   if (s == save)