MySpellChecker::~MySpellChecker() { delete myspell; if (g_iconv_is_valid (m_translate_in )) g_iconv_close(m_translate_in); if (g_iconv_is_valid(m_translate_out)) g_iconv_close(m_translate_out); }
ISpellChecker::~ISpellChecker() { if (m_bSuccessfulInit) { // only cleanup our mess if we were successfully initialized clearindex (m_pflagindex); clearindex (m_sflagindex); } FREEP(m_hashtbl); FREEP(m_hashstrings); FREEP(m_sflaglist); FREEP(m_chartypes); if (g_iconv_is_valid (m_translate_in )) g_iconv_close(m_translate_in); m_translate_in = G_ICONV_INVALID; if (g_iconv_is_valid(m_translate_out)) g_iconv_close(m_translate_out); m_translate_out = G_ICONV_INVALID; }
bool ISpellChecker::checkWord(const char * const utf8Word, size_t length) { ichar_t iWord[INPUTWORDLEN + MAXAFFIXLEN]; char szWord[INPUTWORDLEN + MAXAFFIXLEN]; if (!m_bSuccessfulInit) return false; if (!utf8Word || length >= (INPUTWORDLEN + MAXAFFIXLEN) || length == 0) return false; bool retVal = false; if (!g_iconv_is_valid(m_translate_in)) return false; else { /* convert to 8bit string and null terminate */ size_t len_in, len_out, result; // the 8bit encodings use precomposed forms char *normalizedWord = g_utf8_normalize (utf8Word, length, G_NORMALIZE_NFC); char *In = normalizedWord; char *Out = szWord; len_in = strlen(In); len_out = sizeof( szWord ) - 1; result = g_iconv(m_translate_in, &In, &len_in, &Out, &len_out); g_free(normalizedWord); if ((size_t)-1 == result) return false; *Out = '\0'; } if (!strtoichar(iWord, szWord, sizeof(iWord), 0)) { if (good(iWord, 0, 0, 1, 0) == 1 || compoundgood(iWord, 1) == 1) { retVal = true; } } return retVal; }
bool MySpellChecker::checkWord(const char *utf8Word, size_t len) { if (len > MAXWORDLEN || !g_iconv_is_valid(m_translate_in)) return false; // the 8bit encodings use precomposed forms char *normalizedWord = g_utf8_normalize (utf8Word, len, G_NORMALIZE_NFC); char *in = normalizedWord; char word8[MAXWORDLEN + 1]; char *out = word8; size_t len_in = strlen(in); size_t len_out = sizeof( word8 ) - 1; size_t result = g_iconv(m_translate_in, &in, &len_in, &out, &len_out); g_free(normalizedWord); if ((size_t)-1 == result) return false; *out = '\0'; if (myspell->spell(word8)) return true; else return false; }
void ISpellChecker::setDictionaryEncoding( const char * hashname, const char * encoding ) { /* Get Hash encoding from XML file. This should always work! */ try_autodetect_charset(encoding); if (g_iconv_is_valid(m_translate_in) && g_iconv_is_valid(m_translate_out)) { /* We still have to setup prefstringchar*/ prefstringchar = findfiletype("utf8", 1, deftflag < 0 ? &deftflag : static_cast<int *>(NULL)); if (prefstringchar < 0) { std::string teststring; for(int n1 = 1; n1 <= 15; n1++) { teststring = "latin" + n1; prefstringchar = findfiletype(teststring.c_str(), 1, deftflag < 0 ? &deftflag : static_cast<int *>(NULL)); if (prefstringchar >= 0) break; } } return; /* success */ } /* Test for UTF-8 first */ prefstringchar = findfiletype("utf8", 1, deftflag < 0 ? &deftflag : static_cast<int *>(NULL)); if (prefstringchar >= 0) { m_translate_in = g_iconv_open("UTF-8", "UTF-8"); m_translate_out = g_iconv_open("UTF-8", "UTF-8"); } if (g_iconv_is_valid(m_translate_in) && g_iconv_is_valid(m_translate_out)) return; /* success */ /* Test for "latinN" */ if (!g_iconv_is_valid(m_translate_in)) { /* Look for "altstringtype" names from latin1 to latin15 */ for(int n1 = 1; n1 <= 15; n1++) { char * teststring = g_strdup_printf("latin%u", n1); prefstringchar = findfiletype(teststring, 1, deftflag < 0 ? &deftflag : static_cast<int *>(NULL)); if (prefstringchar >= 0) { m_translate_in = g_iconv_open(teststring, "UTF-8"); m_translate_out = g_iconv_open("UTF-8", teststring); g_free (teststring); break; } else { g_free (teststring); } } } /* If nothing found, use latin1 */ if (!g_iconv_is_valid(m_translate_in)) { m_translate_in = g_iconv_open("latin1", "UTF-8"); m_translate_out = g_iconv_open("UTF-8", "latin1"); } }