diff --git a/ChangeLog b/ChangeLog index fee8cdec42..a063eed91c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2000-02-08 Shinya Hanataka + + * 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 * time/strptime.c (strptime_internal): Fix pointer dereference. diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index 7b85b760aa..d3f13ada5b 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -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 { diff --git a/locale/weightwc.h b/locale/weightwc.h index fc517eb915..9e5bcf7f4d 100644 --- a/locale/weightwc.h +++ b/locale/weightwc.h @@ -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, . @@ -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) { - 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[nhere - 1] > usrc[nhere -1]) + { + 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]; } }