From: Matthias Clasen Date: Sat, 5 Aug 2006 21:53:49 +0000 (+0000) Subject: If a character can't be converted, don't replace it with a NUL byte, but X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=994d642cde899e1aaba90a2e01aef68cc719d784;p=dana%2Fcg-glib.git If a character can't be converted, don't replace it with a NUL byte, but 2006-08-05 Matthias Clasen * 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. --- diff --git a/ChangeLog b/ChangeLog index 94c8e797..bfa541fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-08-05 Matthias Clasen + + * 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 * glib/guniprop.c (g_unichar_isxdigit): Make it only accept those diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 94c8e797..bfa541fe 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,15 @@ +2006-08-05 Matthias Clasen + + * 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 * glib/guniprop.c (g_unichar_isxdigit): Make it only accept those diff --git a/glib/guniprop.c b/glib/guniprop.c index d80ec03a..e90bb7e3 100644 --- a/glib/guniprop.c +++ b/glib/guniprop.c @@ -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 diff --git a/tests/unicode-caseconv.c b/tests/unicode-caseconv.c index 77d8a9b0..0563ab6c 100644 --- a/tests/unicode-caseconv.c +++ b/tests/unicode-caseconv.c @@ -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);