summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Lachowicz <domlachowicz@gmail.com>2005-02-09 03:57:18 +0000
committerDom Lachowicz <domlachowicz@gmail.com>2005-02-09 03:57:18 +0000
commit3ad585591e35353e8ad9fec6107d602cace07063 (patch)
tree2ca7bc841c97c428764e18680d7db47545b16b31
parent256c92d86c0bb397dcccf5590980535c9c4b3417 (diff)
downloadenchant-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.in2
-rw-r--r--src/aspell/aspell_provider.c23
-rw-r--r--src/enchant-provider.h9
-rw-r--r--src/enchant.c75
-rw-r--r--src/enchant.h5
-rw-r--r--src/hspell/hspell_provider.c11
-rw-r--r--src/ispell/ispell_checker.cpp14
-rw-r--r--src/myspell/myspell_checker.cpp4
-rw-r--r--src/uspell/uspell_provider.cpp13
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;
}