summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Lachowicz <domlachowicz@gmail.com>2003-08-30 23:04:33 +0000
committerDom Lachowicz <domlachowicz@gmail.com>2003-08-30 23:04:33 +0000
commit6dfb709b5d07bff8d2075cc2c07236de9845e7b3 (patch)
tree9295720c2ebe357ca752ef42aab25477a69c6f1a
parent8d46a343ef7d49dbf489eeedb3c46cd13ee4c38e (diff)
downloadenchant-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++.h11
-rw-r--r--src/enchant.c144
-rw-r--r--src/enchant.h2
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/test-enchant.c44
-rw-r--r--tests/test-enchantxx.cpp30
-rw-r--r--tests/test.pwl2
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