1 From 005858795878b92fc17b4c2127bce90a1d053483 Mon Sep 17 00:00:00 2001
2 From: Patrick Griffis <tingping@tingping.se>
3 Date: Fri, 24 Nov 2017 03:51:10 -0500
4 Subject: [PATCH] spell-entry: Improve robustness of enchant loading and fix
5 2.0 support
6
7 - Add logging and error handling to loading symbols
8 - Don't load unversioned symbol
9 - Handle new function names in Enchant 2.0
10
11 Closes #2095
12 ---
13 src/fe-gtk/sexy-spell-entry.c | 94 +++++++++++++++++++++++++------------------
14 1 file changed, 55 insertions(+), 39 deletions(-)
15
16 diff --git a/src/fe-gtk/sexy-spell-entry.c b/src/fe-gtk/sexy-spell-entry.c
17 index 566abcf3e..bd31d2239 100644
18 --- a/src/fe-gtk/sexy-spell-entry.c
19 +++ b/src/fe-gtk/sexy-spell-entry.c
20 @@ -159,49 +159,65 @@ initialize_enchant (void)
21 {
22 GModule *enchant;
23 gpointer funcptr;
24 -
25 -
26 - enchant = g_module_open("libenchant."G_MODULE_SUFFIX, 0);
27 - if (enchant == NULL)
28 - {
29 -#ifndef WIN32
30 - enchant = g_module_open("libenchant.so.1", 0);
31 - if (enchant == NULL)
32 - {
33 -#ifdef __APPLE__
34 - enchant = g_module_open("libenchant.dylib", 0);
35 - if (enchant == NULL)
36 + gsize i;
37 + const char * const libnames[] = {
38 +#ifdef G_OS_WIN32
39 + "libenchant.dll",
40 #endif
41 - return;
42 - }
43 -#else
44 - return;
45 +#ifdef G_OS_UNIX
46 + "libenchant.so.1",
47 + "libenchant.so.2",
48 #endif
49 - }
50 -
51 - have_enchant = TRUE;
52 -
53 -#define MODULE_SYMBOL(name, func) \
54 - g_module_symbol(enchant, (name), &funcptr); \
55 - (func) = funcptr;
56 -
57 - MODULE_SYMBOL("enchant_broker_init", enchant_broker_init)
58 - MODULE_SYMBOL("enchant_broker_free", enchant_broker_free)
59 - MODULE_SYMBOL("enchant_broker_free_dict", enchant_broker_free_dict)
60 - MODULE_SYMBOL("enchant_broker_list_dicts", enchant_broker_list_dicts)
61 - MODULE_SYMBOL("enchant_broker_request_dict", enchant_broker_request_dict)
62 -
63 - MODULE_SYMBOL("enchant_dict_add_to_personal", enchant_dict_add_to_personal)
64 - MODULE_SYMBOL("enchant_dict_add_to_session", enchant_dict_add_to_session)
65 - MODULE_SYMBOL("enchant_dict_check", enchant_dict_check)
66 - MODULE_SYMBOL("enchant_dict_describe", enchant_dict_describe)
67 +#ifdef __APPLE__
68 + "libenchant.dylib",
69 +#endif
70 + };
71 +
72 + for (i = 0; i < G_N_ELEMENTS(libnames); ++i)
73 + {
74 + enchant = g_module_open(libnames[i], 0);
75 + if (enchant)
76 + {
77 + g_info ("Loaded %s", libnames[i]);
78 + have_enchant = TRUE;
79 + break;
80 + }
81 + }
82 +
83 + if (!have_enchant)
84 + return;
85 +
86 +#define MODULE_SYMBOL(name, func, alt_name) G_STMT_START { \
87 + const char *funcname = name; \
88 + gboolean ret = g_module_symbol(enchant, funcname, &funcptr); \
89 + if (alt_name) { \
90 + funcname = alt_name; \
91 + ret = g_module_symbol(enchant, funcname, &funcptr); \
92 + } \
93 + if (ret == FALSE) { \
94 + g_warning ("Failed to find enchant symbol %s", funcname); \
95 + have_enchant = FALSE; \
96 + return; \
97 + } \
98 + (func) = funcptr; \
99 +} G_STMT_END;
100 +
101 + MODULE_SYMBOL("enchant_broker_init", enchant_broker_init, NULL)
102 + MODULE_SYMBOL("enchant_broker_free", enchant_broker_free, NULL)
103 + MODULE_SYMBOL("enchant_broker_free_dict", enchant_broker_free_dict, NULL)
104 + MODULE_SYMBOL("enchant_broker_list_dicts", enchant_broker_list_dicts, NULL)
105 + MODULE_SYMBOL("enchant_broker_request_dict", enchant_broker_request_dict, NULL)
106 +
107 + MODULE_SYMBOL("enchant_dict_add_to_personal", enchant_dict_add_to_personal,
108 + "enchant_dict_add")
109 + MODULE_SYMBOL("enchant_dict_add_to_session", enchant_dict_add_to_session, NULL)
110 + MODULE_SYMBOL("enchant_dict_check", enchant_dict_check, NULL)
111 + MODULE_SYMBOL("enchant_dict_describe", enchant_dict_describe, NULL)
112 MODULE_SYMBOL("enchant_dict_free_suggestions",
113 - enchant_dict_free_suggestions)
114 + enchant_dict_free_suggestions, "enchant_dict_free_string_list")
115 MODULE_SYMBOL("enchant_dict_store_replacement",
116 - enchant_dict_store_replacement)
117 - MODULE_SYMBOL("enchant_dict_suggest", enchant_dict_suggest)
118 -
119 -#undef MODULE_SYMBOL
120 + enchant_dict_store_replacement, NULL)
121 + MODULE_SYMBOL("enchant_dict_suggest", enchant_dict_suggest, NULL)
122 }
123
124 static void
|