Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 7 Apr 1998 16:28:09 +0000 (16:28 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 7 Apr 1998 16:28:09 +0000 (16:28 +0000)
1998-04-07 16:18  Ulrich Drepper  <drepper@cygnus.com>

* libc.map: Add __asprintf to GLIBC_2.1.
* elf/dlerror.c: Use __asprintf, not asprintf.
* libio/stdio.h: Declare __asprintf.
* stdio-common/asprintf.c: Define as __asprintf and make asprintf
a weak alias.

* elf/dl-minimal.c: Add definition of strtol and strtoul (und friends)
to avoid inclusion from libc_pic.a.

* elf/dl-runtime.c: Undo last patch.

* stdlib/strtod.c: Don't use mbtowc, use btowc.

* sysdeps/i386/dl-machine.h (dl_platform_init): Don't use "i386"
as default, use NULL.

ChangeLog
configure
elf/dl-minimal.c
elf/dl-runtime.c
elf/dlerror.c
libc.map
libio/stdio.h
stdio-common/asprintf.c
stdlib/strtod.c
stdlib/strtol.c
sysdeps/i386/dl-machine.h

index a630315..4b08547 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+1998-04-07 16:18  Ulrich Drepper  <drepper@cygnus.com>
+
+       * libc.map: Add __asprintf to GLIBC_2.1.
+       * elf/dlerror.c: Use __asprintf, not asprintf.
+       * libio/stdio.h: Declare __asprintf.
+       * stdio-common/asprintf.c: Define as __asprintf and make asprintf
+       a weak alias.
+
+       * elf/dl-minimal.c: Add definition of strtol and strtoul (und friends)
+       to avoid inclusion from libc_pic.a.
+
+       * elf/dl-runtime.c: Undo last patch.
+
+       * stdlib/strtod.c: Don't use mbtowc, use btowc.
+
+       * sysdeps/i386/dl-machine.h (dl_platform_init): Don't use "i386"
+       as default, use NULL.
+
 1998-04-04  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
 
        * resolv/Makefile: Include ../Makeconfig - needed for building
index eba8edf..b5f8ada 100755 (executable)
--- a/configure
+++ b/configure
@@ -1634,8 +1634,8 @@ if test -n "$path_binutils"; then
     path_binutils=`(cd $path_binutils; pwd) | sed 's%/*$%/%'`
     CC="$CC -B$path_binutils"
 fi
-AS=`$CC -print-file-name=as`
-LD=`$CC -print-file-name=ld`
+AS=`$CC -print-prog-name=as`
+LD=`$CC -print-prog-name=ld`
 
 # Determine whether we are using GNU binutils.
 echo $ac_n "checking whether $AS is GNU as""... $ac_c" 1>&6
index 6592ca0..4c15d83 100644 (file)
@@ -18,6 +18,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
+#include <limits.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
@@ -202,3 +203,129 @@ __assert_perror_fail (int errnum,
 }
 
 #endif
+
+/* This function is only used in eval.c.  */
+long int
+weak_function
+__strtol_internal (const char *nptr, char **endptr, int base, int group)
+{
+  long int result = 0;
+  long int sign = 1;
+
+  while (*nptr == ' ' || *nptr == '\t')
+    ++nptr;
+
+  if (*nptr == '-')
+    {
+      sign = -1;
+      ++nptr;
+    }
+  else if (*nptr == '+')
+    ++nptr;
+
+  if (*nptr < '0' || *nptr > '9')
+    {
+      if (endptr != NULL)
+       *endptr = (char *) nptr;
+      return 0L;
+    }
+
+  assert (base == 0);
+  if (*nptr == '0')
+    {
+      if (nptr[1] == 'x' || nptr[1] == 'X')
+       {
+         base = 16;
+         nptr += 2;
+       }
+      else
+       base = 8;
+    }
+  else
+    base = 10;
+
+  while (*nptr >= '0' && *nptr <= '9')
+    {
+      long int digval = *nptr - '0';
+      if (result > LONG_MAX / 10
+         || (result == (sign ? LONG_MAX : LONG_MAX + 1) / 10
+             && digval > (sign ? LONG_MAX : LONG_MAX + 1) % 10))
+       {
+         errno = ERANGE;
+         return LONG_MAX * sign;
+       }
+      result *= 10;
+      result += digval;
+    }
+
+  return result * sign;
+}
+
+long int
+weak_function
+strtol (const char *nptr, char **endptr, int base)
+{
+  return __strtol_internal (nptr, endptr, base, 0);
+}
+
+unsigned long int
+weak_function
+__strtoul_internal (const char *nptr, char **endptr, int base, int group)
+{
+  long int result = 0;
+  long int sign = 1;
+
+  while (*nptr == ' ' || *nptr == '\t')
+    ++nptr;
+
+  if (*nptr == '-')
+    {
+      sign = -1;
+      ++nptr;
+    }
+  else if (*nptr == '+')
+    ++nptr;
+
+  if (*nptr < '0' || *nptr > '9')
+    {
+      if (endptr != NULL)
+       *endptr = (char *) nptr;
+      return 0UL;
+    }
+
+  assert (base == 0);
+  if (*nptr == '0')
+    {
+      if (nptr[1] == 'x' || nptr[1] == 'X')
+       {
+         base = 16;
+         nptr += 2;
+       }
+      else
+       base = 8;
+    }
+  else
+    base = 10;
+
+  while (*nptr >= '0' && *nptr <= '9')
+    {
+      long int digval = *nptr - '0';
+      if (result > LONG_MAX / 10
+         || (result == ULONG_MAX / 10 && digval > ULONG_MAX % 10))
+       {
+         errno = ERANGE;
+         return ULONG_MAX;
+       }
+      result *= 10;
+      result += digval;
+    }
+
+  return result * sign;
+}
+
+unsigned long int
+weak_function
+strtoul (const char *nptr, char **endptr, int base)
+{
+  return (unsigned long int) __strtoul_internal (nptr, endptr, base, 0);
+}
index 10daa98..53601b8 100644 (file)
@@ -128,13 +128,13 @@ fixup (
          {
            value = _dl_lookup_versioned_symbol(strtab + sym->st_name,
                                                &sym, scope, l->l_name,
-                                               version, DL_LOOKUP_NOPLT);
+                                               version, ELF_MACHINE_JMP_SLOT);
            break;
          }
       }
     case 0:
       value = _dl_lookup_symbol (strtab + sym->st_name, &sym, scope,
-                                l->l_name, DL_LOOKUP_NOPLT);
+                                l->l_name, ELF_MACHINE_JMP_SLOT);
     }
 
   /* Currently value contains the base load address of the object
@@ -205,13 +205,13 @@ profile_fixup (
                value = _dl_lookup_versioned_symbol(strtab + sym->st_name,
                                                    &sym, scope, l->l_name,
                                                    version,
-                                                   DL_LOOKUP_NOPLT);
+                                                   ELF_MACHINE_JMP_SLOT);
                break;
              }
          }
        case 0:
          value = _dl_lookup_symbol (strtab + sym->st_name, &sym, scope,
-                                    l->l_name, DL_LOOKUP_NOPLT);
+                                    l->l_name, ELF_MACHINE_JMP_SLOT);
        }
 
       /* Currently value contains the base load address of the object
index 00d367b..ba25611 100644 (file)
@@ -72,8 +72,8 @@ dlerror (void)
     buf = result->errstring;
   else
     {
-      if (asprintf (&buf, "%s: %s",
-                   result->errstring, strerror (result->errcode)) == -1)
+      if (__asprintf (&buf, "%s: %s",
+                     result->errstring, strerror (result->errcode)) == -1)
        buf = NULL;
 
       /* We don't need the error string anymore.  */
