summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReuben Thomas <rrt@sc3d.org>2017-03-06 22:11:29 +0000
committerReuben Thomas <rrt@sc3d.org>2017-03-06 23:30:36 +0000
commit8c2daf870b6edb5e2504c0da44cf363880b61511 (patch)
tree6a49d275c60b393251d79941d260a8183788bd57
parentd5aafe00da470b88f41f5f0ecc296ccbf1d2f0ba (diff)
downloadenchant-8c2daf870b6edb5e2504c0da44cf363880b61511.tar.gz
Overhaul configuration mechanisms
Have only one user_config_dir, so change API to enchant_get_user_config_dir, returning a char *. Make ENCHANT_CONFIG_DIR override it, not supplement it: this is intended for use by applications embedding Enchant which want to cut off its external configuration, and for testing. Look for modules only in one place, under the given prefix (which can be overridden by ENCHANT_PREFIX_DIR). The system enchant.ordering is moved to sysconfdir from pkglibdir. Little point having two separate files, but make it configurable by the sysadmin. Fix default path relative to g_get_system_data_dirs for finding hunspell dictionaries (was still using one more suited to myspell). Make a couple of C++ fixes to the uspell provider. Not currently being built. Don’t look for Enchant config directly in home directory any more. Rename some internal functions without leadiing underscore. No point doing this for merely static functions, as we don’t with most names. Only leave underscores where there is already a function with the name without the underscore. Reverse the order of directories in enchant_get_conf_dirs, so it doesn’t have to be reversed by its only caller. Update relevant tests.
-rw-r--r--providers/enchant_hunspell.cpp31
-rw-r--r--providers/enchant_uspell.cpp22
-rw-r--r--src/Makefile.am2
-rw-r--r--src/enchant-provider.h4
-rw-r--r--src/lib.c207
-rw-r--r--tests/Makefile.am6
-rw-r--r--unittests/provider/enchant_provider_get_prefix_dir_tests.cpp1
-rw-r--r--unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp30
8 files changed, 72 insertions, 231 deletions
diff --git a/providers/enchant_hunspell.cpp b/providers/enchant_hunspell.cpp
index 5a77f00..e286dcf 100644
--- a/providers/enchant_hunspell.cpp
+++ b/providers/enchant_hunspell.cpp
@@ -173,31 +173,16 @@ HunspellChecker::suggestWord(const char* const utf8Word, size_t len, size_t *nsu
static GSList *
hunspell_checker_get_dictionary_dirs ()
{
- GSList *dirs = NULL;
+ GSList *dirs = nullptr;
- {
- GSList *config_dirs, *iter;
-
- config_dirs = enchant_get_user_config_dirs ();
-
- for (iter = config_dirs; iter; iter = iter->next)
- {
- dirs = g_slist_append (dirs, g_build_filename (static_cast<const gchar *>(iter->data),
- "hunspell", nullptr));
- }
-
- g_slist_free_full (config_dirs, free);
- }
+ char * config_dir = enchant_get_user_config_dir ();
+ dirs = g_slist_append (dirs, g_build_filename (config_dir, "hunspell", nullptr));
+ g_free (config_dir);
- {
- const gchar* const * system_data_dirs = g_get_system_data_dirs ();
- const gchar* const * iter;
-
- for (iter = system_data_dirs; *iter; iter++)
- {
- dirs = g_slist_append (dirs, g_build_filename (*iter, "hunspell", "dicts", nullptr));
- }
- }
+ for (const gchar* const * iter = g_get_system_data_dirs (); *iter; iter++)
+ {
+ dirs = g_slist_append (dirs, g_build_filename (*iter, "hunspell", nullptr));
+ }
/* Dynamically locate library and search for modules relative to it. */
char * enchant_prefix = enchant_get_prefix_dir();
diff --git a/providers/enchant_uspell.cpp b/providers/enchant_uspell.cpp
index 9ed0c88..bd7bdab 100644
--- a/providers/enchant_uspell.cpp
+++ b/providers/enchant_uspell.cpp
@@ -55,21 +55,11 @@ static const size_t MAXCHARS = 100; // maximum number of bytes of utf8 or chars
static GSList *
uspell_checker_get_dictionary_dirs (EnchantBroker * broker)
{
- GSList *dirs = NULL;
+ GSList *dirs = nullptr;
- {
- GSList *config_dirs, *iter;
-
- config_dirs = enchant_get_user_config_dirs ();
-
- for (iter = config_dirs; iter; iter = iter->next)
- {
- dirs = g_slist_append (dirs, g_build_filename ((const gchar *)iter->data,
- "uspell", NULL));
- }
-
- g_slist_free_full (config_dirs, free);
- }
+ char * config_dir = enchant_get_user_config_dir ();
+ dirs = g_slist_append (dirs, g_build_filename (config_dir, "uspell", nullptr));
+ g_free (config_dir);
{
const gchar* const * system_data_dirs = g_get_system_data_dirs ();
@@ -77,7 +67,7 @@ uspell_checker_get_dictionary_dirs (EnchantBroker * broker)
for (iter = system_data_dirs; *iter; iter++)
{
- dirs = g_slist_append (dirs, g_build_filename (*iter, "uspell", "dicts", NULL));
+ dirs = g_slist_append (dirs, g_build_filename (*iter, "uspell", "dicts", nullptr));
}
}
@@ -85,7 +75,7 @@ uspell_checker_get_dictionary_dirs (EnchantBroker * broker)
char * enchant_prefix = enchant_get_prefix_dir();
if(enchant_prefix)
{
- char * uspell_prefix = g_build_filename(enchant_prefix, "share", "enchant", "uspell", NULL);
+ char * uspell_prefix = g_build_filename(enchant_prefix, "share", "enchant", "uspell", nullptr);
g_free(enchant_prefix);
dirs = g_slist_append (dirs, uspell_prefix);
}
diff --git a/src/Makefile.am b/src/Makefile.am
index 05f82f0..e070c83 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,7 +2,7 @@ AM_CPPFLAGS = -I$(top_srcdir) $(ISYSTEM)$(top_builddir)/lib $(ISYSTEM)$(top_srcd
lib_LTLIBRARIES = libenchant.la
-libenchant_la_CPPFLAGS = $(AM_CPPFLAGS) -DENCHANT_GLOBAL_MODULE_DIR=\"$(libdir)/enchant\" -DENCHANT_GLOBAL_ORDERING=\"$(datadir)/enchant\" -D_ENCHANT_BUILD=1 -DENCHANT_VERSION_STRING=\"@ENCHANT_MAJOR_VERSION@.@ENCHANT_MINOR_VERSION@.@ENCHANT_MICRO_VERSION@\"
+libenchant_la_CPPFLAGS = $(AM_CPPFLAGS) -DENCHANT_SYSTEM_ORDERING=\"$(sysconfdir)/enchant\" -D_ENCHANT_BUILD=1 -DENCHANT_VERSION_STRING=\"@ENCHANT_MAJOR_VERSION@.@ENCHANT_MINOR_VERSION@.@ENCHANT_MICRO_VERSION@\"
libenchant_la_LIBADD = $(top_builddir)/lib/libgnu.la $(ENCHANT_LIBS)
libenchant_la_LDFLAGS = -no-undefined -export-symbols-regex '^enchant_.*'
diff --git a/src/enchant-provider.h b/src/enchant-provider.h
index d8dd2ac..d4ca9d8 100644
--- a/src/enchant-provider.h
+++ b/src/enchant-provider.h
@@ -47,8 +47,8 @@ typedef struct str_enchant_provider EnchantProvider;
ENCHANT_MODULE_EXPORT(char *)
enchant_get_user_language(void);
-ENCHANT_MODULE_EXPORT (GSList *)
- enchant_get_user_config_dirs (void);
+ENCHANT_MODULE_EXPORT (char *)
+ enchant_get_user_config_dir (void);
ENCHANT_MODULE_EXPORT(char *)
enchant_get_prefix_dir(void);
diff --git a/src/lib.c b/src/lib.c
index d8b0c44..1e67d5d 100644
--- a/src/lib.c
+++ b/src/lib.c
@@ -44,15 +44,6 @@
#include "pwl.h"
#include "unused-parameter.h"
-#if defined(__APPLE__) && defined(__MACH__)
-#define ENCHANT_USER_PATH_EXTENSION "Library", "Application Support", "Enchant"
-#elif defined(_WIN32)
-#define ENCHANT_USER_PATH_EXTENSION "enchant"
-#else
-#define ENCHANT_USER_PATH_EXTENSION ".enchant"
-#endif
-
-/********************************************************************************/
/********************************************************************************/
struct str_enchant_broker
@@ -94,23 +85,8 @@ typedef void (*EnchantPreConfigureFunc) (EnchantProvider * provider,
/********************************************************************************/
/********************************************************************************/
-static GSList *
-_enchant_get_user_home_dirs (void)
-{
- GSList *dirs = NULL;
- const char* home_dir;
-
- home_dir = g_get_home_dir ();
- if (home_dir)
- {
- dirs = g_slist_append (dirs, strdup (home_dir));
- }
-
- return dirs;
-}
-
static void
-_enchant_ensure_dir_exists (const char* dir)
+enchant_ensure_dir_exists (const char* dir)
{
if (dir && !g_file_test (dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
{
@@ -119,141 +95,34 @@ _enchant_ensure_dir_exists (const char* dir)
}
}
-static GSList *
-_enchant_get_dirs_from_string (const char * string)
-{
- char **tokens;
- GSList *dirs = NULL;
-
-#ifdef _WIN32
- tokens = g_strsplit (string, ";", 0);
-#else
- tokens = g_strsplit (string, ":", 0);
-#endif
- if (tokens != NULL) {
- int i;
- for (i = 0; tokens[i]; i++)
- {
- char *token = g_strstrip(tokens[i]);
- dirs = g_slist_append (dirs, strdup (token));
- }
-
- g_strfreev (tokens);
- }
-
- return dirs;
-}
-
-ENCHANT_MODULE_EXPORT (GSList *)
-enchant_get_user_config_dirs (void)
-{
- GSList *user_dirs = NULL;
-
- {
- /* Use ENCHANT_CONFIG_DIR env var */
- const gchar* env = g_getenv("ENCHANT_CONFIG_DIR");
- if (env) {
- char * config_dir = g_filename_to_utf8(env, -1, NULL, NULL, NULL);
- if (config_dir)
- {
- user_dirs = g_slist_append (user_dirs, config_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));
- }
-
- {
- 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_free_full (home_dirs, free);
- }
-
- return user_dirs;
-}
-
-/* place to look for system level providers */
-static GSList *
-enchant_get_module_dirs (void)
+ENCHANT_MODULE_EXPORT (char *)
+enchant_get_user_config_dir (void)
{
- GSList *module_dirs = NULL;
-
- char * module_dir = NULL;
- char * prefix = NULL;
-
- {
- GSList *user_dirs, *iter;
-
- user_dirs = enchant_get_user_config_dirs();
-
- for (iter = user_dirs; iter; iter = iter->next)
- module_dirs = g_slist_append (module_dirs, iter->data);
-
- g_slist_free (user_dirs);
+ const gchar * env = g_getenv("ENCHANT_CONFIG_DIR");
+ if (env) {
+ return g_filename_to_utf8(env, -1, NULL, NULL, NULL);
}
-
-#if defined(ENCHANT_GLOBAL_MODULE_DIR)
- module_dirs = g_slist_append (module_dirs, strdup (ENCHANT_GLOBAL_MODULE_DIR));
-#endif
-
- /* Dynamically locate library and search for modules relative to it. */
- prefix = enchant_get_prefix_dir();
- if(prefix)
- {
- module_dir = g_build_filename(prefix,"lib","enchant",NULL);
- g_free(prefix);
- module_dirs = g_slist_append (module_dirs, module_dir);
- }
-
- return module_dirs;
+ return g_build_filename (g_get_user_config_dir (), "enchant", NULL);
}
static GSList *
enchant_get_conf_dirs (void)
{
- GSList *conf_dirs = NULL, *user_conf_dirs, *iter;
- char * ordering_dir = NULL, * prefix = NULL;
-
- user_conf_dirs = enchant_get_user_config_dirs();
-
- for (iter = user_conf_dirs; iter != NULL; iter = iter->next)
- {
- conf_dirs = g_slist_append (conf_dirs, iter->data);
- }
+ GSList *conf_dirs = NULL;
- g_slist_free (user_conf_dirs);
-
- /* Dynamically locate library and search for files relative to it. */
- prefix = enchant_get_prefix_dir();
- if(prefix)
+ char *prefix = enchant_get_prefix_dir ();
+ if (prefix)
{
- ordering_dir = g_build_filename(prefix,"share","enchant",NULL);
- g_free(prefix);
- conf_dirs = g_slist_append (conf_dirs, ordering_dir);
+ conf_dirs = g_slist_append (conf_dirs, g_build_filename (prefix, "share", "enchant", NULL));
+ g_free (prefix);
}
-#if defined(ENCHANT_GLOBAL_ORDERING)
- conf_dirs = g_slist_append (conf_dirs, strdup (ENCHANT_GLOBAL_ORDERING));
+#if defined(ENCHANT_SYSTEM_ORDERING)
+ conf_dirs = g_slist_append (conf_dirs, strdup (ENCHANT_SYSTEM_ORDERING));
#endif
+ conf_dirs = g_slist_append (conf_dirs, enchant_get_user_config_dir ());
+
return conf_dirs;
}
@@ -441,24 +310,17 @@ _enchant_session_new (EnchantProvider *provider, const char * const user_config_
static EnchantSession *
enchant_session_new (EnchantProvider *provider, const char * const lang)
{
- EnchantSession * session = NULL;
- GSList *user_config_dirs, *iter;
+ char *user_config_dir = enchant_get_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);
- }
+ EnchantSession * session = NULL;
+ session = _enchant_session_new (provider, user_config_dir, lang, TRUE);
- if (session == NULL && user_config_dirs != NULL)
+ if (session == NULL && user_config_dir != NULL)
{
- _enchant_ensure_dir_exists (user_config_dirs->data);
-
- session = _enchant_session_new (provider, user_config_dirs->data, lang, FALSE);
+ enchant_ensure_dir_exists (user_config_dir);
+ session = _enchant_session_new (provider, user_config_dir, lang, FALSE);
}
- g_slist_free_full (user_config_dirs, g_free);
-
return session;
}
@@ -1255,16 +1117,14 @@ enchant_load_providers_in_dir (EnchantBroker * broker, const char *dir_name)
static void
enchant_load_providers (EnchantBroker * broker)
{
- GSList *module_dirs, *iter;
-
- module_dirs = enchant_get_module_dirs();
-
- for (iter = module_dirs; iter; iter = iter->next)
- {
- enchant_load_providers_in_dir (broker, iter->data);
- }
-
- g_slist_free_full (module_dirs, free);
+ char *prefix = enchant_get_prefix_dir ();
+ if (prefix)
+ {
+ char *module_dir = g_build_filename (prefix, "lib", "enchant", NULL);
+ enchant_load_providers_in_dir (broker, module_dir);
+ g_free (module_dir);
+ g_free (prefix);
+ }
}
static void
@@ -1307,8 +1167,7 @@ enchant_load_provider_ordering (EnchantBroker * broker)
broker->provider_ordering = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
- /* we want the user's dirs to show up last, so they override system dirs */
- conf_dirs = g_slist_reverse (enchant_get_conf_dirs ());
+ conf_dirs = enchant_get_conf_dirs ();
for (iter = conf_dirs; iter; iter = iter->next)
{
char *ordering_file;
@@ -1760,7 +1619,7 @@ enchant_broker_free_dict (EnchantBroker * broker, EnchantDict * dict)
}
static int
-_enchant_provider_dictionary_exists (EnchantProvider * provider,
+enchant_provider_dictionary_exists (EnchantProvider * provider,
const char * const tag)
{
int exists = 0;
@@ -1822,7 +1681,7 @@ _enchant_broker_dict_exists (EnchantBroker * broker,
provider = (EnchantProvider *) list->data;
- if (_enchant_provider_dictionary_exists (provider, tag))
+ if (enchant_provider_dictionary_exists (provider, tag))
{
return 1;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 56cd12b..8341520 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -3,13 +3,15 @@ AM_CPPFLAGS = -I$(top_srcdir)/src $(ENCHANT_CFLAGS)
AM_TESTS_ENVIRONMENT = \
ENCHANT_PREFIX_DIR=""; \
export ENCHANT_PREFIX_DIR; \
- rm -f test.pwl enchant; \
+ ENCHANT_CONFIG_DIR="config"; \
+ export ENCHANT_CONFIG_DIR; \
+ rm -f test.pwl lib; \
mkdir -p lib/enchant; \
cp $(top_builddir)/providers/@objdir@/*@shlibext@ lib/enchant || :;
cp $(srcdir)/test.pwl.orig $(builddir)/test.pwl; \
chmod +w $(builddir)/test.pwl;
-DISTCLEANFILES = test.pwl lib/enchant/*@shlibext@
+DISTCLEANFILES = test.pwl lib/enchant/*@shlibext@ config/*
EXTRA_DIST = test.pwl.orig
diff --git a/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp b/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp
index 7dd67c1..990cd7f 100644
--- a/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp
+++ b/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp
@@ -22,6 +22,7 @@
#include <UnitTest++.h>
#include <enchant-provider.h>
#include <glib.h>
+#include <string.h>
#include "EnchantTestFixture.h"
struct EnchantGetPrefixDirTestFixture : EnchantTestFixture{
diff --git a/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp b/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp
index 33f71db..ecbd41c 100644
--- a/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp
+++ b/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp
@@ -22,6 +22,7 @@
#include "EnchantTestFixture.h"
#include <UnitTest++.h>
#include <enchant-provider.h>
+#include <string.h>
/**
* enchant_get_user_config_dir
@@ -38,20 +39,23 @@
TEST_FIXTURE(EnchantTestFixture,
GetUserConfigDir)
{
- GSList * enchantUserConfigDirs = enchant_get_user_config_dirs();
-
- CHECK(enchantUserConfigDirs);
- GSList* iter = enchantUserConfigDirs;
+ std::string enchantUserConfigDir = enchant_get_user_config_dir();
+ fprintf(stderr, "enchantUserConfigDir: %s\n", enchantUserConfigDir.c_str());
std::string expected = getenv("ENCHANT_CONFIG_DIR");
- CHECK_EQUAL(expected, (gchar *) iter->data);
- iter = iter->next;
-
- CHECK_EQUAL(GetEnchantHomeDirFromBase(g_get_user_config_dir()), (gchar*) iter->data);
- iter = iter->next;
+ fprintf(stderr, "ENCHANT_CONFIG_DIR: %s\n", expected.c_str());
+
+ // FIXME: following crashes in UnitTest 1.4 with CHECK_EQUAL: use that when we can require >= 1.6
+ CHECK(expected == enchantUserConfigDir);
+
+ // Check it also works with ENCHANT_CONFIG_DIR unset
+ g_unsetenv("ENCHANT_CONFIG_DIR");
+ std::string enchantUserConfigDir2 = enchant_get_user_config_dir();
+ fprintf(stderr, "updated enchantUserConfigDir2: %s\n", enchantUserConfigDir2.c_str());
+ char *expected2 = g_build_filename (g_get_user_config_dir(), "enchant", NULL);
+ fprintf(stderr, "enchantUserConfigDir (no env var): %s\n", expected2);
+ CHECK(strcmp(expected2, enchantUserConfigDir2.c_str()) == 0);
- expected = GetEnchantHomeDirFromHome(g_get_home_dir());
- std::string actual((char*) iter->data);
- CHECK_EQUAL(expected, actual);
- g_slist_free(enchantUserConfigDirs);
+ // Restore env var
+ g_setenv("ENCHANT_CONFIG_DIR", expected.c_str(), TRUE);
}