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.
This commit is contained in:
Ulrich Drepper 2000-02-11 22:11:40 +00:00
parent f9a7302fd1
commit 740c223996
3 changed files with 45 additions and 45 deletions

View File

@ -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> 2000-02-09 Andreas Jaeger <aj@suse.de>
* time/strptime.c (strptime_internal): Fix pointer dereference. * time/strptime.c (strptime_internal): Fix pointer dereference.

View File

@ -2329,14 +2329,14 @@ collate_output (struct localedef_t *locale, struct charmap_t *charmap,
if (sizeof (int32_t) == sizeof (int)) if (sizeof (int32_t) == sizeof (int))
{ {
obstack_int_grow_fast (&extrapool, obstack_int_grow_fast (&extrapool,
obstack_object_size (&indirectpool) -(obstack_object_size (&indirectpool)
/ sizeof (int32_t)); / sizeof (int32_t)));
obstack_int_grow_fast (&extrapool, runp->nwcs - 1); obstack_int_grow_fast (&extrapool, runp->nwcs - 1);
} }
else else
{ {
int32_t i = (obstack_object_size (&indirectpool) int32_t i = -(obstack_object_size (&indirectpool)
/ sizeof (int32_t)); / sizeof (int32_t));
obstack_grow (&extrapool, &i, sizeof (int32_t)); obstack_grow (&extrapool, &i, sizeof (int32_t));
i = runp->nwcs - 1; i = runp->nwcs - 1;
obstack_grow (&extrapool, &i, sizeof (int32_t)); 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); weightidx = output_weightwc (&weightpool, collate, curp);
if (sizeof (int32_t) == sizeof (int)) if (sizeof (int32_t) == sizeof (int))
obstack_int_grow (&extrapool, weightidx); obstack_int_grow (&indirectpool, weightidx);
else else
obstack_grow (&extrapool, &weightidx, sizeof (int32_t)); obstack_grow (&indirectpool, &weightidx,
sizeof (int32_t));
curp = curp->wclast; 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 /* And add the end byte sequence. Without length this
time. */ time. */
for (i = 1; i < runp->nwcs; ++i) for (i = 1; i < curp->nwcs; ++i)
if (sizeof (int32_t) == sizeof (int)) if (sizeof (int32_t) == sizeof (int))
obstack_int_grow (&extrapool, runp->wcs[i]); obstack_int_grow (&extrapool, curp->wcs[i]);
else else
obstack_grow (&extrapool, &runp->wcs[i], sizeof (int32_t)); obstack_grow (&extrapool, &curp->wcs[i], sizeof (int32_t));
} }
else else
{ {

View 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. This file is part of the GNU C Library.
Written by Ulrich Drepper, <drepper@cygnus.com>. Written by Ulrich Drepper, <drepper@cygnus.com>.
@ -51,8 +51,8 @@ findidx (const wint_t **cpp)
const wint_t *usrc = *cpp; const wint_t *usrc = *cpp;
/* The first thing is the index. */ /* The first thing is the index. */
i = *((int32_t *) cp); i = cp;
cp += sizeof (int32_t); ++cp;
/* Next is the length of the byte sequence. These are always /* Next is the length of the byte sequence. These are always
short byte sequences so there is no reason to call any 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 /* This is a range of characters. First decide whether the
current byte sequence lies in the range. */ current byte sequence lies in the range. */
size_t cnt; 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]) if (cp[cnt] != usrc[cnt])
break; break;
if (cnt != nhere) if (cnt < nhere - 1)
{ {
if (cp[cnt] > usrc[cnt]) cp += 2 * nhere;
{ continue;
/* 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);
} }
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; *cpp += nhere;
return offset;
return indirect[-i + offset];
} }
} }