index 31d6d9c..81f902f 100644 (file)
--- a/libc.map
+++ b/libc.map
@@ -439,7 +439,7 @@ GLIBC_2.1 {
     __signbit; __signbitf; __signbitl; __libc_sa_len;
 
     # functions used in other libraries
-    _IO_fclose; _IO_fopen; _IO_fdopen;
+    _IO_fclose; _IO_fopen; _IO_fdopen; __asprintf;
     __syscall_rt_sigqueueinfo;
     __xstat64; __fxstat64; __lxstat64;
     __pread64; __pwrite64;
index 4803470..76e4fac 100644 (file)
@@ -310,6 +310,9 @@ extern int vsnprintf __P ((char *__restrict __s, size_t __maxlen,
 extern int vasprintf __P ((char **__restrict __ptr,
                           __const char *__restrict __f, _G_va_list __arg))
      __attribute__ ((__format__ (__printf__, 2, 0)));
+extern int __asprintf __P ((char **__restrict __ptr,
+                           __const char *__restrict __fmt, ...))
+     __attribute__ ((__format__ (__printf__, 2, 3)));
 extern int asprintf __P ((char **__restrict __ptr,
                          __const char *__restrict __fmt, ...))
      __attribute__ ((__format__ (__printf__, 2, 3)));
index 4922427..bfc4d21 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1995, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1997, 1998 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
@@ -23,7 +23,7 @@
    allocated with malloc and stored in *STRING_PTR.  */
 /* VARARGS2 */
 int
-asprintf (char **string_ptr, const char *format, ...)
+__asprintf (char **string_ptr, const char *format, ...)
 {
   va_list arg;
   int done;
@@ -34,3 +34,4 @@ asprintf (char **string_ptr, const char *format, ...)
 
   return done;
 }
+weak_alias (__asprintf, asprintf)
index 061cedc..a06239d 100644 (file)
 # define LOCALE_PARAM_DECL
 #endif
 
+#if defined _LIBC || defined HAVE_WCHAR_H
+# include <wchar.h>
+#endif
 
 #ifdef USE_WIDE_CHAR
 # include <wctype.h>
-# include <wchar.h>
 # define STRING_TYPE wchar_t
 # define CHAR_TYPE wint_t
 # define L_(Ch) L##Ch
@@ -440,7 +442,7 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM)
   /* The radix character of the current locale.  */
   wchar_t decimal;
   /* The thousands character of the current locale.  */
-  wchar_t thousands;
+  wchar_t thousands = L'\0';
   /* The numeric grouping specification of the current locale,
      in the format described in <locale.h>.  */
   const char *grouping;
@@ -457,18 +459,17 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM)
       else
        {
          /* Figure out the thousands separator character.  */
-         if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
-                     strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0)
-           thousands = (wchar_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
+#if defined _LIBC || defined _HAVE_BTOWC
+         thousands = btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
+         if (thousands == WEOF)
+           thousands = L'\0';
+#endif
          if (thousands == L'\0')
            grouping = NULL;
        }
     }
   else
