branch: externals/jinx commit 610cc3c567bd30f8a192d77f698b1e63e1cd020c Author: Daniel Mendler <m...@daniel-mendler.de> Commit: Daniel Mendler <m...@daniel-mendler.de>
Require libenchant 2.3.1 or newer --- CHANGELOG.org | 1 + jinx-mod.c | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.org b/CHANGELOG.org index 29e247bc4a..60b4aedd51 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -12,6 +12,7 @@ - Add =jinx-correct-nearest=, =jinx-correct-all= and =jinx-correct-word= commands. The command =jinx-correct= dispatches to one of those commands depending on the prefix argument. +- Require libenchant 2.3.1 or newer. * Version 0.9 (2023-07-02) diff --git a/jinx-mod.c b/jinx-mod.c index fabfbdbaec..959ed38289 100644 --- a/jinx-mod.c +++ b/jinx-mod.c @@ -17,8 +17,9 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #include <emacs-module.h> #include <enchant.h> -#include <string.h> +#include <stdio.h> #include <stdlib.h> +#include <string.h> #define jinx_unused(var) _##var __attribute__((unused)) #define jinx_autofree __attribute__((cleanup(jinx_autofree_cleanup))) @@ -78,7 +79,8 @@ static void jinx_free_dict(void* dict) { static emacs_value jinx_dict(emacs_env* env, ptrdiff_t jinx_unused(nargs), emacs_value args[], void* jinx_unused(data)) { jinx_autofree char* str = jinx_cstr(env, args[0]); - EnchantDict* dict = str ? enchant_broker_request_dict(jinx_broker(), str) : 0; + EnchantDict* dict = + str ? enchant_broker_request_dict(jinx_broker(), str) : 0; return dict ? env->make_user_ptr(env, jinx_free_dict, dict) : Qnil; @@ -143,15 +145,9 @@ static emacs_value jinx_add(emacs_env* env, ptrdiff_t jinx_unused(nargs), static emacs_value jinx_wordchars(emacs_env* env, ptrdiff_t jinx_unused(nargs), emacs_value args[], void* jinx_unused(data)) { EnchantDict* dict = env->get_user_ptr(env, args[0]); - if (dict) { - // Enchant older than 2.3.1 sometimes does not return UTF-8 - // See https://github.com/AbiWord/enchant/blob/master/NEWS - emacs_value str = jinx_str(env, enchant_dict_get_extra_word_characters(dict)); - if (env->non_local_exit_check(env) == emacs_funcall_exit_return) - return str; - env->non_local_exit_clear(env); - } - return Qnil; + return dict + ? jinx_str(env, enchant_dict_get_extra_word_characters(dict)) + : Qnil; } static emacs_value jinx_suggest(emacs_env* env, ptrdiff_t jinx_unused(nargs), @@ -171,10 +167,14 @@ static emacs_value jinx_suggest(emacs_env* env, ptrdiff_t jinx_unused(nargs), int emacs_module_init(struct emacs_runtime *runtime) { if ((size_t)runtime->size < sizeof (*runtime)) - return 1; + return 1; // Require Emacs binary compatibility emacs_env* env = runtime->get_environment(runtime); if ((size_t)env->size < sizeof (*env)) - return 2; + return 2; // Require Emacs binary compatibility + int v0, v1, v2; + if (sscanf(enchant_get_version(), "%d.%d.%d", &v0, &v1, &v2) != 3 || + v0 * 10000 + v1 * 100 + v2 < 20301) + return 3; // Require Enchant 2.3.1 or newer Qt = env->make_global_ref(env, env->intern(env, "t")); Qnil = env->make_global_ref(env, env->intern(env, "nil")); jinx_defun(env, "jinx--mod-suggest", 2, 2, jinx_suggest);