summary refs log tree commit diff
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
 		{