diff options
author | Dom Lachowicz <domlachowicz@gmail.com> | 2005-02-09 03:57:18 +0000 |
---|---|---|
committer | Dom Lachowicz <domlachowicz@gmail.com> | 2005-02-09 03:57:18 +0000 |
commit | 3ad585591e35353e8ad9fec6107d602cace07063 (patch) | |
tree | 2ca7bc841c97c428764e18680d7db47545b16b31 | |
parent | 256c92d86c0bb397dcccf5590980535c9c4b3417 (diff) | |
download | enchant-3ad585591e35353e8ad9fec6107d602cace07063.tar.gz |
function for enumerating providers from aspell, myspell, hspell, uspell
git-svn-id: svn+ssh://svn.abisource.com/svnroot/enchant/trunk@21009 bcba8976-2d24-0410-9c9c-aab3bd5fdfd6
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | src/aspell/aspell_provider.c | 23 | ||||
-rw-r--r-- | src/enchant-provider.h | 9 | ||||
-rw-r--r-- | src/enchant.c | 75 | ||||
-rw-r--r-- | src/enchant.h | 5 | ||||
-rw-r--r-- | src/hspell/hspell_provider.c | 11 | ||||
-rw-r--r-- | src/ispell/ispell_checker.cpp | 14 | ||||
-rw-r--r-- | src/myspell/myspell_checker.cpp | 4 | ||||
-rw-r--r-- | src/uspell/uspell_provider.cpp | 13 |
9 files changed, 107 insertions, 49 deletions
diff --git a/configure.in b/configure.in index e3867aa..f250cda 100644 --- a/configure.in +++ b/configure.in @@ -11,7 +11,7 @@ ENCHANT_MINOR_VERSION=1 dnl 3) Increment when interfaces not changed at all, dnl only bug fixes or internal changes made. dnl 4b) Set to zero when adding, removing or changing interfaces. -ENCHANT_MICRO_VERSION=5 +ENCHANT_MICRO_VERSION=6 dnl dnl Set this too MAJOR_VERSION_PLUS_MINOR_VERSION=`expr $ENCHANT_MAJOR_VERSION + $ENCHANT_MINOR_VERSION` diff --git a/src/aspell/aspell_provider.c b/src/aspell/aspell_provider.c index a03efab..6f1215b 100644 --- a/src/aspell/aspell_provider.c +++ b/src/aspell/aspell_provider.c @@ -135,12 +135,6 @@ aspell_dict_store_replacement (struct str_enchant_dict * me, pspell_manager_save_all_word_lists (manager); } -static void -aspell_dict_free_string_list (EnchantDict * me, char **str_list) -{ - g_strfreev (str_list); -} - static EnchantDict * aspell_provider_request_dict (EnchantProvider * me, const char *const tag) { @@ -175,7 +169,6 @@ aspell_provider_request_dict (EnchantProvider * me, const char *const tag) dict->add_to_personal = aspell_dict_add_to_personal; dict->add_to_session = aspell_dict_add_to_session; dict->store_replacement = aspell_dict_store_replacement; - dict->free_string_list = aspell_dict_free_string_list; return dict; } @@ -239,24 +232,30 @@ aspell_provider_list_dicts (EnchantProvider * me, #if ASPELL_0_50_0 PspellConfig * spell_config; AspellDictInfoList * dlist; + AspellDictInfoEnumeration * dels; + const AspellDictInfo * entry; char ** out_list = NULL; spell_config = new_pspell_config (); dlist = get_aspell_dict_info_list (spell_config); - *out_n_dicts = aspell_dict_info_list_size (dlist); + + *out_n_dicts = 0; + dels = aspell_dict_info_list_elements (dlist); + + /* TODO: Use aspell_dict_info_list_size() once it is implemented and returns non-zero. */ + while ( (entry = aspell_dict_info_enumeration_next(dels)) != 0) + (*out_n_dicts)++; if (*out_n_dicts) { - AspellDictInfoEnumeration * dels; size_t i; out_list = g_new0 (char *, *out_n_dicts + 1); dels = aspell_dict_info_list_elements (dlist); for (i = 0; i < *out_n_dicts; i++) { - const AspellDictInfo * entry; - entry = aspell_dict_info_enumeration_next (dels); + /* XXX: should this be entry->code or entry->name ? */ out_list[i] = g_strdup (entry->code); } @@ -317,6 +316,8 @@ init_enchant_provider (void) provider->dictionary_exists = aspell_provider_dictionary_exists; provider->identify = aspell_provider_identify; provider->describe = aspell_provider_describe; + provider->list_dicts = aspell_provider_list_dicts; + provider->free_string_list = aspell_provider_free_string_list; return provider; } diff --git a/src/enchant-provider.h b/src/enchant-provider.h index 42843bc..7c016fd 100644 --- a/src/enchant-provider.h +++ b/src/enchant-provider.h @@ -84,9 +84,6 @@ struct str_enchant_dict const char *const mis, size_t mis_len, const char *const cor, size_t cor_len); - void (*free_string_list) (struct str_enchant_dict * me, - char **str_list); - void * _reserved[5]; }; @@ -110,6 +107,12 @@ struct str_enchant_provider /* const */ char * (*identify) (struct str_enchant_provider * me); /* const */ char * (*describe) (struct str_enchant_provider * me); + void (*free_string_list) (struct str_enchant_provider * me, + char **str_list); + + char ** (*list_dicts) (struct str_enchant_provider * me, + size_t * out_n_dicts); + void * _reserved[5]; }; diff --git a/src/enchant.c b/src/enchant.c index edffc55..94551e0 100644 --- a/src/enchant.c +++ b/src/enchant.c @@ -378,6 +378,13 @@ enchant_session_clear_error (EnchantSession * session) /********************************************************************************/ static void +enchant_provider_free_string_list (EnchantProvider * provider, char ** string_list) +{ + if (provider && provider->free_string_list) + (*provider->free_string_list) (provider, string_list); +} + +static void enchant_dict_free_string_list_impl (EnchantDict * dict, char **string_list) { EnchantSession * session; @@ -387,9 +394,7 @@ enchant_dict_free_string_list_impl (EnchantDict * dict, char **string_list) session = (EnchantSession*)dict->enchant_private_data; enchant_session_clear_error (session); - - if (dict->free_string_list) - (*dict->free_string_list) (dict, string_list); + enchant_provider_free_string_list (session->provider, string_list); } /** @@ -701,8 +706,6 @@ enchant_dict_describe (EnchantDict * dict, tag = session->language_tag; (*fn) (tag, name, desc, file, user_data); - - return; } /***********************************************************************************/ @@ -1110,7 +1113,7 @@ enchant_broker_request_dict (EnchantBroker * broker, const char *const tag) /** * enchant_broker_describe * @broker: A non-null #EnchantBroker - * @dict: A non-null #EnchantBrokerDescribeFn + * @fn: A non-null #EnchantBrokerDescribeFn * @user_data: Optional user-data * * Enumerates the Enchant providers and tells @@ -1146,6 +1149,66 @@ enchant_broker_describe (EnchantBroker * broker, } /** + * enchant_broker_list_dicts + * @broker: A non-null #EnchantBroker + * @fn: A non-null #EnchantDictDescribeFn + * @user_data: Optional user-data + * + * Enumerates the dictionaries available from + * all Enchant providers. + */ +ENCHANT_MODULE_EXPORT (void) +enchant_broker_list_dicts (EnchantBroker * broker, + EnchantDictDescribeFn fn, + void * user_data) +{ + GSList *list; + GHashTable *tags; + + g_return_if_fail (broker); + g_return_if_fail (fn); + + tags = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + enchant_broker_clear_error (broker); + + for (list = broker->provider_list; list != NULL; list = g_slist_next (list)) + { + EnchantProvider *provider; + GModule *module; + + provider = (EnchantProvider *) list->data; + module = (GModule *) provider->enchant_private_data; + + if (provider->list_dicts) + { + const char * tag, * name, * desc, * file; + size_t n_dicts, i; + char ** dicts; + + dicts = (*provider->list_dicts) (provider, &n_dicts); + name = (*provider->identify) (provider); + desc = (*provider->describe) (provider); + file = g_module_name (module); + + for (i = 0; i < n_dicts; i++) + { + tag = dicts[i]; + if (!g_hash_table_lookup (tags, tag)) + { + g_hash_table_insert (tags, g_strdup (tag), GINT_TO_POINTER(TRUE)); + (*fn) (tag, name, desc, file, user_data); + } + } + + enchant_provider_free_string_list (provider, dicts); + } + } + + g_hash_table_destroy (tags); +} + +/** * enchant_broker_free_dict * @broker: A non-null #EnchantBroker * @dict: A non-null #EnchantDict diff --git a/src/enchant.h b/src/enchant.h index 16b8138..896b5e9 100644 --- a/src/enchant.h +++ b/src/enchant.h @@ -138,6 +138,11 @@ ENCHANT_MODULE_EXPORT (void) EnchantDictDescribeFn fn, void * user_data); +ENCHANT_MODULE_EXPORT (void) + enchant_broker_list_dicts (EnchantBroker * broker, + EnchantDictDescribeFn fn, + void * user_data); + #ifdef __cplusplus } #endif diff --git a/src/hspell/hspell_provider.c b/src/hspell/hspell_provider.c index 5f4e60d..d0760b3 100644 --- a/src/hspell/hspell_provider.c +++ b/src/hspell/hspell_provider.c @@ -181,12 +181,6 @@ hspell_dict_suggest (EnchantDict * me, const char *const word, return sugg_arr; } -static void -hspell_dict_free_string_list (EnchantDict * me, char **str_list) -{ - g_strfreev (str_list); -} - static int hspell_provider_dictionary_exists (struct str_enchant_provider *me, const char *const tag) @@ -225,7 +219,6 @@ hspell_provider_request_dict (EnchantProvider * me, const char *const tag) dict->user_data = (void *) hspell_dict; dict->check = hspell_dict_check; dict->suggest = hspell_dict_suggest; - dict->free_string_list = hspell_dict_free_string_list; return dict; } @@ -301,7 +294,9 @@ init_enchant_provider (void) provider->dictionary_exists = hspell_provider_dictionary_exists; provider->identify = hspell_provider_identify; provider->describe = hspell_provider_describe; - + provider->list_dicts = hspell_provider_list_dicts; + provider->free_string_list = uspell_provider_free_string_list; + return provider; } diff --git a/src/ispell/ispell_checker.cpp b/src/ispell/ispell_checker.cpp index 501d3db..1b50de2 100644 --- a/src/ispell/ispell_checker.cpp +++ b/src/ispell/ispell_checker.cpp @@ -584,12 +584,6 @@ ispell_dict_check (EnchantDict * me, const char *const word, size_t len) return 1; } -static void -ispell_dict_free_string_list (EnchantDict * me, char **str_list) -{ - g_strfreev (str_list); -} - static EnchantDict * ispell_provider_request_dict (EnchantProvider * me, const char *const tag) { @@ -612,7 +606,6 @@ ispell_provider_request_dict (EnchantProvider * me, const char *const tag) dict->user_data = (void *) checker; dict->check = ispell_dict_check; dict->suggest = ispell_dict_suggest; - dict->free_string_list = ispell_dict_free_string_list; // don't implement session or personal return dict; @@ -669,13 +662,14 @@ ispell_provider_list_dictionaries (EnchantProvider * me, nb++; *out_n_dicts = nb; - if(nb == 0) + if (nb == 0) return NULL; char ** out_dicts = g_new (char *, nb + 1); + nb = 0; for (i = 0; i < size_ispell_map; i++) if (ispell_provider_dictionary_exists (me, ispell_map[i].lang)) - out_dicts[i] = g_strdup (ispell_map[i].lang); + out_dicts[nb++] = g_strdup (ispell_map[i].lang); return out_dicts; } @@ -718,6 +712,8 @@ init_enchant_provider (void) provider->dictionary_exists = ispell_provider_dictionary_exists; provider->identify = ispell_provider_identify; provider->describe = ispell_provider_describe; + provider->list_dicts = ispell_provider_list_dictionaries; + provider->free_string_list = ispell_provider_free_string_list; return provider; } diff --git a/src/myspell/myspell_checker.cpp b/src/myspell/myspell_checker.cpp index 5271c54..65bda13 100644 --- a/src/myspell/myspell_checker.cpp +++ b/src/myspell/myspell_checker.cpp @@ -286,7 +286,7 @@ myspell_dict_check (EnchantDict * me, const char *const word, size_t len) } static void -myspell_dict_free_string_list (EnchantDict * me, char **str_list) +myspell_provider_free_string_list (EnchantProvider * me, char **str_list) { g_strfreev (str_list); } @@ -311,7 +311,6 @@ myspell_provider_request_dict(EnchantProvider * me, const char *const tag) dict->user_data = (void *) checker; dict->check = myspell_dict_check; dict->suggest = myspell_dict_suggest; - dict->free_string_list = myspell_dict_free_string_list; // don't implement personal, session return dict; @@ -388,6 +387,7 @@ init_enchant_provider (void) provider->dictionary_exists = myspell_provider_dictionary_exists; provider->identify = myspell_provider_identify; provider->describe = myspell_provider_describe; + provider->free_string_list = myspell_provider_free_string_list; return provider; } diff --git a/src/uspell/uspell_provider.cpp b/src/uspell/uspell_provider.cpp index 4cffeb8..929ca0e 100644 --- a/src/uspell/uspell_provider.cpp +++ b/src/uspell/uspell_provider.cpp @@ -183,12 +183,6 @@ uspell_dict_add_to_session (EnchantDict * me, const char *const word, manager->acceptWord(myWord); } // uspell_dict_add_to_session -static void -uspell_dict_free_string_list (EnchantDict * me, char **str_list) -{ - g_strfreev (str_list); -} - typedef struct { char * language_tag; char * corresponding_uspell_file_name; @@ -371,7 +365,6 @@ uspell_provider_request_dict (EnchantProvider * me, const char *const tag) dict->check = uspell_dict_check; dict->suggest = uspell_dict_suggest; dict->add_to_session = uspell_dict_add_to_session; - dict->free_string_list = uspell_dict_free_string_list; // don't use personal, session - let higher level implement that return dict; @@ -426,7 +419,7 @@ uspell_provider_list_dictionaries (EnchantProvider * me, nb++; *out_n_dicts = nb; - if(nb == 0) + if (nb == 0) return NULL; char ** out_dicts = g_new (char *, nb + 1); @@ -475,7 +468,9 @@ init_enchant_provider (void) provider->dictionary_exists = uspell_provider_dictionary_exists; provider->identify = uspell_provider_identify; provider->describe = uspell_provider_describe; - + provider->list_dicts = uspell_provider_list_dictionaries; + provider->free_string_list = uspell_provider_free_string_list; + return provider; } |