/* * common/enchant.c - Enchant Library Runtime Loading * * Copyright (C) 2004-2006 Christian Hammond. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "enchant.h" struct EnchantBroker * (*enchant_broker_init) (void); void (*enchant_broker_free) (struct EnchantBroker * broker); void (*enchant_broker_free_dict) (struct EnchantBroker * broker, struct EnchantDict * dict); void (*enchant_broker_list_dicts) (struct EnchantBroker * broker, EnchantDictDescribeFn fn, void * user_data); struct EnchantDict * (*enchant_broker_request_dict) (struct EnchantBroker * broker, const char *const tag); void (*enchant_dict_add_to_personal) (struct EnchantDict * dict, const char *const word, ssize_t len); void (*enchant_dict_add_to_session) (struct EnchantDict * dict, const char *const word, ssize_t len); int (*enchant_dict_check) (struct EnchantDict * dict, const char *const word, ssize_t len); void (*enchant_dict_describe) (struct EnchantDict * dict, EnchantDictDescribeFn fn, void * user_data); void (*enchant_dict_free_suggestions) (struct EnchantDict * dict, char **suggestions); void (*enchant_dict_store_replacement) (struct EnchantDict * dict, const char *const mis, ssize_t mis_len, const char *const cor, ssize_t cor_len); char ** (*enchant_dict_suggest) (struct EnchantDict * dict, const char *const word, ssize_t len, size_t * out_n_suggs); static gboolean _have_enchant = FALSE; void initialize_enchant (void) { GModule *enchant; gpointer funcptr; gsize i; const char * const libnames[] = { #ifdef G_OS_WIN32 "libenchant.dll", #endif #ifdef G_OS_UNIX "libenchant.so.1", "libenchant.so.2", "libenchant-2.so.2", #endif #ifdef __APPLE__ "libenchant.dylib", #endif }; if (_have_enchant) return; 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; } } if (!_have_enchant) return; #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_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_string_list") MODULE_SYMBOL("enchant_dict_store_replacement", enchant_dict_store_replacement, NULL) MODULE_SYMBOL("enchant_dict_suggest", enchant_dict_suggest, NULL) } gboolean have_enchant (void) { return _have_enchant; } static void get_lang_from_dict_cb (const char * const lang_tag, const char * const provider_name, const char * const provider_desc, const char * const provider_file, void * user_data) { gchar **lang = (gchar **)user_data; *lang = g_strdup(lang_tag); } gchar * enchant_get_lang_from_dict (struct EnchantDict *dict) { gchar *lang; if (!_have_enchant) return NULL; enchant_dict_describe(dict, get_lang_from_dict_cb, &lang); return lang; }