Mercurial > pidgin.yaz
comparison plugins/spellchk.c @ 12591:b7a72fc48f62
[gaim-migrate @ 14921]
Fix bug #1386275 with a small change to is_word_lowercase (optimizing it a little tiny bit in the process). Made the same changes to is_word_uppercase. Optimize substitute_word.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 21 Dec 2005 05:17:57 +0000 |
parents | 8d1cf3f847b1 |
children | e856f985a0b9 |
comparison
equal
deleted
inserted
replaced
12590:88c75956dbbf | 12591:b7a72fc48f62 |
---|---|
77 | 77 |
78 static gboolean | 78 static gboolean |
79 is_word_uppercase(const gchar *word) | 79 is_word_uppercase(const gchar *word) |
80 { | 80 { |
81 for (; word[0] != '\0'; word = g_utf8_find_next_char (word, NULL)) { | 81 for (; word[0] != '\0'; word = g_utf8_find_next_char (word, NULL)) { |
82 if (!g_unichar_isupper(g_utf8_get_char(word)) && | 82 gunichar c = g_utf8_get_char(word); |
83 !g_unichar_ispunct(g_utf8_get_char(word))) | 83 |
84 return FALSE; | 84 if (!(g_unichar_isupper(c) || |
85 g_unichar_ispunct(c) || | |
86 g_unichar_isspace(c))) | |
87 return FALSE; | |
85 } | 88 } |
86 | 89 |
87 return TRUE; | 90 return TRUE; |
88 } | 91 } |
89 | 92 |
90 static gboolean | 93 static gboolean |
91 is_word_lowercase(const gchar *word) | 94 is_word_lowercase(const gchar *word) |
92 { | 95 { |
93 for (; word[0] != '\0'; word = g_utf8_find_next_char(word, NULL)) { | 96 for (; word[0] != '\0'; word = g_utf8_find_next_char(word, NULL)) { |
94 if (!g_unichar_islower(g_utf8_get_char(word)) && | 97 gunichar c = g_utf8_get_char(word); |
95 !g_unichar_ispunct(g_utf8_get_char(word))) | 98 |
96 return FALSE; | 99 if (!(g_unichar_islower(c) || |
100 g_unichar_ispunct(c) || | |
101 g_unichar_isspace(c))) | |
102 return FALSE; | |
97 } | 103 } |
98 | 104 |
99 return TRUE; | 105 return TRUE; |
100 } | 106 } |
101 | 107 |
187 substitute_word(gchar *word) | 193 substitute_word(gchar *word) |
188 { | 194 { |
189 GtkTreeIter iter; | 195 GtkTreeIter iter; |
190 gchar *outword; | 196 gchar *outword; |
191 gchar *lowerword; | 197 gchar *lowerword; |
198 gchar *foldedword; | |
192 | 199 |
193 if (word == NULL) | 200 if (word == NULL) |
194 return NULL; | 201 return NULL; |
195 | 202 |
196 lowerword = g_utf8_strdown(word, -1); | 203 lowerword = g_utf8_strdown(word, -1); |
204 foldedword = g_utf8_casefold(word, -1); | |
197 | 205 |
198 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) { | 206 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) { |
199 do { | 207 do { |
200 GValue val0 = {0, }; | |
201 GValue val1 = {0, }; | 208 GValue val1 = {0, }; |
202 GValue val2 = {0, }; | |
203 const char *bad; | 209 const char *bad; |
204 const char *good; | 210 gchar *tmpbad = NULL; |
205 gchar *tmpbad; | |
206 gchar *tmpword; | |
207 gboolean word_only; | 211 gboolean word_only; |
208 | 212 |
209 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, BAD_COLUMN, &val0); | 213 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, WORD_ONLY_COLUMN, &val1); |
210 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, GOOD_COLUMN, &val1); | 214 if (!g_value_get_boolean(&val1)) { |
211 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, WORD_ONLY_COLUMN, &val2); | 215 g_value_unset(&val1); |
212 | 216 continue; |
213 bad = g_value_get_string(&val0); | 217 } |
214 good = g_value_get_string(&val1); | 218 g_value_unset(&val1); |
215 word_only = g_value_get_boolean(&val2); | 219 |
216 | 220 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, BAD_COLUMN, &val1); |
217 tmpbad = g_utf8_casefold(bad, -1); | 221 bad = g_value_get_string(&val1); |
218 tmpword = g_utf8_casefold(word, -1); | 222 |
219 | 223 if (!strcmp(bad, lowerword) || |
220 if (word_only && (!strcmp(bad, lowerword) || (!is_word_lowercase(bad) && !strcmp(tmpbad, tmpword)))) { | 224 (!is_word_lowercase(bad) && |
225 !strcmp((tmpbad = g_utf8_casefold(bad, -1)), foldedword))) | |
226 { | |
227 GValue val2 = {0, }; | |
228 const char *good; | |
229 | |
221 g_free(tmpbad); | 230 g_free(tmpbad); |
222 g_free(tmpword); | 231 |
223 | 232 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, GOOD_COLUMN, &val2); |
224 outword = g_strdup(good); | 233 good = g_value_get_string(&val2); |
225 | 234 |
226 if (is_word_lowercase(bad) && is_word_lowercase(good)) { | 235 if (is_word_lowercase(bad) && is_word_lowercase(good)) |
227 | 236 { |
228 if (is_word_uppercase (word)) { | 237 if (is_word_uppercase(word)) |
229 char *tmp; | 238 outword = g_utf8_strup(good, -1); |
230 tmp = g_utf8_strup(outword, -1); | 239 else if (is_word_proper(word)) |
231 g_free(outword); | 240 outword = make_word_proper(good); |
232 outword = tmp; | 241 else |
233 } | 242 outword = g_strdup(good); |
234 | |
235 if (is_word_proper (word)) { | |
236 char *tmp; | |
237 tmp = make_word_proper(outword); | |
238 g_free(outword); | |
239 outword = tmp; | |
240 } | |
241 } | 243 } |
242 | 244 else |
243 g_value_unset(&val0); | 245 outword = g_strdup(good); |
246 | |
244 g_value_unset(&val1); | 247 g_value_unset(&val1); |
245 g_value_unset(&val2); | 248 g_value_unset(&val2); |
246 | 249 |
250 g_free(foldedword); | |
247 return outword; | 251 return outword; |
248 } | 252 } |
249 | 253 |
250 g_value_unset(&val0); | |
251 g_value_unset(&val1); | 254 g_value_unset(&val1); |
252 g_value_unset(&val2); | |
253 g_free(tmpbad); | 255 g_free(tmpbad); |
254 g_free(tmpword); | |
255 | 256 |
256 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter)); | 257 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter)); |
257 } | 258 } |
259 g_free(foldedword); | |
258 | 260 |
259 return NULL; | 261 return NULL; |
260 } | 262 } |
261 | 263 |
262 static void | 264 static void |