Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 24 Jul 2000 21:03:16 +0000 (21:03 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 24 Jul 2000 21:03:16 +0000 (21:03 +0000)
2000-07-24  Jakub Jelinek  <jakub@redhat.com>

* libio/wfiledoalloc.c (_IO_wfile_doallocate): Measure size
in wide characters, not bytes.
* libio/tst_putwc.c (do_test): Add test for writing lots of data
into file.

2000-07-22  Bruno Haible  <haible@clisp.cons.org>

* locale/nl_langinfo.c (nl_langinfo): Accept items belonging to the
new categories LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE,
LC_MEASUREMENT, LC_IDENTIFICATION.

* locale/xlocale.h (struct __locale_struct): Increase size of
__locales array.
* locale/duplocale.c (__duplocale): Copy newly added categories as
well.
* locale/freelocale.c (__freelocale): Free newly added categories.
* locale/newlocale.c (__newlocale): Fix typo in sanity check.
If a base is given, use it, don't simply return it.

2000-07-22  Bruno Haible  <haible@clisp.cons.org>

* crypt/md5-crypt.c (__md5_crypt_r): Avoid gcc warnings: Use pointer
variables, copied_key and copied_salt, instead of boolean variables.

ChangeLog
crypt/md5-crypt.c
libio/tst_putwc.c
libio/wfiledoalloc.c
locale/duplocale.c
locale/freelocale.c
locale/newlocale.c
locale/nl_langinfo.c
locale/xlocale.h

index 4f1ef5a..971ec0c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2000-07-24  Jakub Jelinek  <jakub@redhat.com>
+
+       * libio/wfiledoalloc.c (_IO_wfile_doallocate): Measure size
+       in wide characters, not bytes.
+       * libio/tst_putwc.c (do_test): Add test for writing lots of data
+       into file.
+
+2000-07-22  Bruno Haible  <haible@clisp.cons.org>
+
+       * locale/nl_langinfo.c (nl_langinfo): Accept items belonging to the
+       new categories LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE,
+       LC_MEASUREMENT, LC_IDENTIFICATION.
+
+       * locale/xlocale.h (struct __locale_struct): Increase size of
+       __locales array.
+       * locale/duplocale.c (__duplocale): Copy newly added categories as
+       well.
+       * locale/freelocale.c (__freelocale): Free newly added categories.
+       * locale/newlocale.c (__newlocale): Fix typo in sanity check.
+       If a base is given, use it, don't simply return it.
+
+2000-07-22  Bruno Haible  <haible@clisp.cons.org>
+
+       * crypt/md5-crypt.c (__md5_crypt_r): Avoid gcc warnings: Use pointer
+       variables, copied_key and copied_salt, instead of boolean variables.
+
 2000-07-24  Andreas Jaeger  <aj@suse.de>
 
        * sysdeps/unix/sysv/linux/powerpc/mmap64.c (__mmap64): Fix offset
index c842be5..e99f8ca 100644 (file)
@@ -60,8 +60,8 @@ __md5_crypt_r (key, salt, buffer, buflen)
   size_t key_len;
   size_t cnt;
   char *cp;
-  int key_copied = 0;
-  int salt_copied = 0;
+  char *copied_key = NULL;
+  char *copied_salt = NULL;
 
   /* Find beginning of salt string.  The prefix should normally always
      be present.  Just in case it is not.  */
@@ -75,21 +75,21 @@ __md5_crypt_r (key, salt, buffer, buflen)
   if ((key - (char *) 0) % __alignof__ (md5_uint32) != 0)
     {
       char *tmp = (char *) alloca (key_len + __alignof__ (md5_uint32));
-      key = memcpy (tmp + __alignof__ (md5_uint32)
-                   - (tmp - (char *) 0) % __alignof__ (md5_uint32),
-                   key, key_len);
+      key = copied_key =
+       memcpy (tmp + __alignof__ (md5_uint32)
+               - (tmp - (char *) 0) % __alignof__ (md5_uint32),
+               key, key_len);
       assert ((key - (char *) 0) % __alignof__ (md5_uint32) == 0);
-      key_copied = 1;
     }
 
   if ((salt - (char *) 0) % __alignof__ (md5_uint32) != 0)
     {
       char *tmp = (char *) alloca (salt_len + __alignof__ (md5_uint32));
-      salt = memcpy (tmp + __alignof__ (md5_uint32)
-                    - (tmp - (char *) 0) % __alignof__ (md5_uint32),
-                    salt, salt_len);
+      salt = copied_salt =
+       memcpy (tmp + __alignof__ (md5_uint32)
+               - (tmp - (char *) 0) % __alignof__ (md5_uint32),
+               salt, salt_len);
       assert ((salt - (char *) 0) % __alignof__ (md5_uint32) == 0);
-      salt_copied = 1;
     }
 
   /* Prepare for the real work.  */
@@ -225,10 +225,10 @@ __md5_crypt_r (key, salt, buffer, buflen)
   __md5_finish_ctx (&ctx, alt_result);
   memset (&ctx, '\0', sizeof (ctx));
   memset (&alt_ctx, '\0', sizeof (alt_ctx));
-  if (key_copied)
-    memset ((char *) key, '\0', key_len);
-  if (salt_copied)
-    memset ((char *) salt, '\0', salt_len);
+  if (copied_key != NULL)
+    memset (copied_key, '\0', key_len);
+  if (copied_salt != NULL)
+    memset (copied_salt, '\0', salt_len);
 
   return buffer;
 }
