+#endif
+}
+
+
+void HunspellChecker::stem(WordLangTuple const & wl,
+ docstring_list & suggestions)
+{
+ suggestions.clear();
+ Hunspell * h = d->speller(wl.lang());
+ if (!h)
+ return;
+ string const encoding = h->get_dic_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;
+ int const suggestion_number = h->stem(&suggestion_list, word_to_check.c_str());
+ if (suggestion_number <= 0)
+ return;
+ for (int i = 0; i != suggestion_number; ++i)
+ suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding));
+ h->free_list(&suggestion_list, suggestion_number);
+#endif
+}
+
+
+bool HunspellChecker::hasDictionary(Language const * lang) const
+{
+ if (!lang)
+ return false;
+ return d->haveDictionary(lang);
+}
+
+
+int HunspellChecker::numDictionaries() const
+{
+ return d->numDictionaries();