diff options
author | Reuben Thomas <rrt@sc3d.org> | 2020-09-07 22:06:27 +0100 |
---|---|---|
committer | Reuben Thomas <rrt@sc3d.org> | 2020-09-07 22:06:27 +0100 |
commit | b8a6846a41cdd5e8747756e59c4251de1152e7b1 (patch) | |
tree | 330dab73b9065e40b357983456e68550ea7ac575 /src | |
parent | fd5c21c6f6cd41929196c0415dac30bff65bdaf8 (diff) | |
download | enchant-b8a6846a41cdd5e8747756e59c4251de1152e7b1.tar.gz |
src/lib.c: sort tags in enchant_broker_list_dicts
This makes enchant-lsmod produce more readable output. The order of output
may as well be useful.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.c | 53 |
1 files changed, 26 insertions, 27 deletions
@@ -1156,13 +1156,19 @@ enchant_broker_describe (EnchantBroker * broker, EnchantBrokerDescribeFn fn, voi } } +static gint +_gfunc_strcmp(gconstpointer item1, gconstpointer item2) +{ + return strcmp (item1, item2); +} + void enchant_broker_list_dicts (EnchantBroker * broker, EnchantDictDescribeFn fn, void * user_data) { g_return_if_fail (broker); g_return_if_fail (fn); - GHashTable *tags = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + GHashTable *tag_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); enchant_broker_clear_error (broker); @@ -1177,25 +1183,17 @@ enchant_broker_list_dicts (EnchantBroker * broker, EnchantDictDescribeFn fn, voi for (size_t i = 0; i < n_dicts; i++) { - const char * tag; - - tag = dicts[i]; + const char * tag = dicts[i]; if (enchant_is_valid_dictionary_tag (tag)) { - gpointer ptr; - GSList *providers; - gint this_priority; - - providers = enchant_get_ordered_providers (broker, tag); - this_priority = g_slist_index (providers, provider); + GSList *providers = enchant_get_ordered_providers (broker, tag); + gint this_priority = g_slist_index (providers, provider); if (this_priority != -1) { - gint min_priority; - - min_priority = this_priority + 1; - ptr = g_hash_table_lookup (tags, tag); + gint min_priority = this_priority + 1; + gpointer ptr = g_hash_table_lookup (tag_map, tag); if (ptr != NULL) min_priority = g_slist_index (providers, ptr); if (this_priority < min_priority) - g_hash_table_insert (tags, strdup (tag), provider); + g_hash_table_insert (tag_map, strdup (tag), provider); } g_slist_free (providers); } @@ -1205,25 +1203,26 @@ enchant_broker_list_dicts (EnchantBroker * broker, EnchantDictDescribeFn fn, voi } } + GSList *tags = NULL; GHashTableIter iter; + g_hash_table_iter_init (&iter, tag_map); gpointer key, value; - g_hash_table_iter_init (&iter, tags); while (g_hash_table_iter_next (&iter, &key, &value)) - { - const char * tag, * name, * desc, * file; - EnchantProvider * provider; - GModule *module; + tags = g_slist_insert_sorted (tags, (char *) key, _gfunc_strcmp); - tag = (const char *) key; - provider = (EnchantProvider *) value; - module = (GModule *) provider->enchant_private_data; - name = (*provider->identify) (provider); - desc = (*provider->describe) (provider); - file = g_module_name (module); + for (GSList *ptr = tags; ptr != NULL; ptr = g_slist_next (ptr)) + { + const char *tag = (const char *) ptr->data; + EnchantProvider *provider = (EnchantProvider *) g_hash_table_lookup (tag_map, tag); + GModule *module = (GModule *) provider->enchant_private_data; + const char *name = (*provider->identify) (provider); + const char *desc = (*provider->describe) (provider); + const char *file = g_module_name (module); (*fn) (tag, name, desc, file, user_data); } - g_hash_table_destroy (tags); + g_slist_free (tags); + g_hash_table_destroy (tag_map); } void |