-    {
-      grouping = NULL;
-      thousands = L'\0';
-    }
+    grouping = NULL;
 
   /* Find the locale's decimal point character.  */
   if (mbtowc ((wchar_t *) &decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT),
index 19e4a52..e4e7b4e 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert string representation of a number into an integer value.
-   Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
+   Copyright (C) 1991, 92, 94, 95, 96, 97, 98 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
@@ -167,9 +167,11 @@ extern int errno;
 # define LOCALE_PARAM_DECL
 #endif
 
+#if defined _LIBC || defined HAVE_WCHAR_H
+# include <wchar.h>
+#endif
 
 #ifdef USE_WIDE_CHAR
-# include <wchar.h>
 # include <wctype.h>
 # define L_(Ch) L##Ch
 # define UCHAR_TYPE wint_t
@@ -247,7 +249,7 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
   struct locale_data *current = loc->__locales[LC_NUMERIC];
 # endif
   /* The thousands character of the current locale.  */
-  wchar_t thousands;
+  wchar_t thousands = L'\0';
   /* The numeric grouping specification of the current locale,
      in the format described in <locale.h>.  */
   const char *grouping;
@@ -260,9 +262,11 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
       else
        {
          /* Figure out the thousands separator character.  */
-         if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
-                     strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0)
-           thousands = (wchar_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
+# if defined _LIBC || defined _HAVE_BTOWC
+         thousands = btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
+         if (thousands == WEOF)
+           thousands = L'\0';
+# endif
          if (thousands == L'\0')
            grouping = NULL;
        }
@@ -299,23 +303,19 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
   else
     negative = 0;
 
-  if (base == 16 && s[0] == L_('0') && TOUPPER (s[1]) == L_('X'))
-    s += 2;
-
-  /* If BASE is zero, figure it out ourselves.  */
-  if (base == 0)
-    if (*s == L_('0'))
-      {
-       if (TOUPPER (s[1]) == L_('X'))
-         {
-           s += 2;
-           base = 16;
-         }
-       else
-         base = 8;
-      }
-    else
-      base = 10;
+  /* Recognize number prefix and if BASE is zero, figure it out ourselves.  */
+  if (*s == L_('0'))
+    {
+      if (TOUPPER (s[1]) == L_('X'))
+       {
+         s += 2;
+         base = 16;
+       }
+      else if (base == 0)
+       base = 8;
+    }
+  else if (base == 0)
+    base = 10;
 
   /* Save the pointer so we can check later if anything happened.  */
   save = s;
@@ -396,7 +396,7 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
     }
 
   /* Return the result of the appropriate sign.  */
-  return (negative ? -i : i);
+  return negative ? -i : i;
 
 noconv:
   /* We must handle a special case here: the base is 0 or 16 and the
index fd46377..2f936e3 100644 (file)
@@ -274,11 +274,8 @@ extern const char *_dl_platform;
 static inline void __attribute__ ((unused))
 dl_platform_init (void)
 {
-  if (_dl_platform == NULL)
-    /* We default to i386 since all instructions understood by the i386
-       are also understood by later processors.  */
-    _dl_platform = "i386";
-  else if (*_dl_platform == '\0')
+  if (_dl_platform != NULL && *_dl_platform == '\0')
+    /* Avoid an empty string which would disturb us.  */
     _dl_platform = NULL;
 }