aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--locale/programs/ld-collate.c25
2 files changed, 24 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index ef1d856bce..9965df01af 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2000-06-28 Ulrich Drepper <drepper@redhat.com>
+ * locale/programs/ld-collate.c (insert_weights): Handle <Uxxxx>
+ symbols in multi-character weights correctly.
+
* wcsmbs/mbrtowc.c: Set flush to 1 for conversion function calls
depending on whether the input string is empty or not.
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index 73a186df26..97059c2593 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -724,8 +724,10 @@ insert_weights (struct linereader *ldfile, struct element_t *elem,
{
if (*cp == '<')
{
- /* Ahh, it's a bsymbol. That's what we want. */
+ /* Ahh, it's a bsymbol or an UCS4 value. If it's
+ the latter we have to unify the name. */
const char *startp = ++cp;
+ size_t len;
while (*cp != '>')
{
@@ -738,9 +740,24 @@ insert_weights (struct linereader *ldfile, struct element_t *elem,
++cp;
}
- charelem = find_element (ldfile, collate, startp,
- cp - startp);
- ++cp;
+ if (cp - startp == 5 && startp[0] == 'U'
+ && isxdigit (startp[1]) && isxdigit (startp[2])
+ && isxdigit (startp[3]) && isxdigit (startp[4]))
+ {
+ unsigned int ucs4 = strtoul (startp + 1, NULL, 16);
+ char *newstr;
+
+ newstr = (char *) xmalloc (10);
+ snprintf (newstr, 10, "U%08X", ucs4);
+ startp = newstr;
+
+ len = 9;
+ }
+ else
+ len = cp - startp;
+
+ charelem = find_element (ldfile, collate, startp, len);
+ ++cp;
}
else
{