Adapt to new hunspell C++ ABI

Fixes: #10547

CMake support still missing.
This commit is contained in:
Juergen Spitzmueller 2018-03-29 18:43:11 +02:00
parent d9e0a842cf
commit 1efef5542b
3 changed files with 38 additions and 0 deletions

View File

@ -227,6 +227,9 @@ The following options allow you to tweak the generated code more precisely (see
--without-included-boost is specified). You may have to use --without-included-boost is specified). You may have to use
--disable-stdlib-debug when linking development versions against --disable-stdlib-debug when linking development versions against
your system's boost library. your system's boost library.
The same problem applies to hunspell (as of hunspell 1.5). So either
compile --with-included-hunspell or --disable-stdlib-debug when
linking development versions against your system's hunspell library.
o --enable-monolithic-build[=boost,client,insets,mathed,core,tex2lyx,frontend-qt4] o --enable-monolithic-build[=boost,client,insets,mathed,core,tex2lyx,frontend-qt4]
that enables monolithic build of the given parts of the source that enables monolithic build of the given parts of the source

View File

@ -60,6 +60,23 @@ AC_DEFUN([CHECK_WITH_ENCHANT],
fi fi
]) ])
AC_DEFUN([LYX_HAVE_HUNSPELL_CXXABI],
[
AC_MSG_CHECKING([whether hunspell C++ (rather than C) ABI is provided])
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$ENCHANT_CFLAGS $AM_CXXFLAGS $CXXFLAGS"
# in the C++ ABI, stem() returns a vector, in the C ABI, it returns an int
AC_TRY_COMPILE([#include <hunspell/hunspell.hxx>],
[Hunspell sp("foo", "bar");
int i = sp.stem("test").size();],
[AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_HUNSPELL_CXXABI, 1, [Define to 1 if hunspell C++ (rather than C) ABI is detected])
],
[AC_MSG_RESULT(no)])
CXXFLAGS=$save_CXXFLAGS
])
# Macro to add for using hunspell spellchecker libraries! -*- sh -*- # Macro to add for using hunspell spellchecker libraries! -*- sh -*-
AC_DEFUN([CHECK_WITH_HUNSPELL], AC_DEFUN([CHECK_WITH_HUNSPELL],
[ [
@ -83,6 +100,7 @@ AC_DEFUN([CHECK_WITH_HUNSPELL],
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
fi fi
fi fi
LYX_HAVE_HUNSPELL_CXXABI
]) ])
dnl Usage: LYX_USE_INCLUDED_HUNSPELL : select if the included hunspell should dnl Usage: LYX_USE_INCLUDED_HUNSPELL : select if the included hunspell should
@ -113,6 +131,7 @@ AC_DEFUN([LYX_CHECK_SPELL_ENGINES],
dnl the user wanted to use the included hunspell, so do not check for external hunspell dnl the user wanted to use the included hunspell, so do not check for external hunspell
lyx_use_hunspell=true lyx_use_hunspell=true
AC_DEFINE(USE_HUNSPELL, 1, [Define as 1 to use the hunspell library]) AC_DEFINE(USE_HUNSPELL, 1, [Define as 1 to use the hunspell library])
AC_DEFINE(HAVE_HUNSPELL_CXXABI, 1, [Define to 1 if hunspell C++ (rather than C) ABI is detected])
lyx_flags="$lyx_flags use-hunspell" lyx_flags="$lyx_flags use-hunspell"
else else
CHECK_WITH_HUNSPELL CHECK_WITH_HUNSPELL

View File

@ -356,7 +356,11 @@ SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl)
LYXERR(Debug::GUI, "spellCheck: \"" << LYXERR(Debug::GUI, "spellCheck: \"" <<
wl.word() << "\", lang = " << wl.lang()->lang()) ; wl.word() << "\", lang = " << wl.lang()->lang()) ;
#ifdef HAVE_HUNSPELL_CXXABI
if (h->spell(word_to_check, &info))
#else
if (h->spell(word_to_check.c_str(), &info)) if (h->spell(word_to_check.c_str(), &info))
#endif
return d->learned(wl) ? LEARNED_WORD : WORD_OK; return d->learned(wl) ? LEARNED_WORD : WORD_OK;
if (info & SPELL_COMPOUND) { if (info & SPELL_COMPOUND) {
@ -411,6 +415,11 @@ void HunspellChecker::suggest(WordLangTuple const & wl,
return; return;
string const encoding = h->get_dic_encoding(); string const encoding = h->get_dic_encoding();
string const word_to_check = to_iconv_encoding(wl.word(), encoding); string const word_to_check = to_iconv_encoding(wl.word(), encoding);
#ifdef HAVE_HUNSPELL_CXXABI
vector<string> wlst = h->suggest(word_to_check);
for (auto const s : wlst)
suggestions.push_back(from_iconv_encoding(s, encoding));
#else
char ** suggestion_list; char ** suggestion_list;
int const suggestion_number = h->suggest(&suggestion_list, word_to_check.c_str()); int const suggestion_number = h->suggest(&suggestion_list, word_to_check.c_str());
if (suggestion_number <= 0) if (suggestion_number <= 0)
@ -418,6 +427,7 @@ void HunspellChecker::suggest(WordLangTuple const & wl,
for (int i = 0; i != suggestion_number; ++i) for (int i = 0; i != suggestion_number; ++i)
suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding)); suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding));
h->free_list(&suggestion_list, suggestion_number); h->free_list(&suggestion_list, suggestion_number);
#endif
} }
@ -430,6 +440,11 @@ void HunspellChecker::stem(WordLangTuple const & wl,
return; return;
string const encoding = h->get_dic_encoding(); string const encoding = h->get_dic_encoding();
string const word_to_check = to_iconv_encoding(wl.word(), encoding); string const word_to_check = to_iconv_encoding(wl.word(), encoding);
#ifdef HAVE_HUNSPELL_CXXABI
vector<string> wlst = h->stem(word_to_check);
for (auto const s : wlst)
suggestions.push_back(from_iconv_encoding(s, encoding));
#else
char ** suggestion_list; char ** suggestion_list;
int const suggestion_number = h->stem(&suggestion_list, word_to_check.c_str()); int const suggestion_number = h->stem(&suggestion_list, word_to_check.c_str());
if (suggestion_number <= 0) if (suggestion_number <= 0)
@ -437,6 +452,7 @@ void HunspellChecker::stem(WordLangTuple const & wl,
for (int i = 0; i != suggestion_number; ++i) for (int i = 0; i != suggestion_number; ++i)
suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding)); suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding));
h->free_list(&suggestion_list, suggestion_number); h->free_list(&suggestion_list, suggestion_number);
#endif
} }