summaryrefslogtreecommitdiff
path: root/src/enchant.c
diff options
context:
space:
mode:
authorDom Lachowicz <domlachowicz@gmail.com>2008-03-21 02:44:53 +0000
committerDom Lachowicz <domlachowicz@gmail.com>2008-03-21 02:44:53 +0000
commitdec348fad2512e0e4dbc2c09c23ee624661c9704 (patch)
treede76fbfeb77b0492ff83805780492092472050dd /src/enchant.c
parent9cd73d640867f49785196917b8a17bae013be0d6 (diff)
downloadenchant-dec348fad2512e0e4dbc2c09c23ee624661c9704.tar.gz
configure.in: fix uspell dictionary directory. can now load uspell dictionaries
configure.in: point myspell dictionary directory @ your distro's myspell installation configure.in: define enchant's $prefix, so that looking for dictionaries in (eg.) /usr/share/enchant/myspell will still work *.c, *.cpp: look for configuration files, shared libraries, and dictionaries in more places. follow the XDG user-dirs specification more closely, but preserve backward compatability git-svn-id: svn+ssh://svn.abisource.com/svnroot/enchant/trunk@23224 bcba8976-2d24-0410-9c9c-aab3bd5fdfd6
Diffstat (limited to 'src/enchant.c')
-rw-r--r--src/enchant.c285
1 files changed, 164 insertions, 121 deletions
diff --git a/src/enchant.c b/src/enchant.c
index 2d80f18..32f5b6e 100644
--- a/src/enchant.c
+++ b/src/enchant.c
@@ -104,77 +104,107 @@ typedef void (*EnchantPreConfigureFunc) (EnchantProvider * provider,
/********************************************************************************/
/********************************************************************************/
-static char *
-_enchant_get_user_home_dir (void)
+static GSList *
+_enchant_get_user_home_dirs (void)
{
+ GSList *dirs = NULL;
const char* home_dir;
home_dir = enchant_get_registry_value_ex (1, "Config", "Home_Dir");
if (home_dir)
- return (char *)home_dir;
+ dirs = g_slist_append (dirs, g_strdup (home_dir));
home_dir = g_get_home_dir ();
if (home_dir)
- return g_strdup (home_dir);
- return NULL;
+ dirs = g_slist_append (dirs, g_strdup (home_dir));
+
+ return dirs;
}
static void
_enchant_ensure_private_datadir (void)
{
- /* test if ~/.enchant exists */
- char * config_dir;
+ const char * config_dir;
- config_dir = enchant_get_user_config_dir ();
+ config_dir = g_get_user_config_dir();
if (config_dir && !g_file_test (config_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
{
(void)g_remove (config_dir);
g_mkdir_with_parents (config_dir, 0700);
}
-
- g_free (config_dir);
}
-static char *
-enchant_get_user_dir (void)
+static GSList *
+enchant_get_user_dirs (void)
{
- char * base_dir = NULL;
- char * user_dir;
-
-#ifdef _WIN32
- base_dir = g_strdup (g_get_user_config_dir());
-#endif
+ GSList *user_dirs = NULL;
- if (!base_dir)
- base_dir = _enchant_get_user_home_dir ();
+ {
+ const char * user_config_dir;
+
+ user_config_dir = g_get_user_config_dir();
+
+ if (user_config_dir)
+ user_dirs = g_slist_append (user_dirs, g_build_filename (user_config_dir,
+ "enchant",
+ NULL));
+ }
- if(base_dir)
{
- user_dir = g_build_filename (base_dir,
- ENCHANT_USER_PATH_EXTENSION,
- NULL);
- g_free(base_dir);
- return user_dir;
+ GSList *home_dirs = NULL, *dir;
+ home_dirs = _enchant_get_user_home_dirs ();
+
+ for (dir = home_dirs; dir; dir = dir->next)
+ {
+ user_dirs = g_slist_append (user_dirs,
+ g_build_filename (dir->data,
+ ENCHANT_USER_PATH_EXTENSION,
+ NULL));
+ }
+
+ g_slist_foreach (home_dirs, (GFunc)g_free, NULL);
+ g_slist_free (home_dirs);
}
- else
- return NULL;
+
+ return user_dirs;
}
/* place to look for system level providers */
-static char *
-enchant_get_module_dir (void)
+static GSList *
+enchant_get_module_dirs (void)
{
+ GSList *module_dirs = NULL;
+
char * module_dir = NULL;
char * prefix = NULL;
+ {
+ char* user_module_dir;
+
+ user_module_dir = enchant_get_registry_value_ex (1, "Config", "Module_Dir");
+ if (user_module_dir)
+ module_dirs = g_slist_append (module_dirs, user_module_dir);
+ }
+
#ifdef XP_TARGET_COCOA
- return g_strdup ([[EnchantResourceProvider instance] moduleFolder]);
+ module_dirs = g_slist_append (module_dirs, g_strdup ([[EnchantResourceProvider instance] moduleFolder]));
#endif
+ {
+ GSList *user_dirs, *iter;
+
+ user_dirs = enchant_get_user_dirs();
+
+ for (iter = user_dirs; iter; iter = iter->next)
+ module_dirs = g_slist_append (module_dirs, iter->data);
+
+ g_slist_free (user_dirs);
+ }
+
/* Look for explicitly set registry values */
module_dir = enchant_get_registry_value_ex (0, "Config", "Module_Dir");
if (module_dir)
- return module_dir;
+ module_dirs = g_slist_append (module_dirs, module_dir);
/* Dynamically locate library and search for modules relative to it. */
prefix = enchant_get_prefix_dir();
@@ -182,39 +212,30 @@ enchant_get_module_dir (void)
{
module_dir = g_build_filename(prefix,"lib","enchant",NULL);
g_free(prefix);
- return module_dir;
+ module_dirs = g_slist_append (module_dirs, module_dir);
}
#if defined(ENCHANT_GLOBAL_MODULE_DIR)
- return g_strdup (ENCHANT_GLOBAL_MODULE_DIR);
-#else
- return NULL;
+ module_dirs = g_slist_append (module_dirs, g_strdup (ENCHANT_GLOBAL_MODULE_DIR));
#endif
-}
-
-static char *
-enchant_get_user_module_dir (void)
-{
- char* user_module_dir;
- user_module_dir = enchant_get_registry_value_ex (1, "Config", "Module_Dir");
- if (user_module_dir)
- return user_module_dir;
- return enchant_get_user_dir();
+ return module_dirs;
}
-static char *
-enchant_get_conf_dir (void)
+static GSList *
+enchant_get_conf_dirs (void)
{
+ GSList *conf_dirs = NULL;
+ char * ordering_dir = NULL, * prefix = NULL;;
+
#ifdef XP_TARGET_COCOA
- return g_strdup ([[EnchantResourceProvider instance] configFolder]);
+ conf_dirs = g_slist_append (conf_dirs, g_strdup ([[EnchantResourceProvider instance] configFolder]));
#endif
- char * ordering_dir = NULL, * prefix = NULL;;
/* Look for explicitly set registry values */
ordering_dir = enchant_get_registry_value_ex (0, "Config", "Data_Dir");
if (ordering_dir)
- return ordering_dir;
+ conf_dirs = g_slist_append (conf_dirs, ordering_dir);
/* Dynamically locate library and search for files relative to it. */
prefix = enchant_get_prefix_dir();
@@ -222,14 +243,14 @@ enchant_get_conf_dir (void)
{
ordering_dir = g_build_filename(prefix,"share","enchant",NULL);
g_free(prefix);
- return ordering_dir;
+ conf_dirs = g_slist_append (conf_dirs, ordering_dir);
}
#if defined(ENCHANT_GLOBAL_ORDERING)
- return g_strdup (ENCHANT_GLOBAL_ORDERING);
-#else
- return NULL;
+ conf_dirs = g_slist_append (conf_dirs, g_strdup (ENCHANT_GLOBAL_ORDERING));
#endif
+
+ return conf_dirs;
}
/**
@@ -243,16 +264,19 @@ enchant_get_conf_dir (void)
*
* This API is private to the providers.
*/
-ENCHANT_MODULE_EXPORT (char *)
-enchant_get_user_config_dir (void)
+ENCHANT_MODULE_EXPORT (GSList *)
+enchant_get_user_config_dirs (void)
{
+ GSList *dirs;
char* user_config;
+ dirs = enchant_get_user_dirs();
+
user_config = enchant_get_registry_value_ex (1, "Config", "Data_Dir");
if (user_config)
- return user_config;
+ dirs = g_slist_prepend (dirs, user_config);
- return enchant_get_user_dir();
+ return dirs;
}
/*
@@ -486,30 +510,51 @@ enchant_session_new_with_pwl (EnchantProvider * provider,
}
static EnchantSession *
-enchant_session_new (EnchantProvider *provider, const char * const lang)
+_enchant_session_new (EnchantProvider *provider, const char * const user_config_dir,
+ const char * const lang, gboolean fail_if_no_pwl)
{
+ char *filename, *dic, *excl;
EnchantSession * session;
- char * user_config_dir, * dic = NULL, *excl = NULL, * filename;
- user_config_dir = enchant_get_user_config_dir ();
- if (user_config_dir)
- {
- _enchant_ensure_private_datadir ();
- filename = g_strdup_printf ("%s.dic", lang);
- dic = g_build_filename (user_config_dir, filename, NULL);
- g_free (filename);
+ if (!user_config_dir || !lang)
+ return NULL;
+
+ filename = g_strdup_printf ("%s.dic", lang);
+ dic = g_build_filename (user_config_dir, filename, NULL);
+ g_free (filename);
+
+ filename = g_strdup_printf ("%s.exc", lang);
+ excl = g_build_filename (user_config_dir, filename, NULL);
+ g_free (filename);
+
+ session = enchant_session_new_with_pwl (provider, dic, excl, lang, fail_if_no_pwl);
+
+ g_free (dic);
- filename = g_strdup_printf ("%s.exc", lang);
- excl = g_build_filename (user_config_dir, filename, NULL);
- g_free (filename);
+ return session;
+}
+
+static EnchantSession *
+enchant_session_new (EnchantProvider *provider, const char * const lang)
+{
+ EnchantSession * session = NULL;
+ GSList *user_config_dirs, *iter;
+
+ _enchant_ensure_private_datadir ();
- g_free (user_config_dir);
+ user_config_dirs = enchant_get_user_config_dirs ();
+ for (iter = user_config_dirs; iter != NULL && session == NULL; iter = iter->next)
+ {
+ session =_enchant_session_new (provider, iter->data, lang, TRUE);
}
- session = enchant_session_new_with_pwl (provider, dic, excl, lang, FALSE);
-
- if (dic)
- g_free (dic);
+ g_slist_foreach (user_config_dirs, (GFunc)g_free, NULL);
+ g_slist_free (user_config_dirs);
+
+ if (!session)
+ {
+ session =_enchant_session_new (provider, g_get_user_config_dir(), lang, FALSE);
+ }
return session;
}
@@ -1367,25 +1412,17 @@ enchant_load_providers_in_dir (EnchantBroker * broker, const char *dir_name)
static void
enchant_load_providers (EnchantBroker * broker)
{
- gchar *user_dir, *system_dir;
-
- /* load USER providers first. since the GSList is ordered,
- this intentionally gives preference to USER providers */
-
- user_dir = enchant_get_user_module_dir ();
+ GSList *module_dirs, *iter;
- if (user_dir)
+ module_dirs = enchant_get_module_dirs();
+
+ for (iter = module_dirs; iter; iter = iter->next)
{
- enchant_load_providers_in_dir (broker, user_dir);
- g_free (user_dir);
+ enchant_load_providers_in_dir (broker, iter->data);
}
- system_dir = enchant_get_module_dir ();
- if (system_dir)
- {
- enchant_load_providers_in_dir (broker, system_dir);
- g_free (system_dir);
- }
+ g_slist_foreach (module_dirs, (GFunc)g_free, NULL);
+ g_slist_free (module_dirs);
}
static void
@@ -1424,28 +1461,22 @@ enchant_load_ordering_from_file (EnchantBroker * broker, const char * file)
static void
enchant_load_provider_ordering (EnchantBroker * broker)
{
- char * ordering_file, * user_config_dir, * global_config_dir;
+ GSList *conf_dirs, *iter;
broker->provider_ordering = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
- global_config_dir = enchant_get_conf_dir ();
- if (global_config_dir)
+ /* we want the user's dirs to show up last, so they override system dirs */
+ conf_dirs = g_slist_reverse (enchant_get_conf_dirs ());
+ for (iter = conf_dirs; iter; iter = iter->next)
{
- ordering_file = g_build_filename (global_config_dir, "enchant.ordering", NULL);
+ char *ordering_file;
+ ordering_file = g_build_filename (iter->data, "enchant.ordering", NULL);
enchant_load_ordering_from_file (broker, ordering_file);
- g_free (ordering_file);
- g_free (global_config_dir);
- }
-
- user_config_dir = enchant_get_user_config_dir ();
-
- if (user_config_dir)
- {
- ordering_file = g_build_filename (user_config_dir, "enchant.ordering", NULL);
- enchant_load_ordering_from_file (broker, ordering_file);
- g_free (ordering_file);
- g_free (user_config_dir);
+ g_free (ordering_file);
}
+
+ g_slist_foreach (conf_dirs, (GFunc)g_free, NULL);
+ g_slist_free (conf_dirs);
}
static GSList *
@@ -2120,22 +2151,34 @@ enchant_get_prefix_dir(void)
char * prefix = NULL;
#ifdef _WIN32
- /* Dynamically locate library and return containing directory */
- HINSTANCE hInstance = GetModuleHandle(L"libenchant");
- if(hInstance != NULL)
- {
- WCHAR dll_path[MAX_PATH];
+ if (!prefix) {
+ /* Dynamically locate library and return containing directory */
+ HINSTANCE hInstance = GetModuleHandle(L"libenchant");
+ if(hInstance != NULL)
+ {
+ WCHAR dll_path[MAX_PATH];
- if(GetModuleFileName(hInstance,dll_path,MAX_PATH))
- {
- gchar* utf8_dll_path = g_utf16_to_utf8 (dll_path, -1, NULL, NULL, NULL);
- prefix = g_path_get_dirname(utf8_dll_path);
- g_free(utf8_dll_path);
- }
+ if(GetModuleFileName(hInstance,dll_path,MAX_PATH))
+ {
+ gchar* utf8_dll_path = g_utf16_to_utf8 (dll_path, -1, NULL, NULL, NULL);
+ prefix = g_path_get_dirname(utf8_dll_path);
+ g_free(utf8_dll_path);
+ }
+ }
+ }
+#endif
+
+#if defined(ENABLE_BINRELOC)
+ if (!prefix) {
+ /* Use standard binreloc PREFIX macro */
+ prefix = gbr_find_prefix(NULL);
+ }
+#endif
+
+#if defined(ENCHANT_PREFIX_DIR)
+ if (!prefix) {
+ prefix = g_strdup (ENCHANT_PREFIX_DIR);
}
-#elif defined(ENABLE_BINRELOC)
- /* Use standard binreloc PREFIX macro */
- prefix = gbr_find_prefix(NULL);
#endif
return prefix;