summaryrefslogtreecommitdiff
path: root/hexchat/hexchat-enchant2.0.patch
blob: 4c08c09ac747f41de930a4bb6436563fe26b530c (plain)
    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

Generated by cgit