Revision: 5992 http://geany.svn.sourceforge.net/geany/?rev=5992&view=rev Author: colombanw Date: 2011-10-03 17:05:41 +0000 (Mon, 03 Oct 2011) Log Message: ----------- Avoid an unnecessary string duplication in utils_str_casecmp()
Modified Paths: -------------- trunk/src/utils.c
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2011-10-03 17:05:25 UTC (rev 5991) +++ trunk/src/utils.c 2011-10-03 17:05:41 UTC (rev 5992) @@ -444,6 +444,25 @@ }
+/* like g_utf8_strdown() but if @str is not valid UTF8, convert it from locale first. + * returns NULL on charset conversion failure */ +static gchar *utf8_strdown(const gchar *str) +{ + gchar *down; + + if (g_utf8_validate(str, -1, NULL)) + down = g_utf8_strdown(str, -1); + else + { + down = g_locale_to_utf8(str, -1, NULL, NULL, NULL); + if (down) + setptr(down, g_utf8_strdown(down, -1)); + } + + return down; +} + + /** * A replacement function for g_strncasecmp() to compare strings case-insensitive. * It converts both strings into lowercase using g_utf8_strdown() and then compare @@ -469,30 +488,17 @@ g_return_val_if_fail(s1 != NULL, 1); g_return_val_if_fail(s2 != NULL, -1);
- tmp1 = g_strdup(s1); - tmp2 = g_strdup(s2); - - /* first ensure strings are UTF-8 */ - if (! g_utf8_validate(s1, -1, NULL)) - setptr(tmp1, g_locale_to_utf8(s1, -1, NULL, NULL, NULL)); - if (! g_utf8_validate(s2, -1, NULL)) - setptr(tmp2, g_locale_to_utf8(s2, -1, NULL, NULL, NULL)); - - if (tmp1 == NULL) - { - g_free(tmp2); + /* ensure strings are UTF-8 and lowercase */ + tmp1 = utf8_strdown(s1); + if (! tmp1) return 1; - } - if (tmp2 == NULL) + tmp2 = utf8_strdown(s2); + if (! tmp2) { g_free(tmp1); return -1; }
- /* then convert the strings into a case-insensitive form */ - setptr(tmp1, g_utf8_strdown(tmp1, -1)); - setptr(tmp2, g_utf8_strdown(tmp2, -1)); - /* compare */ result = strcmp(tmp1, tmp2);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.