diff options
author | Dom Lachowicz <domlachowicz@gmail.com> | 2008-03-20 01:39:08 +0000 |
---|---|---|
committer | Dom Lachowicz <domlachowicz@gmail.com> | 2008-03-20 01:39:08 +0000 |
commit | 9cd73d640867f49785196917b8a17bae013be0d6 (patch) | |
tree | 70ea1bf15a021a2ee09e494e15a7a71c160f4e50 | |
parent | dc0841514c3cfe592f16093ce2c328506da3c148 (diff) | |
download | enchant-9cd73d640867f49785196917b8a17bae013be0d6.tar.gz |
if someone requests 'pl' and myspell has a 'pl_PL' dictionary, return that as a 'close enough' answer
git-svn-id: svn+ssh://svn.abisource.com/svnroot/enchant/trunk@23210 bcba8976-2d24-0410-9c9c-aab3bd5fdfd6
-rw-r--r-- | configure.in | 1 | ||||
-rw-r--r-- | src/enchant-provider.h | 3 | ||||
-rw-r--r-- | src/enchant.c | 46 | ||||
-rw-r--r-- | src/myspell/myspell_checker.cpp | 73 | ||||
-rw-r--r-- | src/pwl.c | 42 | ||||
-rw-r--r-- | tests/enchant-ispell.c | 19 |
6 files changed, 123 insertions, 61 deletions
diff --git a/configure.in b/configure.in index d1e5c75..095e8c7 100644 --- a/configure.in +++ b/configure.in @@ -140,7 +140,6 @@ AC_SUBST(CC_WARN_CFLAGS) CXX_MAYBE_WARN="-Wall -Wextra \ -Wsign-compare \ -Wpointer-arith -Wwrite-strings \ --Wmissing-prototypes \ -Wpacked -Wswitch-enum -Wmissing-format-attribute \ -Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \ -Wno-missing-field-initializers -Wno-unused-parameter \ diff --git a/src/enchant-provider.h b/src/enchant-provider.h index 50599d1..ea9730d 100644 --- a/src/enchant-provider.h +++ b/src/enchant-provider.h @@ -55,9 +55,6 @@ ENCHANT_MODULE_EXPORT(char *) typedef struct str_enchant_provider EnchantProvider; ENCHANT_MODULE_EXPORT (char *) - enchant_get_user_home_dir (void); - -ENCHANT_MODULE_EXPORT (char *) enchant_get_user_config_dir (void); ENCHANT_MODULE_EXPORT (char *) diff --git a/src/enchant.c b/src/enchant.c index a92d479..2d80f18 100644 --- a/src/enchant.c +++ b/src/enchant.c @@ -104,6 +104,21 @@ typedef void (*EnchantPreConfigureFunc) (EnchantProvider * provider, /********************************************************************************/ /********************************************************************************/ +static char * +_enchant_get_user_home_dir (void) +{ + const char* home_dir; + + home_dir = enchant_get_registry_value_ex (1, "Config", "Home_Dir"); + if (home_dir) + return (char *)home_dir; + + home_dir = g_get_home_dir (); + if (home_dir) + return g_strdup (home_dir); + return NULL; +} + static void _enchant_ensure_private_datadir (void) { @@ -131,13 +146,13 @@ enchant_get_user_dir (void) #endif if (!base_dir) - base_dir = enchant_get_user_home_dir (); + base_dir = _enchant_get_user_home_dir (); if(base_dir) { - user_dir = g_build_filename (base_dir, - ENCHANT_USER_PATH_EXTENSION, - NULL); + user_dir = g_build_filename (base_dir, + ENCHANT_USER_PATH_EXTENSION, + NULL); g_free(base_dir); return user_dir; } @@ -315,29 +330,6 @@ enchant_get_registry_value (const char * const prefix, const char * const key) return val; } -/** - * enchant_get_user_home_dir - * - * Returns: the user's home directory, or %null. Returned value - * must be free'd. - * - * This API is private to the providers. - */ -ENCHANT_MODULE_EXPORT (char *) -enchant_get_user_home_dir (void) -{ - const char* home_dir; - - home_dir = enchant_get_registry_value_ex (1, "Config", "Home_Dir"); - if (home_dir) - return (char *)home_dir; - - home_dir = g_get_home_dir (); - if (home_dir) - return g_strdup (home_dir); - return NULL; -} - /********************************************************************************/ /********************************************************************************/ diff --git a/src/myspell/myspell_checker.cpp b/src/myspell/myspell_checker.cpp index bca3ced..68ced13 100644 --- a/src/myspell/myspell_checker.cpp +++ b/src/myspell/myspell_checker.cpp @@ -240,22 +240,18 @@ MySpellChecker::suggestWord(const char* const utf8Word, size_t len, size_t *nsug } static void -s_buildHashNames (std::vector<std::string> & names, const char * dict) +s_buildDictionaryDirs (std::vector<std::string> & dirs) { - char * tmp, * private_dir, * config_dir, * myspell_prefix, * dict_dic; - - names.clear (); + char * private_dir, * config_dir, * myspell_prefix; - dict_dic = g_strconcat(dict, ".dic", NULL); + dirs.clear (); config_dir = enchant_get_user_config_dir (); if (config_dir) { private_dir = g_build_filename (config_dir, "myspell", NULL); - tmp = g_build_filename (private_dir, dict_dic, NULL); - names.push_back (tmp); - g_free (tmp); + dirs.push_back (private_dir); g_free (private_dir); g_free (config_dir); @@ -263,9 +259,7 @@ s_buildHashNames (std::vector<std::string> & names, const char * dict) myspell_prefix = myspell_checker_get_prefix (); if (myspell_prefix) { - tmp = g_build_filename (myspell_prefix, dict_dic, NULL); - names.push_back (tmp); - g_free (tmp); + dirs.push_back (myspell_prefix); g_free (myspell_prefix); } @@ -274,38 +268,71 @@ s_buildHashNames (std::vector<std::string> & names, const char * dict) char* open_office_dicts_dir = myspell_checker_get_open_office_dicts_dir (); if (open_office_dicts_dir) { - tmp = g_build_filename (open_office_dicts_dir, dict_dic, NULL); - names.push_back (tmp); - g_free (tmp); - g_free (open_office_dicts_dir); - } + dirs.push_back (open_office_dicts_dir); + g_free (open_office_dicts_dir); + } } #endif +} + +static void +s_buildHashNames (std::vector<std::string> & names, const char * dict) +{ + names.clear (); + + std::vector<std::string> dirs; + s_buildDictionaryDirs (dirs); - g_free(dict_dic); + char *dict_dic = g_strconcat(dict, ".dic", NULL); + for (size_t i = 0; i < dirs.size(); i++) + { + char *tmp = g_build_filename (dirs[i].c_str(), dict_dic, NULL); + names.push_back (tmp); + g_free (tmp); + } + + g_free(dict_dic); } static char * myspell_request_dictionary (const char * tag) { - char * dic = NULL; - std::vector<std::string> names; s_buildHashNames (names, tag); - for (size_t i = 0; i < names.size () && !dic; i++) { + for (size_t i = 0; i < names.size (); i++) { if (g_file_test(names[i].c_str(), G_FILE_TEST_EXISTS)) - dic = g_strdup (names[i].c_str()); + return g_strdup (names[i].c_str()); } - return dic; + std::vector<std::string> dirs; + s_buildDictionaryDirs (dirs); + + for (size_t i = 0; i < dirs.size(); i++) { + GDir *dir = g_dir_open (dirs[i].c_str(), 0, NULL); + if (dir) { + const char *dir_entry; + while ((dir_entry = g_dir_read_name (dir)) != NULL) { + if (strncmp (dir_entry, tag, strlen(tag)) == 0 && + strstr (dir_entry, ".dic") != NULL) { + char *dict = g_build_filename (dirs[i].c_str(), + dir_entry, NULL); + g_dir_close (dir); + return dict; + } + } + + g_dir_close (dir); + } + } + + return NULL; } bool MySpellChecker::requestDictionary(const char *szLang) { - const char *dictBase = NULL; char *dic = NULL, *aff = NULL; dic = myspell_request_dictionary (szLang); @@ -500,12 +500,40 @@ static int enchant_is_all_caps(const char*const word, size_t len) GUnicodeType type = g_unichar_type(g_utf8_get_char(it)); switch(type) { - case G_UNICODE_UPPERCASE_LETTER: - hasCap = 1; - break; - case G_UNICODE_TITLECASE_LETTER: - case G_UNICODE_LOWERCASE_LETTER: - return 0; + case G_UNICODE_UPPERCASE_LETTER: + hasCap = 1; + break; + case G_UNICODE_TITLECASE_LETTER: + case G_UNICODE_LOWERCASE_LETTER: + return 0; + + case G_UNICODE_CONTROL: + case G_UNICODE_FORMAT: + case G_UNICODE_UNASSIGNED: + case G_UNICODE_PRIVATE_USE: + case G_UNICODE_SURROGATE: + case G_UNICODE_MODIFIER_LETTER: + case G_UNICODE_OTHER_LETTER: + case G_UNICODE_COMBINING_MARK: + case G_UNICODE_ENCLOSING_MARK: + case G_UNICODE_NON_SPACING_MARK: + case G_UNICODE_DECIMAL_NUMBER: + case G_UNICODE_LETTER_NUMBER: + case G_UNICODE_OTHER_NUMBER: + case G_UNICODE_CONNECT_PUNCTUATION: + case G_UNICODE_DASH_PUNCTUATION: + case G_UNICODE_CLOSE_PUNCTUATION: + case G_UNICODE_FINAL_PUNCTUATION: + case G_UNICODE_INITIAL_PUNCTUATION: + case G_UNICODE_OTHER_PUNCTUATION: + case G_UNICODE_OPEN_PUNCTUATION: + case G_UNICODE_CURRENCY_SYMBOL: + case G_UNICODE_MODIFIER_SYMBOL: + case G_UNICODE_MATH_SYMBOL: + case G_UNICODE_OTHER_SYMBOL: + case G_UNICODE_LINE_SEPARATOR: + case G_UNICODE_PARAGRAPH_SEPARATOR: + case G_UNICODE_SPACE_SEPARATOR: default: break; } @@ -946,7 +974,7 @@ static void enchant_trie_find_matches(EnchantTrie* trie,EnchantTrieMatcher *matc if (trie == EOSTrie) { size_t word_len = strlen(matcher->word); errs = matcher->num_errors; - if(word_len > matcher->word_pos) { + if((ssize_t)word_len > matcher->word_pos) { matcher->num_errors = errs + word_len - matcher->word_pos; } if (matcher->num_errors <= matcher->max_errors) { diff --git a/tests/enchant-ispell.c b/tests/enchant-ispell.c index ff12c09..f50daee 100644 --- a/tests/enchant-ispell.c +++ b/tests/enchant-ispell.c @@ -208,6 +208,25 @@ is_word_char (gunichar uc, size_t n) case G_UNICODE_OTHER_NUMBER: case G_UNICODE_CONNECT_PUNCTUATION: return 1; /* Enchant 1.3.0 defines word chars like this. */ + + case G_UNICODE_CONTROL: + case G_UNICODE_FORMAT: + case G_UNICODE_UNASSIGNED: + case G_UNICODE_PRIVATE_USE: + case G_UNICODE_SURROGATE: + case G_UNICODE_DASH_PUNCTUATION: + case G_UNICODE_CLOSE_PUNCTUATION: + case G_UNICODE_FINAL_PUNCTUATION: + case G_UNICODE_INITIAL_PUNCTUATION: + case G_UNICODE_OTHER_PUNCTUATION: + case G_UNICODE_OPEN_PUNCTUATION: + case G_UNICODE_CURRENCY_SYMBOL: + case G_UNICODE_MODIFIER_SYMBOL: + case G_UNICODE_MATH_SYMBOL: + case G_UNICODE_OTHER_SYMBOL: + case G_UNICODE_LINE_SEPARATOR: + case G_UNICODE_PARAGRAPH_SEPARATOR: + case G_UNICODE_SPACE_SEPARATOR: default: if ((n > 0) && (uc == g_utf8_get_char("'"))) { return 1; /** Char ' is accepted only within a word. */ |