diff options
author | Dom Lachowicz <domlachowicz@gmail.com> | 2003-08-30 23:04:33 +0000 |
---|---|---|
committer | Dom Lachowicz <domlachowicz@gmail.com> | 2003-08-30 23:04:33 +0000 |
commit | 6dfb709b5d07bff8d2075cc2c07236de9845e7b3 (patch) | |
tree | 9295720c2ebe357ca752ef42aab25477a69c6f1a | |
parent | 8d46a343ef7d49dbf489eeedb3c46cd13ee4c38e (diff) | |
download | enchant-6dfb709b5d07bff8d2075cc2c07236de9845e7b3.tar.gz |
enchant now can be run entirely from personal wordlists
git-svn-id: svn+ssh://svn.abisource.com/svnroot/enchant/trunk@20832 bcba8976-2d24-0410-9c9c-aab3bd5fdfd6
-rw-r--r-- | src/enchant++.h | 11 | ||||
-rw-r--r-- | src/enchant.c | 144 | ||||
-rw-r--r-- | src/enchant.h | 2 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/test-enchant.c | 44 | ||||
-rw-r--r-- | tests/test-enchantxx.cpp | 30 | ||||
-rw-r--r-- | tests/test.pwl | 2 |
7 files changed, 171 insertions, 64 deletions
diff --git a/src/enchant++.h b/src/enchant++.h index 9c48127..f0b8ad6 100644 --- a/src/enchant++.h +++ b/src/enchant++.h @@ -170,6 +170,17 @@ namespace enchant return new Dict (dict, m_broker); } + + Dict * request_pwl_dict (const std::string & pwl) { + EnchantDict * dict = enchant_broker_request_pwl_dict (m_broker, pwl.c_str()); + + if (!dict) { + throw Exception (enchant_broker_get_error (m_broker)); + return 0; // not actually reached + } + + return new Dict (dict, m_broker); + } EnchantDictStatus dict_status (const std::string & lang) { return enchant_broker_dictionary_status (m_broker, lang.c_str()); diff --git a/src/enchant.c b/src/enchant.c index 584fc1c..2b473da 100644 --- a/src/enchant.c +++ b/src/enchant.c @@ -191,48 +191,85 @@ typedef struct str_enchant_session #define BUFSIZ 1024 #endif +static void +enchant_session_destroy (EnchantSession * session) +{ + g_hash_table_destroy (session->session); + g_hash_table_destroy (session->personal); + g_free (session->personal_filename); + g_free (session->language_tag); + + if (session->error) + g_free (session->error); + + g_free (session); +} + static EnchantSession * -enchant_session_new (EnchantProvider *provider, const char * const lang) +enchant_session_new_with_pwl (EnchantProvider * provider, const char * const pwl, const char * const lang, + gboolean fail_if_no_pwl) { EnchantSession * session; - char * home_dir, * dic; FILE * f; char line[BUFSIZ]; session = g_new0 (EnchantSession, 1); - session->session = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); session->personal = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); session->provider = provider; session->language_tag = g_strdup (lang); - home_dir = enchant_get_user_home_dir (); - if (home_dir) { - dic = g_strdup_printf ("%s.dic", lang); - session->personal_filename = g_build_filename (home_dir, - ".enchant", - dic, - NULL); - g_free (home_dir); - g_free (dic); + if (pwl) { + session->personal_filename = g_strdup (pwl); /* populate personal filename */ - f = fopen (session->personal_filename, "r"); + f = fopen (pwl, "r"); if (f) { enchant_lock_file (f); while (NULL != (fgets (line, sizeof (line), f))) { g_hash_table_insert (session->personal, g_strdup (line), GINT_TO_POINTER(TRUE)); } - + enchant_unlock_file (f); fclose (f); + } else if (fail_if_no_pwl) { + enchant_session_destroy (session); + return NULL; } + } else if (fail_if_no_pwl) { + enchant_session_destroy (session); + return NULL; } return session; } +static EnchantSession * +enchant_session_new (EnchantProvider *provider, const char * const lang) +{ + EnchantSession * session; + char * home_dir, * dic = NULL, * filename; + + home_dir = enchant_get_user_home_dir (); + if (home_dir) { + filename = g_strdup_printf ("%s.dic", lang); + dic = g_build_filename (home_dir, + ".enchant", + filename, + NULL); + g_free (filename); + g_free (home_dir); + } + + session = enchant_session_new_with_pwl (provider, dic, lang, FALSE); + + if (dic) + g_free (dic); + + return session; +} + static void enchant_session_add (EnchantSession * session, const char * const word, size_t len) { @@ -278,19 +315,6 @@ enchant_session_contains (EnchantSession * session, const char * const word, siz } static void -enchant_session_destroy (EnchantSession * session) -{ - g_hash_table_destroy (session->session); - g_hash_table_destroy (session->personal); - g_free (session->personal_filename); - g_free (session->language_tag); - g_free (session); - - if (session->error) - g_free (session->error); -} - -static void enchant_session_clear_error (EnchantSession * session) { if (session->error) { @@ -767,7 +791,7 @@ enchant_dict_destroyed (gpointer data) session = (EnchantSession*)dict->enchant_private_data; owner = session->provider; - if (owner->dispose_dict) + if (owner && owner->dispose_dict) { (*owner->dispose_dict) (owner, dict); } @@ -852,6 +876,44 @@ enchant_broker_free (EnchantBroker * broker) } /** + * enchant_broker_request_pwl_dict + * + * PWL is a personal wordlist file, 1 entry per line + * + * Returns: + */ +ENCHANT_MODULE_EXPORT (EnchantDict *) +enchant_broker_request_pwl_dict (EnchantBroker * broker, const char *const pwl) +{ + EnchantSession *session; + EnchantDict *dict = NULL; + + g_return_val_if_fail (broker, NULL); + g_return_val_if_fail (pwl && strlen(pwl), NULL); + + enchant_broker_clear_error (broker); + + dict = (EnchantDict*)g_hash_table_lookup (broker->dict_map, (gpointer) pwl); + if (dict) + { + return dict; + } + + session = enchant_session_new_with_pwl (NULL, pwl, "Personal WordList", TRUE); + if (!session) { + broker->error = g_strdup_printf ("Couldn't open personal wordlist '%s'", pwl); + return NULL; + } + + dict = g_new0 (EnchantDict, 1); + dict->enchant_private_data = (void *)session; + + g_hash_table_insert (broker->dict_map, (gpointer)g_strdup (pwl), dict); + + return dict; +} + +/** * enchant_broker_request_dict * @broker: A non-null #EnchantBroker * @tag: The non-null language tag you wish to request a dictionary for ("en_US", "de_DE", ...) @@ -930,11 +992,11 @@ enchant_broker_describe (EnchantBroker * broker, { provider = (EnchantProvider *) list->data; module = (GModule *) provider->enchant_private_data; - + name = (*provider->identify) (provider); desc = (*provider->describe) (provider); file = g_module_name (module); - + (*fn) (name, desc, file, user_data); } } @@ -964,13 +1026,18 @@ enchant_dict_describe (EnchantDict * dict, session = (EnchantSession*)dict->enchant_private_data; provider = session->provider; - module = (GModule *) provider->enchant_private_data; - - name = (*provider->identify) (provider); - desc = (*provider->describe) (provider); - file = g_module_name (module); - tag = session->language_tag; + if (provider) { + module = (GModule *) provider->enchant_private_data; + file = g_module_name (module); + name = (*provider->identify) (provider); + desc = (*provider->describe) (provider); + } else { + file = session->personal_filename; + name = "Personal Wordlist"; + desc = "Personal Wordlist"; + } + tag = session->language_tag; (*fn) (tag, name, desc, file, user_data); return; @@ -995,7 +1062,10 @@ enchant_broker_free_dict (EnchantBroker * broker, EnchantDict * dict) session = (EnchantSession*)dict->enchant_private_data; - g_hash_table_remove (broker->dict_map, session->language_tag); + if (session->provider) + g_hash_table_remove (broker->dict_map, session->language_tag); + else + g_hash_table_remove (broker->dict_map, session->personal_filename); } /** diff --git a/src/enchant.h b/src/enchant.h index 590f392..766029f 100644 --- a/src/enchant.h +++ b/src/enchant.h @@ -86,6 +86,8 @@ ENCHANT_MODULE_EXPORT (void) ENCHANT_MODULE_EXPORT (EnchantDict *) enchant_broker_request_dict (EnchantBroker * broker, const char *const tag); +ENCHANT_MODULE_EXPORT (EnchantDict *) + enchant_broker_request_pwl_dict (EnchantBroker * broker, const char *const pwl); ENCHANT_MODULE_EXPORT (void) enchant_broker_free_dict (EnchantBroker * broker, EnchantDict * dict); diff --git a/tests/Makefile.am b/tests/Makefile.am index 8607083..c990921 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,5 +1,7 @@ INCLUDES=-I$(top_srcdir)/src $(ENCHANT_CFLAGS) +EXTRA_DIST=test.pwl + DEPS= $(top_builddir)/src/libenchant.la ldadd= $(top_builddir)/src/libenchant.la $(ENCHANT_LIBS) diff --git a/tests/test-enchant.c b/tests/test-enchant.c index 640658f..ab1dc58 100644 --- a/tests/test-enchant.c +++ b/tests/test-enchant.c @@ -34,20 +34,20 @@ #include "enchant.h" static void -enumerate_dicts (const char * const name, - const char * const desc, - const char * const file, - void * ud) +enumerate_providers_fn (const char * const name, + const char * const desc, + const char * const file, + void * ud) { printf ("%s: '%s' (%s)\n", name, desc, file); } static void -describe_dict (const char * const lang, - const char * const name, - const char * const desc, - const char * const file, - void * ud) +describe_dict_fn (const char * const lang, + const char * const name, + const char * const desc, + const char * const file, + void * ud) { printf ("%s: %s '%s' (%s)\n", lang, name, desc, file); } @@ -81,7 +81,8 @@ run_dict_tests (EnchantDict * dict) printf ("\t=>%s\n", suggs[j]); } - enchant_dict_free_suggestions (dict, suggs); + if (suggs && n_suggs) + enchant_dict_free_suggestions (dict, suggs); } printf ("Adding 'helllo' to session\n"); @@ -126,13 +127,28 @@ main (int argc, char **argv) } else { - enchant_dict_describe (dict, describe_dict, NULL); - run_dict_tests (dict); - - enchant_broker_describe (broker, enumerate_dicts, NULL); + enchant_dict_describe (dict, describe_dict_fn, NULL); + run_dict_tests (dict); enchant_broker_free_dict (broker, dict); } + dict = enchant_broker_request_pwl_dict (broker, "test.pwl"); + if (!dict) + { + err = enchant_broker_get_error (broker); + if (err) + fprintf (stderr, "Couldn't create personal wordlist dictionary: %s\n", err); + else + fprintf (stderr, "Couldn't create personal wordlist dictionary\n"); + } + else + { + enchant_dict_describe (dict, describe_dict_fn, NULL); + run_dict_tests (dict); + enchant_broker_free_dict (broker, dict); + } + + enchant_broker_describe (broker, enumerate_providers_fn, NULL); enchant_broker_free (broker); return 0; diff --git a/tests/test-enchantxx.cpp b/tests/test-enchantxx.cpp index 8f92ff7..1b2f396 100644 --- a/tests/test-enchantxx.cpp +++ b/tests/test-enchantxx.cpp @@ -34,13 +34,11 @@ #include "enchant.h" #include "enchant++.h" -using namespace enchant; - static void -enumerate_dicts_fn (const char * const name, - const char * const desc, - const char * const file, - void * ud) +enumerate_providers_fn (const char * const name, + const char * const desc, + const char * const file, + void * ud) { printf ("%s: '%s' (%s)\n", name, desc, file); } @@ -56,7 +54,7 @@ describe_dict_fn (const char * const lang, } static void -run_dict_tests (Dict * dict) +run_dict_tests (enchant::Dict * dict) { std::vector<std::string> suggs; size_t i, j; @@ -103,22 +101,28 @@ run_dict_tests (Dict * dict) int main (int argc, char **argv) { - Broker *broker; - Dict *dict; + enchant::Broker *broker; + enchant::Dict *dict; - broker = Broker::instance (); + broker = enchant::Broker::instance (); try { dict = broker->request_dict ("en_US"); dict->describe (describe_dict_fn); + run_dict_tests (dict); + delete dict; + + // test personal wordlist dictionaries + dict = broker->request_pwl_dict ("test.pwl"); + dict->describe (describe_dict_fn); run_dict_tests (dict); - - broker->describe (enumerate_dicts_fn); delete dict; - } catch (Exception & ex) { + } catch (enchant::Exception & ex) { fprintf (stderr, "Couldn't create dictionary for en_US: %s\n", ex.what()); return 1; } + broker->describe (enumerate_providers_fn); + return 0; } diff --git a/tests/test.pwl b/tests/test.pwl new file mode 100644 index 0000000..c6089a7 --- /dev/null +++ b/tests/test.pwl @@ -0,0 +1,2 @@ +hello +tag |