spell-entry: Improve robustness of enchant loading and fix 2.0 support

- Add logging and error handling to loading symbols
- Don't load unversioned symbol
- Handle new function names in Enchant 2.0

Closes #2095
This commit is contained in:
Patrick Griffis 2017-11-24 03:51:10 -05:00
parent 228e08543a
commit 0058587958
1 changed files with 51 additions and 35 deletions

View File

@ -159,49 +159,65 @@ initialize_enchant (void)
{
GModule *enchant;
gpointer funcptr;
enchant = g_module_open("libenchant."G_MODULE_SUFFIX, 0);
if (enchant == NULL)
{
#ifndef WIN32
enchant = g_module_open("libenchant.so.1", 0);
if (enchant == NULL)
{
gsize i;
const char * const libnames[] = {
#ifdef G_OS_WIN32
"libenchant.dll",
#endif
#ifdef G_OS_UNIX
"libenchant.so.1",
"libenchant.so.2",
#endif
#ifdef __APPLE__
enchant = g_module_open("libenchant.dylib", 0);
if (enchant == NULL)
"libenchant.dylib",
#endif
return;
}
#else
return;
#endif
}
};
for (i = 0; i < G_N_ELEMENTS(libnames); ++i)
{
enchant = g_module_open(libnames[i], 0);
if (enchant)
{
g_info ("Loaded %s", libnames[i]);
have_enchant = TRUE;
break;
}
}
#define MODULE_SYMBOL(name, func) \
g_module_symbol(enchant, (name), &funcptr); \
(func) = funcptr;
if (!have_enchant)
return;
MODULE_SYMBOL("enchant_broker_init", enchant_broker_init)
MODULE_SYMBOL("enchant_broker_free", enchant_broker_free)
MODULE_SYMBOL("enchant_broker_free_dict", enchant_broker_free_dict)
MODULE_SYMBOL("enchant_broker_list_dicts", enchant_broker_list_dicts)
MODULE_SYMBOL("enchant_broker_request_dict", enchant_broker_request_dict)
#define MODULE_SYMBOL(name, func, alt_name) G_STMT_START { \
const char *funcname = name; \
gboolean ret = g_module_symbol(enchant, funcname, &funcptr); \
if (alt_name) { \
funcname = alt_name; \
ret = g_module_symbol(enchant, funcname, &funcptr); \
} \
if (ret == FALSE) { \
g_warning ("Failed to find enchant symbol %s", funcname); \
have_enchant = FALSE; \
return; \
} \
(func) = funcptr; \
} G_STMT_END;
MODULE_SYMBOL("enchant_dict_add_to_personal", enchant_dict_add_to_personal)
MODULE_SYMBOL("enchant_dict_add_to_session", enchant_dict_add_to_session)
MODULE_SYMBOL("enchant_dict_check", enchant_dict_check)
MODULE_SYMBOL("enchant_dict_describe", enchant_dict_describe)
MODULE_SYMBOL("enchant_broker_init", enchant_broker_init, NULL)
MODULE_SYMBOL("enchant_broker_free", enchant_broker_free, NULL)
MODULE_SYMBOL("enchant_broker_free_dict", enchant_broker_free_dict, NULL)
MODULE_SYMBOL("enchant_broker_list_dicts", enchant_broker_list_dicts, NULL)
MODULE_SYMBOL("enchant_broker_request_dict", enchant_broker_request_dict, NULL)
MODULE_SYMBOL("enchant_dict_add_to_personal", enchant_dict_add_to_personal,
"enchant_dict_add")
MODULE_SYMBOL("enchant_dict_add_to_session", enchant_dict_add_to_session, NULL)
MODULE_SYMBOL("enchant_dict_check", enchant_dict_check, NULL)
MODULE_SYMBOL("enchant_dict_describe", enchant_dict_describe, NULL)
MODULE_SYMBOL("enchant_dict_free_suggestions",
enchant_dict_free_suggestions)
enchant_dict_free_suggestions, "enchant_dict_free_string_list")
MODULE_SYMBOL("enchant_dict_store_replacement",
enchant_dict_store_replacement)
MODULE_SYMBOL("enchant_dict_suggest", enchant_dict_suggest)
#undef MODULE_SYMBOL
enchant_dict_store_replacement, NULL)
MODULE_SYMBOL("enchant_dict_suggest", enchant_dict_suggest, NULL)
}
static void