gint sc_speller_process_line(GeanyDocument *doc, gint line_number) { gint pos_start, pos_end; gint wstart, wend; gint suggestions_found = 0; gint wordchars_len; gchar *wordchars; g_return_val_if_fail(sc_speller_dict != NULL, 0); g_return_val_if_fail(doc != NULL, 0); /* add ' (single quote) temporarily to wordchars * to be able to check for "doesn't", "isn't" and similar */ wordchars_len = scintilla_send_message(doc->editor->sci, SCI_GETWORDCHARS, 0, 0); wordchars = g_malloc0(wordchars_len + 2); /* 2 = temporarily added "'" and "\0" */ scintilla_send_message(doc->editor->sci, SCI_GETWORDCHARS, 0, (sptr_t)wordchars); if (! strchr(wordchars, '\'')) { /* temporarily add "'" to the wordchars */ wordchars[wordchars_len] = '\''; scintilla_send_message(doc->editor->sci, SCI_SETWORDCHARS, 0, (sptr_t)wordchars); } pos_start = sci_get_position_from_line(doc->editor->sci, line_number); pos_end = sci_get_position_from_line(doc->editor->sci, line_number + 1); while (pos_start < pos_end) { gchar *word; wstart = scintilla_send_message(doc->editor->sci, SCI_WORDSTARTPOSITION, pos_start, TRUE); wend = scintilla_send_message(doc->editor->sci, SCI_WORDENDPOSITION, wstart, FALSE); if (wstart == wend) break; word = sci_get_contents_range(doc->editor->sci, wstart, wend); suggestions_found += sc_speller_check_word(doc, line_number, word, wstart, wend); pos_start = wend + 1; g_free(word); } /* reset wordchars for the current document */ wordchars[wordchars_len] = '\0'; scintilla_send_message(doc->editor->sci, SCI_SETWORDCHARS, 0, (sptr_t)wordchars); g_free(wordchars); return suggestions_found; }
gint sc_speller_process_line(GeanyDocument *doc, gint line_number, const gchar *line) { gint pos_start, pos_end; gint wstart, wend; GString *str; gint suggestions_found = 0; gchar c; g_return_val_if_fail(sc_speller_dict != NULL, 0); g_return_val_if_fail(doc != NULL, 0); g_return_val_if_fail(line != NULL, 0); str = g_string_sized_new(256); pos_start = sci_get_position_from_line(doc->editor->sci, line_number); pos_end = sci_get_position_from_line(doc->editor->sci, line_number + 1); while (pos_start < pos_end) { wstart = scintilla_send_message(doc->editor->sci, SCI_WORDSTARTPOSITION, pos_start, TRUE); wend = scintilla_send_message(doc->editor->sci, SCI_WORDENDPOSITION, wstart, FALSE); if (wstart == wend) break; c = sci_get_char_at(doc->editor->sci, wstart); /* hopefully it's enough to check for these both */ if (ispunct(c) || isspace(c)) { pos_start++; continue; } /* ensure the string has enough allocated memory */ if (str->len < (guint)(wend - wstart)) g_string_set_size(str, wend - wstart); sci_get_text_range(doc->editor->sci, wstart, wend, str->str); suggestions_found += sc_speller_check_word(doc, line_number, str->str, wstart, wend); pos_start = wend + 1; } g_string_free(str, TRUE); return suggestions_found; }