Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 11 Feb 2000 22:11:40 +0000 (22:11 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 11 Feb 2000 22:11:40 +0000 (22:11 +0000)
2000-02-08  Shinya Hanataka  <hanataka@abyss.rim.or.jp>

* locale/weightwc.h: Fix problem with collating-element.

* locale/programs/ld-collate.c (collate_finish): Output wide
character collating-symbol, which has no wide strings.

* locale/programs/ld-collate.c (collate_output): Fix problem with
wide character collating-element.

ChangeLog
locale/programs/ld-collate.c
locale/weightwc.h

index fee8cde..a063eed 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2000-02-08  Shinya Hanataka  <hanataka@abyss.rim.or.jp>
+
+       * locale/weightwc.h: Fix problem with collating-element.
+
+       * locale/programs/ld-collate.c (collate_finish): Output wide
+       character collating-symbol, which has no wide strings.
+
+       * locale/programs/ld-collate.c (collate_output): Fix problem with
+       wide character collating-element.
+
 2000-02-09  Andreas Jaeger  <aj@suse.de>
 
        * time/strptime.c (strptime_internal): Fix pointer dereference.
index 7b85b76..d3f13ad 100644 (file)
@@ -2329,14 +2329,14 @@ collate_output (struct localedef_t *locale, struct charmap_t *charmap,
                if (sizeof (int32_t) == sizeof (int))
                  {
                    obstack_int_grow_fast (&extrapool,
-                                          obstack_object_size (&indirectpool)
-                                          / sizeof (int32_t));
+                                          -(obstack_object_size (&indirectpool)
+                                            / sizeof (int32_t)));
                    obstack_int_grow_fast (&extrapool, runp->nwcs - 1);
                  }
                else
                  {
-                   int32_t i = (obstack_object_size (&indirectpool)
-                                / sizeof (int32_t));
+                   int32_t i = -(obstack_object_size (&indirectpool)
+                                 / sizeof (int32_t));
                    obstack_grow (&extrapool, &i, sizeof (int32_t));
                    i = runp->nwcs - 1;
                    obstack_grow (&extrapool, &i, sizeof (int32_t));
@@ -2367,9 +2367,10 @@ collate_output (struct localedef_t *locale, struct charmap_t *charmap,
                  {
                    weightidx = output_weightwc (&weightpool, collate, curp);
                    if (sizeof (int32_t) == sizeof (int))
-                     obstack_int_grow (&extrapool, weightidx);
+                     obstack_int_grow (&indirectpool, weightidx);
                    else
-                     obstack_grow (&extrapool, &weightidx, sizeof (int32_t));
+                     obstack_grow (&indirectpool, &weightidx,
+                                   sizeof (int32_t));
 
                    curp = curp->wclast;
                  }
@@ -2384,11 +2385,11 @@ collate_output (struct localedef_t *locale, struct charmap_t *charmap,
 
                /* And add the end byte sequence.  Without length this
                    time.  */
-               for (i = 1; i < runp->nwcs; ++i)
+               for (i = 1; i < curp->nwcs; ++i)
                  if (sizeof (int32_t) == sizeof (int))
-                   obstack_int_grow (&extrapool, runp->wcs[i]);
+                   obstack_int_grow (&extrapool, curp->wcs[i]);
                  else
-                   obstack_grow (&extrapool, &runp->wcs[i], sizeof (int32_t));
+                   obstack_grow (&extrapool, &curp->wcs[i], sizeof (int32_t));
              }
            else
              {
index fc517eb..9e5bcf7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Ulrich Drepper, <drepper@cygnus.com>.
 
@@ -51,8 +51,8 @@ findidx (const wint_t **cpp)
       const wint_t *usrc = *cpp;
 
       /* The first thing is the index.  */
-      i = *((int32_t *) cp);
-      cp += sizeof (int32_t);
+      i = cp;
+      ++cp;
 
       /* Next is the length of the byte sequence.  These are always
         short byte sequences so there is no reason to call any
@@ -87,47 +87,36 @@ findidx (const wint_t **cpp)
          /* This is a range of characters.  First decide whether the
             current byte sequence lies in the range.  */
          size_t cnt;
-         size_t offset = 0;
+         size_t offset;
 
-         for (cnt = 0; cnt < nhere; ++cnt)
+         for (cnt = 0; cnt < nhere - 1; ++cnt)
            if (cp[cnt] != usrc[cnt])
              break;
 
-         if (cnt != nhere)
+         if (cnt < nhere - 1)
+           {
+             cp += 2 * nhere;
+             continue;
+           }
+
+         if (cp[nhere - 1] > usrc[nhere -1])
            {
-             if (cp[cnt] > usrc[cnt])
-               {
-                 /* Cannot be in this range.  */
-                 cp += 2 * nhere;
-                 continue;
-               }
-
-             /* Test against the end of the range.  */
-             for (cnt = 0; cnt < nhere; ++cnt)
-               if (cp[nhere + cnt] != usrc[cnt])
-                 break;
-
-             if (cnt != nhere && cp[nhere + cnt] < usrc[cnt])
-               {
-                 /* Cannot be in this range.  */
-                 cp += 2 * nhere;
-                 continue;
-               }
-
-             /* This range matches the next characters.  Now find
-                the offset in the indirect table.  */
-             for (cnt = 0; cp[cnt] == usrc[cnt]; ++cnt);
-
-             do
-               {
-                 offset <<= 8;
-                 offset += usrc[cnt] - cp[cnt];
-               }
-             while (++cnt < nhere);
+             cp += 2 * nhere;
+             continue;
            }
 
+         if (cp[2 * nhere - 1] < usrc[nhere -1])
+           {
+             cp += 2 * nhere;
+             continue;
+           }
+
+         /* This range matches the next characters.  Now find
+            the offset in the indirect table.  */
+         offset = usrc[nhere - 1] - cp[nhere - 1];
          *cpp += nhere;
-         return offset;
+
+         return indirect[-i + offset];
        }
     }