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