summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Lachowicz <domlachowicz@gmail.com>2008-03-20 01:39:08 +0000
committerDom Lachowicz <domlachowicz@gmail.com>2008-03-20 01:39:08 +0000
commit9cd73d640867f49785196917b8a17bae013be0d6 (patch)
tree70ea1bf15a021a2ee09e494e15a7a71c160f4e50
parentdc0841514c3cfe592f16093ce2c328506da3c148 (diff)
downloadenchant-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.in1
-rw-r--r--src/enchant-provider.h3
-rw-r--r--src/enchant.c46
-rw-r--r--src/myspell/myspell_checker.cpp73
-rw-r--r--src/pwl.c42
-rw-r--r--tests/enchant-ispell.c19
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);
diff --git a/src/pwl.c b/src/pwl.c
index 3816fa8..0ca6395 100644
--- a/src/pwl.c
+++ b/src/pwl.c
@@ -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. */