# HG changeset patch # User Mikael Berthe # Date 1165143582 -3600 # Node ID 9eaacc0ad3a2fcf313701e0b90ae13bd06b52090 # Parent 641e6c618e5defea81bf007cb69f348ca17c2c0a Use a hash for settings diff -r 641e6c618e5d -r 9eaacc0ad3a2 mcabber/src/commands.c --- a/mcabber/src/commands.c Sat Dec 02 14:24:11 2006 +0100 +++ b/mcabber/src/commands.c Sun Dec 03 11:59:42 2006 +0100 @@ -1573,7 +1573,7 @@ g_free(option_utf8); } -static void dump_alias(void *param, char *k, char *v) +static void dump_alias(char *k, char *v, void *param) { scr_LogPrint(LPRINT_NORMAL|LPRINT_NOTUTF8, "Alias %s = %s", k, v); } @@ -1624,7 +1624,7 @@ } } -static void dump_bind(void *param, char *k, char *v) +static void dump_bind(char *k, char *v, void *param) { scr_LogPrint(LPRINT_NORMAL, "Key %4s is bound to: %s", k, v); } diff -r 641e6c618e5d -r 9eaacc0ad3a2 mcabber/src/settings.c --- a/mcabber/src/settings.c Sat Dec 02 14:24:11 2006 +0100 +++ b/mcabber/src/settings.c Sun Dec 03 11:59:42 2006 +0100 @@ -28,14 +28,9 @@ #include "utils.h" #include "logprint.h" -static GSList *option; -static GSList *alias; -static GSList *binding; - -typedef struct { - gchar *name; - gchar *value; -} T_setting; +static GHashTable *option; +static GHashTable *alias; +static GHashTable *binding; #ifdef HAVE_GPGME /* PGP settings */ static GHashTable *pgpopt; @@ -46,32 +41,21 @@ } T_pgpopt; #endif -static inline GSList **get_list_ptr(guint type) +static inline GHashTable *get_hash(guint type) { - if (type == SETTINGS_TYPE_OPTION) return &option; - else if (type == SETTINGS_TYPE_ALIAS) return &alias; - else if (type == SETTINGS_TYPE_BINDING) return &binding; + if (type == SETTINGS_TYPE_OPTION) return option; + else if (type == SETTINGS_TYPE_ALIAS) return alias; + else if (type == SETTINGS_TYPE_BINDING) return binding; return NULL; } -// Return a pointer to the node with the requested key, or NULL if none found -static GSList *settings_find(GSList *list, const gchar *key) -{ - GSList *ptr; - - if (!list) return NULL; - - for (ptr = list ; ptr; ptr = g_slist_next(ptr)) - if (!strcasecmp(key, ((T_setting*)ptr->data)->name)) - break; - - return ptr; -} - /* -- */ void settings_init(void) { + option = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free); + alias = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free); + binding = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free); #ifdef HAVE_GPGME pgpopt = g_hash_table_new(&g_str_hash, &g_str_equal); #endif @@ -247,31 +231,16 @@ void settings_set(guint type, const gchar *key, const gchar *value) { - GSList **plist; - GSList *sptr; - T_setting *setting; - - plist = get_list_ptr(type); - if (!plist) return; + GHashTable *hash; - sptr = settings_find(*plist, key); - if (sptr) { - // The setting has been found. We will update it or delete it. - setting = (T_setting*)sptr->data; - g_free(setting->value); - if (!value) { - // Let's remove the setting - g_free(setting->name); - *plist = g_slist_delete_link(*plist, sptr); - } else { - // Let's update the setting - setting->value = g_strdup(value); - } - } else if (value) { - setting = g_new(T_setting, 1); - setting->name = g_strdup(key); - setting->value = g_strdup(value); - *plist = g_slist_append(*plist, setting); + hash = get_hash(type); + if (!hash) + return; + + if (!value) { + g_hash_table_remove(hash, key); + } else { + g_hash_table_insert(hash, g_strdup(key), g_strdup(value)); } } @@ -282,16 +251,13 @@ const gchar *settings_get(guint type, const gchar *key) { - GSList **plist; - GSList *sptr; - T_setting *setting; + GHashTable *hash; - plist = get_list_ptr(type); - sptr = settings_find(*plist, key); - if (!sptr) return NULL; + hash = get_hash(type); + if (!hash) + return NULL; - setting = (T_setting*)sptr->data; - return setting->value; + return g_hash_table_lookup(hash, key); } int settings_get_int(guint type, const gchar *key) @@ -344,21 +310,16 @@ // settings_foreach(type, pfunction, param) // Call pfunction(param, key, value) for each setting with requested type. -void settings_foreach(guint type, void (*pfunc)(void *param, char *k, char *v), +void settings_foreach(guint type, void (*pfunc)(char *k, char *v, void *param), void *param) { - GSList **plist; - GSList *ptr; - T_setting *setting; - - plist = get_list_ptr(type); + GHashTable *hash; - if (!*plist) return; + hash = get_hash(type); + if (!hash) + return; - for (ptr = *plist ; ptr; ptr = g_slist_next(ptr)) { - setting = ptr->data; - pfunc(param, setting->name, setting->value); - } + g_hash_table_foreach(hash, (GHFunc)pfunc, param); } diff -r 641e6c618e5d -r 9eaacc0ad3a2 mcabber/src/settings.h --- a/mcabber/src/settings.h Sat Dec 02 14:24:11 2006 +0100 +++ b/mcabber/src/settings.h Sun Dec 03 11:59:42 2006 +0100 @@ -33,7 +33,7 @@ int settings_get_int(guint type, const gchar *key); const gchar *settings_get_status_msg(enum imstatus status); void settings_foreach(guint type, - void (*pfunc)(void *param, char *k, char *v), + void (*pfunc)(char *k, char *v, void *param), void *param); void settings_pgp_setdisabled(const char *bjid, guint value);