index 142b3bc..60bb232 100644 (file)
@@ -101,6 +101,16 @@ do_test (void)
       res = 1;
     }
 
+  /* Next test: write a bit more than a few bytes.  */
+  fp = fopen (outname, "w");
+  if (fp == NULL)
+    error (EXIT_FAILURE, errno, "cannot open temporary file");
+
+  for (n = 0; n < 4098; ++n)
+    putwc (n & 255, fp);
+
+  fclose (fp);
+
   return res;
 }
 
index 76226e9..4e4ca67 100644 (file)
@@ -82,7 +82,7 @@ _IO_wfile_doallocate (fp)
   if (fp->_fileno < 0 || _IO_SYSSTAT (fp, &st) < 0)
     {
       couldbetty = 0;
-      size = _IO_BUFSIZ * sizeof (wchar_t);
+      size = _IO_BUFSIZ;
 #if 0
       /* do not try to optimise fseek() */
       fp->_flags |= __SNPT;
@@ -92,13 +92,12 @@ _IO_wfile_doallocate (fp)
     {
       couldbetty = S_ISCHR (st.st_mode);
 #if _IO_HAVE_ST_BLKSIZE
-      size = ((st.st_blksize <= 0 ? _IO_BUFSIZ : st.st_blksize)
-             * sizeof (wchar_t));
+      size = st.st_blksize <= 0 ? _IO_BUFSIZ : st.st_blksize;
 #else
-      size = _IO_BUFSIZ * sizeof (wchar_t);
+      size = _IO_BUFSIZ;
 #endif
     }
-  ALLOC_WBUF (p, size, EOF);
+  ALLOC_WBUF (p, size * sizeof (wchar_t), EOF);
   _IO_wsetb (fp, p, p + size, 1);
   if (couldbetty && isatty (fp->_fileno))
     fp->_flags |= _IO_LINE_BUF;
index 2dcc0f5..4b3bc89 100644 (file)
@@ -1,5 +1,5 @@
 /* Duplicate handle for selection of locales.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -42,12 +42,13 @@ __duplocale (__locale_t dataset)
   if (result != NULL)
     {
       int cnt;
-      for (cnt = 0; cnt < LC_ALL; ++cnt)
-       {
-         result->__locales[cnt] = dataset->__locales[cnt];
-         if (result->__locales[cnt]->usage_count < MAX_USAGE_COUNT)
-           ++result->__locales[cnt]->usage_count;
-       }
+      for (cnt = 0; cnt < __LC_LAST; ++cnt)
+       if (cnt != LC_ALL)
+         {
+           result->__locales[cnt] = dataset->__locales[cnt];
+           if (result->__locales[cnt]->usage_count < MAX_USAGE_COUNT)
+             ++result->__locales[cnt]->usage_count;
+         }
     }
 
   /* It's done.  */
index 3cfa527..5e7dcbd 100644 (file)
@@ -1,5 +1,5 @@
 /* Free data allocated by a call to setlocale_r
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -37,8 +37,8 @@ __freelocale (__locale_t dataset)
   /* We modify global data.  */
   __libc_lock_lock (__libc_setlocale_lock);
 
-  for (cnt = 0; cnt < LC_ALL; ++cnt)
-    if (dataset->__locales[cnt]->usage_count != UNDELETABLE)
+  for (cnt = 0; cnt < __LC_LAST; ++cnt)
+    if (cnt != LC_ALL && dataset->__locales[cnt]->usage_count != UNDELETABLE)
       /* We can remove the data.  */
       _nl_remove_locale (cnt, dataset->__locales[cnt]);
 
index 4a2f145..5c0d7ba 100644 (file)
@@ -1,5 +1,5 @@
 /* Return a reference to locale information record.
-   Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -54,7 +54,7 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
     category_mask = (1 << __LC_LAST) - 1 - (1 << LC_ALL);
 
   /* Sanity check for CATEGORY argument.  */
-  if ((category_mask & ~((1 << LC_ALL) - 1 - (1 << LC_ALL))) != 0)
+  if ((category_mask & ~((1 << __LC_LAST) - 1 - (1 << LC_ALL))) != 0)
     ERROR_RETURN;
 
   /* `newlocale' does not support asking for the locale name. */
@@ -63,28 +63,25 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
 
   /* Allocate memory for the result.  */
   if (base != NULL)
-    {
-      if (base != NULL)
-       return base;
-
-      result = *base;
-    }
+    result = *base;
   else
     {
-      /* Fill with pointers to C locale data to .  */
+      /* Fill with pointers to C locale data.  */
       for (cnt = 0; cnt < __LC_LAST; ++cnt)
        if (cnt != LC_ALL)
          result.__locales[cnt] = _nl_C[cnt];
+    }
 
-      /* If no category is to be set we return BASE if available or a
-        dataset using the C locale data.  */
-      if (category_mask == 0)
-       {
-         result_ptr = (__locale_t) malloc (sizeof (struct __locale_struct));
-         *result_ptr = result;
+  /* If no category is to be set we return BASE if available or a
+     dataset using the C locale data.  */
+  if (category_mask == 0)
+    {
+      result_ptr = (__locale_t) malloc (sizeof (struct __locale_struct));
+      if (result_ptr == NULL)
+       return NULL;
+      *result_ptr = result;
 
-         goto update;
-       }
+      goto update;
     }
 
   /* We perhaps really have to load some data.  So we determine the
@@ -175,12 +172,12 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
  update:
   {
     union locale_data_value *ctypes = result_ptr->__locales[LC_CTYPE]->values;
-  result_ptr->__ctype_b = (const unsigned short int *)
-    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)] .string);
-  result_ptr->__ctype_tolower = (const int *)
-    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER)].string);
-  result_ptr->__ctype_toupper = (const int *)
-    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER)].string);
+    result_ptr->__ctype_b = (const unsigned short int *)
+      (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)].string);
+    result_ptr->__ctype_tolower = (const int *)
+      (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER)].string);
+    result_ptr->__ctype_toupper = (const int *)
+      (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER)].string);
   }
 
   return result_ptr;
index 9b0b7c7..5347d79 100644 (file)
@@ -33,7 +33,7 @@ nl_langinfo (item)
   unsigned int index = _NL_ITEM_INDEX (item);
   const struct locale_data *data;
 
-  if (category < 0 || category >= LC_ALL)
+  if (category < 0 || category == LC_ALL || category >= __LC_LAST)
     /* Bogus category: bogus item.  */
     return (char *) "";
 
index 8096080..d1c3f97 100644 (file)
@@ -1,5 +1,5 @@
 /* Definition of locale datatype.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -27,7 +27,8 @@
    go away without warning.  */
 typedef struct __locale_struct
 {
-  struct locale_data *__locales[6];    /* XXX LC_ALL should be used here */
+  /* Note: LC_ALL is not a valid index into this array.  */
+  struct locale_data *__locales[13]; /* 13 = __LC_LAST. */
 
   /* To increase the speed of this solution we add some special members.  */
   const unsigned short int *__ctype_b;