Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 11 Aug 2001 05:32:47 +0000 (05:32 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 11 Aug 2001 05:32:47 +0000 (05:32 +0000)
* posix/getopt_init.c (__getopt_clean_environment): Avoid making
the strncmp calls most of the time by testing for '_' as the first
character of the name.

ChangeLog
posix/getopt_init.c

index 1f3d91c..3fbb34f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2001-08-10  Ulrich Drepper  <drepper@redhat.com>
 
+       * posix/getopt_init.c (__getopt_clean_environment): Avoid making
+       the strncmp calls most of the time by testing for '_' as the first
+       character of the name.
+
        * elf/dl-open.c (add_to_global): Remove stale comment.
 
        * elf/dl-load.c (fillin_rpath): In SUID binaries, don't mark
index 611135b..dd3d433 100644 (file)
@@ -1,5 +1,5 @@
 /* Perform additional initialization for getopt functions in GNU libc.
-   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -45,7 +45,7 @@ __getopt_clean_environment (char **env)
      of file name wildcard expansion and therefore should not be
      considered as options.  */
   static const char envvar_tail[] = "_GNU_nonoption_argv_flags_=";
-  char var[100];
+  char var[50];
   char *cp, **ep;
   size_t len;
 
@@ -54,11 +54,13 @@ __getopt_clean_environment (char **env)
   cp = memcpy (&var[sizeof (var) - sizeof (envvar_tail)], envvar_tail,
               sizeof (envvar_tail));
   cp = _itoa_word (__getpid (), cp, 10, 0);
-  *--cp = '_';
+  /* Note: we omit adding the leading '_' since we explicitly test for
+     it before calling strncmp.  */
   len = (var + sizeof (var) - 1) - cp;
 
   for (ep = env; *ep != NULL; ++ep)
-    if (!strncmp (*ep, cp, len))
+    if ((*ep)[0] == '_'
+       && __builtin_expect (strncmp (*ep + 1, cp, len) == 0, 0))
       {
        /* Found it.  Store this pointer and move later ones back.  */
        char **dp = ep;