# HG changeset patch # User Mark Doliner # Date 1176663174 0 # Node ID fb6a333f517a9ef2ee75fc736b53c2f5f041d4f4 # Parent fb752e199cefc2ef8e4d4a62ce8ffbec110d8411# Parent fce68761da8c07a16cf7fe4ffd517bb8975c0d3f merge of '495fbd738a23f24591f098b137d932381b6bc8ad' and '73ec1481dfb8cc0a42c4e942714c9652e7bd16eb' diff -r fb752e199cef -r fb6a333f517a libpurple/util.c --- a/libpurple/util.c Sun Apr 15 18:44:44 2007 +0000 +++ b/libpurple/util.c Sun Apr 15 18:52:54 2007 +0000 @@ -134,14 +134,14 @@ accumulator |= str[i] - 48; else { - switch(str[i]) + switch(tolower(str[i])) { - case 'a': case 'A': accumulator |= 10; break; - case 'b': case 'B': accumulator |= 11; break; - case 'c': case 'C': accumulator |= 12; break; - case 'd': case 'D': accumulator |= 13; break; - case 'e': case 'E': accumulator |= 14; break; - case 'f': case 'F': accumulator |= 15; break; + case 'a': accumulator |= 10; break; + case 'b': accumulator |= 11; break; + case 'c': accumulator |= 12; break; + case 'd': accumulator |= 13; break; + case 'e': accumulator |= 14; break; + case 'f': accumulator |= 15; break; } } diff -r fb752e199cef -r fb6a333f517a libpurple/util.h --- a/libpurple/util.h Sun Apr 15 18:44:44 2007 +0000 +++ b/libpurple/util.h Sun Apr 15 18:52:54 2007 +0000 @@ -1017,7 +1017,10 @@ gchar *purple_utf8_salvage(const char *str); /** - * Compares two UTF-8 strings case-insensitively. + * Compares two UTF-8 strings case-insensitively. This string is + * more expensive than a simple g_utf8_collate() comparison because + * it calls g_utf8_casefold() on each string, which allocates new + * strings. * * @param a The first string. * @param b The second string. diff -r fb752e199cef -r fb6a333f517a pidgin/gtkprefs.c --- a/pidgin/gtkprefs.c Sun Apr 15 18:44:44 2007 +0000 +++ b/pidgin/gtkprefs.c Sun Apr 15 18:52:54 2007 +0000 @@ -610,7 +610,7 @@ ret = 1; } else { /* Neither string is "none", default to normal sort */ - ret = g_utf8_collate(name1,name2); + ret = purple_utf8_strcasecmp(name1,name2); } g_free(name1); diff -r fb752e199cef -r fb6a333f517a pidgin/gtkthemes.c --- a/pidgin/gtkthemes.c Sun Apr 15 18:44:44 2007 +0000 +++ b/pidgin/gtkthemes.c Sun Apr 15 18:52:54 2007 +0000 @@ -63,6 +63,35 @@ } } +static void +pidginthemes_destroy_smiley_theme(struct smiley_theme *theme) +{ + GHashTable *already_freed; + struct smiley_list *wer; + + already_freed = g_hash_table_new(g_direct_hash, g_direct_equal); + for (wer = theme->list; wer != NULL; wer = theme->list) { + while (wer->smileys) { + GtkIMHtmlSmiley *uio = wer->smileys->data; + if (uio->icon) + g_object_unref(uio->icon); + if (g_hash_table_lookup(already_freed, uio->file) == NULL) { + g_free(uio->file); + g_hash_table_insert(already_freed, uio->file, GINT_TO_POINTER(1)); + } + g_free(uio->smile); + g_free(uio); + wer->smileys = g_slist_remove(wer->smileys, uio); + } + theme->list = wer->next; + g_free(wer->sml); + g_free(wer); + } + theme->list = NULL; + + g_hash_table_destroy(already_freed); +} + void pidginthemes_load_smiley_theme(const char *file, gboolean load) { FILE *f = g_fopen(file, "r"); @@ -164,7 +193,7 @@ smiley->file = sfile; smiley->smile = g_strdup(l); smiley->hidden = hidden; - list->smileys = g_slist_append(list->smileys, smiley); + list->smileys = g_slist_prepend(list->smileys, smiley); have_used_sfile = TRUE; } while (isspace(*i)) @@ -180,31 +209,9 @@ fclose(f); if (!theme->name || !theme->desc || !theme->author) { - GSList *already_freed = NULL; - struct smiley_list *wer = theme->list, *wer2; - purple_debug_error("gtkthemes", "Invalid file format, not loading smiley theme from '%s'\n", file); - while (wer) { - while (wer->smileys) { - GtkIMHtmlSmiley *uio = wer->smileys->data; - if (uio->icon) - g_object_unref(uio->icon); - if (!g_slist_find(already_freed, uio->file)) { - g_free(uio->file); - already_freed = g_slist_append(already_freed, uio->file); - } - g_free(uio->smile); - g_free(uio); - wer->smileys = g_slist_remove(wer->smileys, uio); - } - wer2 = wer->next; - g_free(wer->sml); - g_free(wer); - wer = wer2; - } - theme->list = NULL; - g_slist_free(already_freed); + pidginthemes_destroy_smiley_theme(theme); g_free(theme->name); g_free(theme->desc); @@ -217,36 +224,14 @@ } if (new_theme) { - smiley_themes = g_slist_append(smiley_themes, theme); + smiley_themes = g_slist_prepend(smiley_themes, theme); } if (load) { GList *cnv; - if (current_smiley_theme) { - GSList *already_freed = NULL; - struct smiley_list *wer = current_smiley_theme->list, *wer2; - while (wer) { - while (wer->smileys) { - GtkIMHtmlSmiley *uio = wer->smileys->data; - if (uio->icon) - g_object_unref(uio->icon); - if (!g_slist_find(already_freed, uio->file)) { - g_free(uio->file); - already_freed = g_slist_append(already_freed, uio->file); - } - g_free(uio->smile); - g_free(uio); - wer->smileys = g_slist_remove(wer->smileys, uio); - } - wer2 = wer->next; - g_free(wer->sml); - g_free(wer); - wer = wer2; - } - current_smiley_theme->list = NULL; - g_slist_free(already_freed); - } + if (current_smiley_theme) + pidginthemes_destroy_smiley_theme(current_smiley_theme); current_smiley_theme = theme; for (cnv = purple_get_conversations(); cnv != NULL; cnv = cnv->next) {