From f538fcec9abe33859fe4b7d84ea1d5a07d476469 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 25 Apr 2010 19:55:59 +0300 Subject: [PATCH] Move code that bidi-iterates out of display property to a separate function. xdisp.c (iterate_out_of_display_property): New function, body from pop_it. (pop_it): Use it. --- src/ChangeLog | 2 ++ src/xdisp.c | 47 ++++++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 8b1c81261cc..58fdad2d1d2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -2,6 +2,8 @@ * xdisp.c (display_line): Fix crash with bidi display on the last empty line. (Bug#6030) + (iterate_out_of_display_property): New function, body from pop_it. + (pop_it): Use it. 2010-04-24 Eli Zaretskii diff --git a/src/xdisp.c b/src/xdisp.c index 3282c42f2a7..4834b61a626 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -5259,6 +5259,33 @@ push_it (it) ++it->sp; } +static void +iterate_out_of_display_property (it) + struct it *it; +{ + /* Maybe initialize paragraph direction. If we are at the beginning + of a new paragraph, next_element_from_buffer may not have a + chance to do that. */ + if (it->bidi_it.first_elt && it->bidi_it.charpos < ZV) + bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it); + /* prev_stop can be zero, so check against BEGV as well. */ + while (it->bidi_it.charpos >= BEGV + && it->prev_stop <= it->bidi_it.charpos + && it->bidi_it.charpos < CHARPOS (it->position)) + bidi_get_next_char_visually (&it->bidi_it); + /* Record the stop_pos we just crossed, for when we cross it + back, maybe. */ + if (it->bidi_it.charpos > CHARPOS (it->position)) + it->prev_stop = CHARPOS (it->position); + /* If we ended up not where pop_it put us, resync IT's + positional members with the bidi iterator. */ + if (it->bidi_it.charpos != CHARPOS (it->position)) + { + SET_TEXT_POS (it->position, + it->bidi_it.charpos, it->bidi_it.bytepos); + it->current.pos = it->position; + } +} /* Restore IT's settings from IT->stack. Called, for example, when no more overlay strings must be processed, and we return to delivering @@ -5309,25 +5336,7 @@ pop_it (it) determine the paragraph base direction if the overlay we just processed is at the beginning of a new paragraph. */ - if (it->bidi_it.first_elt && it->bidi_it.charpos < ZV) - bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it); - /* prev_stop can be zero, so check against BEGV as well. */ - while (it->bidi_it.charpos >= BEGV - && it->prev_stop <= it->bidi_it.charpos - && it->bidi_it.charpos < CHARPOS (it->position)) - bidi_get_next_char_visually (&it->bidi_it); - /* Record the stop_pos we just crossed, for when we cross it - back, maybe. */ - if (it->bidi_it.charpos > CHARPOS (it->position)) - it->prev_stop = CHARPOS (it->position); - /* If we ended up not where pop_it put us, resync IT's - positional members with the bidi iterator. */ - if (it->bidi_it.charpos != CHARPOS (it->position)) - { - SET_TEXT_POS (it->position, - it->bidi_it.charpos, it->bidi_it.bytepos); - it->current.pos = it->position; - } + iterate_out_of_display_property (it); } break; case GET_FROM_STRING: -- 2.39.5