diff options
author | Sébastien Wilmet <swilmet@gnome.org> | 2014-04-10 23:53:41 +0200 |
---|---|---|
committer | Sébastien Wilmet <swilmet@gnome.org> | 2014-07-13 17:08:52 +0200 |
commit | 7f6ae622d374f2a6c5fccaa14e981c1d26cf7b35 (patch) | |
tree | 1ca20e39535205d49593f1e59d5954b1cbb73820 /gtk/gtktextiter.c | |
parent | 97b9d8e4aea19e414c96e13149b9d1e93b1c1bc5 (diff) | |
download | gtk+-7f6ae622d374f2a6c5fccaa14e981c1d26cf7b35.tar.gz |
textiter: remove recursivity of find_by_log_attrs()
find_by_log_attrs() was a recursive function. It is replaced by an
iteration.
The already_moved_initially parameter was TRUE only for the recursive
call, so the paramater is removed.
There is also a small cleanup of the find_visible_by_log_attrs()
(remove trailing spaces, fix indentation).
There is still a part to optimize for a later commit.
https://bugzilla.gnome.org/show_bug.cgi?id=629129
Diffstat (limited to 'gtk/gtktextiter.c')
-rw-r--r-- | gtk/gtktextiter.c | 97 |
1 files changed, 48 insertions, 49 deletions
diff --git a/gtk/gtktextiter.c b/gtk/gtktextiter.c index 55e33c0b6a..a97dea44ef 100644 --- a/gtk/gtktextiter.c +++ b/gtk/gtktextiter.c @@ -3096,82 +3096,81 @@ find_line_log_attrs (const GtkTextIter *iter, return result; } -/* FIXME this function is very, very gratuitously slow */ static gboolean -find_by_log_attrs (GtkTextIter *iter, - FindLogAttrFunc func, - gboolean forward, - gboolean already_moved_initially) +find_by_log_attrs (GtkTextIter *iter, + FindLogAttrFunc func, + gboolean forward) { GtkTextIter orig; - gint offset = 0; - gboolean found = FALSE; + gboolean already_moved_initially = FALSE; g_return_val_if_fail (iter != NULL, FALSE); orig = *iter; - - found = find_line_log_attrs (iter, func, &offset, already_moved_initially); - - if (!found) + + while (TRUE) { + gint offset = 0; + gboolean found; + + found = find_line_log_attrs (iter, func, &offset, already_moved_initially); + + if (found) + { + gtk_text_iter_set_line_offset (iter, offset); + + return !gtk_text_iter_equal (iter, &orig) && !gtk_text_iter_is_end (iter); + } + if (forward) { - if (gtk_text_iter_forward_line (iter)) - return find_by_log_attrs (iter, func, forward, - TRUE); - else + if (!gtk_text_iter_forward_line (iter)) return FALSE; + + already_moved_initially = TRUE; } else - { + { + /* TODO optimize this part */ /* go to end of previous line. need to check that * line is > 0 because backward_line snaps to start of * line 0 if it's on line 0 */ - if (gtk_text_iter_get_line (iter) > 0 && + if (gtk_text_iter_get_line (iter) > 0 && gtk_text_iter_backward_line (iter)) { if (!gtk_text_iter_ends_line (iter)) gtk_text_iter_forward_to_line_end (iter); - - return find_by_log_attrs (iter, func, forward, - TRUE); + + already_moved_initially = TRUE; } else - return FALSE; + { + return FALSE; + } } } - else - { - gtk_text_iter_set_line_offset (iter, offset); - - return - (already_moved_initially || !gtk_text_iter_equal (iter, &orig)) && - !gtk_text_iter_is_end (iter); - } } -static gboolean -find_visible_by_log_attrs (GtkTextIter *iter, - FindLogAttrFunc func, - gboolean forward, - gboolean already_moved_initially) +static gboolean +find_visible_by_log_attrs (GtkTextIter *iter, + FindLogAttrFunc func, + gboolean forward) { GtkTextIter pos; g_return_val_if_fail (iter != NULL, FALSE); - + pos = *iter; - - while (find_by_log_attrs (&pos, func, forward, already_moved_initially)) + + while (find_by_log_attrs (&pos, func, forward)) { - if (!_gtk_text_btree_char_is_invisible (&pos)) + if (!_gtk_text_btree_char_is_invisible (&pos)) { *iter = pos; return TRUE; } - } + } return FALSE; } @@ -3225,7 +3224,7 @@ move_multiple_steps (GtkTextIter *iter, gboolean gtk_text_iter_forward_word_end (GtkTextIter *iter) { - return find_by_log_attrs (iter, find_word_end_func, TRUE, FALSE); + return find_by_log_attrs (iter, find_word_end_func, TRUE); } /** @@ -3243,7 +3242,7 @@ gtk_text_iter_forward_word_end (GtkTextIter *iter) gboolean gtk_text_iter_backward_word_start (GtkTextIter *iter) { - return find_by_log_attrs (iter, find_word_start_func, FALSE, FALSE); + return find_by_log_attrs (iter, find_word_start_func, FALSE); } /* FIXME a loop around a truly slow function means @@ -3303,7 +3302,7 @@ gtk_text_iter_backward_word_starts (GtkTextIter *iter, gboolean gtk_text_iter_forward_visible_word_end (GtkTextIter *iter) { - return find_visible_by_log_attrs (iter, find_word_end_func, TRUE, FALSE); + return find_visible_by_log_attrs (iter, find_word_end_func, TRUE); } /** @@ -3323,7 +3322,7 @@ gtk_text_iter_forward_visible_word_end (GtkTextIter *iter) gboolean gtk_text_iter_backward_visible_word_start (GtkTextIter *iter) { - return find_visible_by_log_attrs (iter, find_word_start_func, FALSE, FALSE); + return find_visible_by_log_attrs (iter, find_word_start_func, FALSE); } /** @@ -3487,7 +3486,7 @@ gtk_text_iter_inside_sentence (const GtkTextIter *iter) gboolean gtk_text_iter_forward_sentence_end (GtkTextIter *iter) { - return find_by_log_attrs (iter, find_sentence_end_func, TRUE, FALSE); + return find_by_log_attrs (iter, find_sentence_end_func, TRUE); } /** @@ -3505,7 +3504,7 @@ gtk_text_iter_forward_sentence_end (GtkTextIter *iter) gboolean gtk_text_iter_backward_sentence_start (GtkTextIter *iter) { - return find_by_log_attrs (iter, find_sentence_start_func, FALSE, FALSE); + return find_by_log_attrs (iter, find_sentence_start_func, FALSE); } /* FIXME a loop around a truly slow function means @@ -3620,7 +3619,7 @@ is_cursor_pos_func (const PangoLogAttr *attrs, gboolean gtk_text_iter_forward_cursor_position (GtkTextIter *iter) { - return find_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE, FALSE); + return find_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE); } /** @@ -3634,7 +3633,7 @@ gtk_text_iter_forward_cursor_position (GtkTextIter *iter) gboolean gtk_text_iter_backward_cursor_position (GtkTextIter *iter) { - return find_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE, FALSE); + return find_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE); } /** @@ -3689,7 +3688,7 @@ gtk_text_iter_backward_cursor_positions (GtkTextIter *iter, gboolean gtk_text_iter_forward_visible_cursor_position (GtkTextIter *iter) { - return find_visible_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE, FALSE); + return find_visible_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE); } /** @@ -3706,7 +3705,7 @@ gtk_text_iter_forward_visible_cursor_position (GtkTextIter *iter) gboolean gtk_text_iter_backward_visible_cursor_position (GtkTextIter *iter) { - return find_visible_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE, FALSE); + return find_visible_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE); } /** |