If a character can't be converted, don't replace it with a NUL byte, but
authorMatthias Clasen <mclasen@redhat.com>
Sat, 5 Aug 2006 21:53:49 +0000 (21:53 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sat, 5 Aug 2006 21:53:49 +0000 (21:53 +0000)
2006-08-05  Matthias Clasen  <mclasen@redhat.com>

* glib/guniprop.c (g_unichar_toupper, g_unichar_tolower)
(real_toupper, real_tolower): If a character can't be converted,
don't replace it with a NUL byte, but leave it unchanged.
(#348491, Nikolai Weibull)

* tests/unicode-caseconv.c: Adapt to this change.

* tests/unicode-caseconv.c (main): Add a comment to point out
a quirk in the test data that we are working around here.

ChangeLog
ChangeLog.pre-2-12
glib/guniprop.c
tests/unicode-caseconv.c

index 94c8e79..bfa541f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-08-05  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/guniprop.c (g_unichar_toupper, g_unichar_tolower) 
+       (real_toupper, real_tolower): If a character can't be converted,
+       don't replace it with a NUL byte, but leave it unchanged.  
+       (#348491, Nikolai Weibull)
+
+       * tests/unicode-caseconv.c: Adapt to this change. 
+
+       * tests/unicode-caseconv.c (main): Add a comment to point out
+       a quirk in the test data that we are working around here.
+
 2006-07-31  Behdad Esfahbod  <behdad@gnome.org>
 
        * glib/guniprop.c (g_unichar_isxdigit): Make it only accept those
index 94c8e79..bfa541f 100644 (file)
@@ -1,3 +1,15 @@
+2006-08-05  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/guniprop.c (g_unichar_toupper, g_unichar_tolower) 
+       (real_toupper, real_tolower): If a character can't be converted,
+       don't replace it with a NUL byte, but leave it unchanged.  
+       (#348491, Nikolai Weibull)
+
+       * tests/unicode-caseconv.c: Adapt to this change. 
+
+       * tests/unicode-caseconv.c (main): Add a comment to point out
+       a quirk in the test data that we are working around here.
+
 2006-07-31  Behdad Esfahbod  <behdad@gnome.org>
 
        * glib/guniprop.c (g_unichar_isxdigit): Make it only accept those
index d80ec03..e90bb7e 100644 (file)
@@ -509,7 +509,12 @@ g_unichar_toupper (gunichar c)
          return g_utf8_get_char (p);
        }
       else
-       return val ? val : c;
+        {
+         /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR,
+          * do not have an uppercase equivalent, in which case val will be
+          * zero. */
+         return val ? val : c;
+       }
     }
   else if (t == G_UNICODE_TITLECASE_LETTER)
     {
@@ -546,7 +551,11 @@ g_unichar_tolower (gunichar c)
          return g_utf8_get_char (p);
        }
       else
-       return val ? val : c;
+       {
+         /* Not all uppercase letters are guaranteed to have a lowercase
+          * equivalent.  If this is the case, val will be zero. */
+         return val ? val : c;
+       }
     }
   else if (t == G_UNICODE_TITLECASE_LETTER)
     {
@@ -825,7 +834,10 @@ real_toupper (const gchar *str,
                    }
                }
 
-             len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL);
+             /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR,
+              * do not have an uppercase equivalent, in which case val will be
+              * zero. */
+             len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL);
            }
        }
       else
@@ -1012,7 +1024,9 @@ real_tolower (const gchar *str,
                    }
                }
 
-             len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL);
+             /* Not all uppercase letters are guaranteed to have a lowercase
+              * equivalent.  If this is the case, val will be zero. */
+             len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL);
            }
        }
       else
index 77d8a9b..0563ab6 100644 (file)
@@ -16,6 +16,7 @@ int main (int argc, char **argv)
   char *filename;
   const char *locale;
   const char *test;
+  const char *expected;
   char *convert;
   char *current_locale = setlocale (LC_CTYPE, NULL);
   gint result = 0;
@@ -57,20 +58,30 @@ int main (int argc, char **argv)
       
       test = strings[1];
 
+      /* gen-casemap-txt.pl uses an empty string when a single character
+       * doesn't have an equivalent in a particular case; since that behavior
+       * is nonsense for multicharacter strings, it would make more sense
+       * to put the expected result .. the original character unchanged. But 
+       * for now, we just work around it here and take the empty string to mean
+       * "same as original"
+       */
+
       convert = g_utf8_strup (test, -1);
-      if (strcmp (convert, strings[4]) != 0)
+      expected = strings[4][0] ? strings[4] : test;
+      if (strcmp (convert, expected) != 0)
        {
          fprintf (stderr, "Failure: toupper(%s) == %s, should have been %s\n",
-                  test, convert, strings[4]);
+                  test, convert, expected);
          result = 1;
        }
       g_free (convert);
 
       convert = g_utf8_strdown (test, -1);
-      if (strcmp (convert, strings[2]) != 0)
+      expected = strings[2][0] ? strings[2] : test;
+      if (strcmp (convert, expected) != 0)
        {
          fprintf (stderr, "Failure: tolower(%s) == %s, should have been %s\n",
-                  test, convert, strings[2]);
+                  test, convert, expected);
          result = 1;
        }
       g_free (convert);