Mercurial > emacs
changeset 60130:f513e6d34868
(check_it, init_from_display_pos, handle_stop)
(setup_for_ellipsis, handle_single_display_spec)
(handle_composition_prop, next_overlay_string)
(get_overlay_strings, reseat_1, reseat_to_string)
(next_element_from_ellipsis, BUFFER_POS_REACHED_P)
(in_display_vector_p, display_line, get_next_display_element):
Change it->method from function pointer to enum.
(get_next_element): New array to map it->method to function.
(get_next_display_element): Use it.
(set_iterator_to_next): Use switch instead of if/else chain.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Wed, 16 Feb 2005 23:45:03 +0000 |
parents | cd9e37256a95 |
children | bb1a6b3a999d |
files | src/xdisp.c |
diffstat | 1 files changed, 84 insertions(+), 68 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Wed Feb 16 23:44:48 2005 +0000 +++ b/src/xdisp.c Wed Feb 16 23:45:03 2005 +0000 @@ -827,7 +827,6 @@ static int invisible_text_between_p P_ ((struct it *, int, int)); #endif -static int next_element_from_ellipsis P_ ((struct it *)); static void pint2str P_ ((char *, int, int)); static void pint2hrstr P_ ((char *, int, int)); static struct text_pos run_window_scroll_functions P_ ((Lisp_Object, @@ -902,6 +901,7 @@ static void back_to_previous_visible_line_start P_ ((struct it *)); void reseat_at_previous_visible_line_start P_ ((struct it *)); static void reseat_at_next_visible_line_start P_ ((struct it *, int)); +static int next_element_from_ellipsis P_ ((struct it *)); static int next_element_from_display_vector P_ ((struct it *)); static int next_element_from_string P_ ((struct it *)); static int next_element_from_c_string P_ ((struct it *)); @@ -2043,7 +2043,7 @@ check_it (it) struct it *it; { - if (it->method == next_element_from_string) + if (it->method == GET_FROM_STRING) { xassert (STRINGP (it->string)); xassert (IT_STRING_CHARPOS (*it) >= 0); @@ -2051,7 +2051,7 @@ else { xassert (IT_STRING_CHARPOS (*it) < 0); - if (it->method == next_element_from_buffer) + if (it->method == GET_FROM_BUFFER) { /* Check that character and byte positions agree. */ xassert (IT_CHARPOS (*it) == BYTE_TO_CHAR (IT_BYTEPOS (*it))); @@ -2561,7 +2561,7 @@ property for an image, the iterator will be set up for that image, and we have to undo that setup first before we can correct the overlay string index. */ - if (it->method == next_element_from_image) + if (it->method == GET_FROM_IMAGE) pop_it (it); /* We already have the first chunk of overlay strings in @@ -2584,7 +2584,7 @@ it->string = it->overlay_strings[relative_index]; xassert (STRINGP (it->string)); it->current.string_pos = pos->string_pos; - it->method = next_element_from_string; + it->method = GET_FROM_STRING; } #if 0 /* This is bogus because POS not having an overlay string @@ -2600,7 +2600,7 @@ while (it->sp) pop_it (it); it->current.overlay_string_index = -1; - it->method = next_element_from_buffer; + it->method = GET_FROM_BUFFER; if (CHARPOS (pos->pos) == ZV) it->overlay_strings_at_end_processed_p = 1; } @@ -2714,7 +2714,7 @@ { /* Don't check for overlay strings below when set to deliver characters from a display vector. */ - if (it->method == next_element_from_display_vector) + if (it->method == GET_FROM_DISPLAY_VECTOR) handle_overlay_change_p = 0; /* Handle overlay changes. */ @@ -3372,7 +3372,7 @@ /* Remember the current face id in case glyphs specify faces. IT's face is restored in set_iterator_to_next. */ it->saved_face_id = it->face_id; - it->method = next_element_from_display_vector; + it->method = GET_FROM_DISPLAY_VECTOR; it->ellipsis_p = 1; } @@ -3737,7 +3737,7 @@ it->image_id = -1; /* no image */ it->position = start_pos; it->object = NILP (object) ? it->w->buffer : object; - it->method = next_element_from_image; + it->method = GET_FROM_IMAGE; it->face_id = face_id; /* Say that we haven't consumed the characters with @@ -3820,7 +3820,7 @@ it->current.overlay_string_index = -1; IT_STRING_CHARPOS (*it) = IT_STRING_BYTEPOS (*it) = 0; it->end_charpos = it->string_nchars = SCHARS (it->string); - it->method = next_element_from_string; + it->method = GET_FROM_STRING; it->stop_charpos = 0; it->string_from_display_prop_p = 1; /* Say that we haven't consumed the characters with @@ -3830,7 +3830,7 @@ } else if (CONSP (value) && EQ (XCAR (value), Qspace)) { - it->method = next_element_from_stretch; + it->method = GET_FROM_STRETCH; it->object = value; it->current.pos = it->position = start_pos; } @@ -3841,7 +3841,7 @@ it->image_id = lookup_image (it->f, value); it->position = start_pos; it->object = NILP (object) ? it->w->buffer : object; - it->method = next_element_from_image; + it->method = GET_FROM_IMAGE; /* Say that we haven't consumed the characters with `display' property yet. The call to pop_it in @@ -4097,7 +4097,7 @@ if (id >= 0) { - it->method = next_element_from_composition; + it->method = GET_FROM_COMPOSITION; it->cmp_id = id; it->cmp_len = COMPOSITION_LENGTH (prop); /* For a terminal, draw only the first character of the @@ -4172,7 +4172,7 @@ it->current.overlay_string_index = -1; SET_TEXT_POS (it->current.string_pos, -1, -1); it->n_overlay_strings = 0; - it->method = next_element_from_buffer; + it->method = GET_FROM_BUFFER; /* If we're at the end of the buffer, record that we have processed the overlay strings there already, so that @@ -4201,7 +4201,7 @@ it->string = it->overlay_strings[i]; it->multibyte_p = STRING_MULTIBYTE (it->string); SET_TEXT_POS (it->current.string_pos, 0, 0); - it->method = next_element_from_string; + it->method = GET_FROM_STRING; it->stop_charpos = 0; } @@ -4466,13 +4466,13 @@ xassert (STRINGP (it->string)); it->end_charpos = SCHARS (it->string); it->multibyte_p = STRING_MULTIBYTE (it->string); - it->method = next_element_from_string; + it->method = GET_FROM_STRING; } else { it->string = Qnil; it->current.overlay_string_index = -1; - it->method = next_element_from_buffer; + it->method = GET_FROM_BUFFER; } CHECK_IT (it); @@ -4850,7 +4850,7 @@ IT_STRING_CHARPOS (*it) = -1; IT_STRING_BYTEPOS (*it) = -1; it->string = Qnil; - it->method = next_element_from_buffer; + it->method = GET_FROM_BUFFER; /* RMS: I added this to fix a bug in move_it_vertically_backward where it->area continued to relate to the starting point for the backward motion. Bug report from @@ -4916,7 +4916,7 @@ it->string = string; it->s = NULL; it->end_charpos = it->string_nchars = SCHARS (string); - it->method = next_element_from_string; + it->method = GET_FROM_STRING; it->current.string_pos = string_pos (charpos, string); } else @@ -4938,7 +4938,7 @@ it->end_charpos = it->string_nchars = strlen (s); } - it->method = next_element_from_c_string; + it->method = GET_FROM_C_STRING; } /* PRECISION > 0 means don't return more than PRECISION characters @@ -4969,6 +4969,20 @@ Iteration ***********************************************************************/ +/* Map enum it_method value to corresponding next_element_from_* function. */ + +static int (* get_next_element[NUM_IT_METHODS]) P_ ((struct it *it)) = +{ + next_element_from_buffer, + next_element_from_display_vector, + next_element_from_composition, + next_element_from_string, + next_element_from_c_string, + next_element_from_image, + next_element_from_stretch +}; + + /* Load IT's display element fields with information about the next display element from the current position of IT. Value is zero if end of buffer (or C string) is reached. */ @@ -4984,7 +4998,7 @@ int success_p; get_next: - success_p = (*it->method) (it); + success_p = (*get_next_element[it->method]) (it); if (it->what == IT_CHARACTER) { @@ -5018,7 +5032,7 @@ it->current.dpvec_index = 0; it->dpvec_face_id = -1; it->saved_face_id = it->face_id; - it->method = next_element_from_display_vector; + it->method = GET_FROM_DISPLAY_VECTOR; it->ellipsis_p = 0; } else @@ -5176,7 +5190,7 @@ it->current.dpvec_index = 0; it->dpvec_face_id = face_id; it->saved_face_id = it->face_id; - it->method = next_element_from_display_vector; + it->method = GET_FROM_DISPLAY_VECTOR; it->ellipsis_p = 0; goto get_next; } @@ -5238,8 +5252,9 @@ moving the iterator to a new position might set them. */ it->start_of_box_run_p = it->end_of_box_run_p = 0; - if (it->method == next_element_from_buffer) - { + switch (it->method) + { + case GET_FROM_BUFFER: /* The current display element of IT is a character from current_buffer. Advance in the buffer, and maybe skip over invisible lines that are so because of selective display. */ @@ -5252,32 +5267,32 @@ IT_CHARPOS (*it) += 1; xassert (IT_BYTEPOS (*it) == CHAR_TO_BYTE (IT_CHARPOS (*it))); } - } - else if (it->method == next_element_from_composition) - { - xassert (it->cmp_id >= 0 && it ->cmp_id < n_compositions); + break; + + case GET_FROM_COMPOSITION: + xassert (it->cmp_id >= 0 && it->cmp_id < n_compositions); if (STRINGP (it->string)) { IT_STRING_BYTEPOS (*it) += it->len; IT_STRING_CHARPOS (*it) += it->cmp_len; - it->method = next_element_from_string; + it->method = GET_FROM_STRING; goto consider_string_end; } else { IT_BYTEPOS (*it) += it->len; IT_CHARPOS (*it) += it->cmp_len; - it->method = next_element_from_buffer; - } - } - else if (it->method == next_element_from_c_string) - { + it->method = GET_FROM_BUFFER; + } + break; + + case GET_FROM_C_STRING: /* Current display element of IT is from a C string. */ IT_BYTEPOS (*it) += it->len; IT_CHARPOS (*it) += 1; - } - else if (it->method == next_element_from_display_vector) - { + break; + + case GET_FROM_DISPLAY_VECTOR: /* Current display element of IT is from a display table entry. Advance in the display table definition. Reset it to null if end reached, and continue with characters from buffers/ @@ -5291,11 +5306,11 @@ if (it->dpvec + it->current.dpvec_index == it->dpend) { if (it->s) - it->method = next_element_from_c_string; + it->method = GET_FROM_C_STRING; else if (STRINGP (it->string)) - it->method = next_element_from_string; - else - it->method = next_element_from_buffer; + it->method = GET_FROM_STRING; + else + it->method = GET_FROM_BUFFER; it->dpvec = NULL; it->current.dpvec_index = -1; @@ -5312,9 +5327,9 @@ /* Recheck faces after display vector */ it->stop_charpos = IT_CHARPOS (*it); } - } - else if (it->method == next_element_from_string) - { + break; + + case GET_FROM_STRING: /* Current display element is a character from a Lisp string. */ xassert (it->s == NULL && STRINGP (it->string)); IT_STRING_BYTEPOS (*it) += it->len; @@ -5339,34 +5354,35 @@ && it->sp > 0) { pop_it (it); - if (!STRINGP (it->string)) - it->method = next_element_from_buffer; - else + if (STRINGP (it->string)) goto consider_string_end; - } - } - } - else if (it->method == next_element_from_image - || it->method == next_element_from_stretch) - { + it->method = GET_FROM_BUFFER; + } + } + break; + + case GET_FROM_IMAGE: + case GET_FROM_STRETCH: /* The position etc with which we have to proceed are on the stack. The position may be at the end of a string, if the `display' property takes up the whole string. */ + xassert (it->sp > 0); pop_it (it); it->image_id = 0; if (STRINGP (it->string)) { - it->method = next_element_from_string; + it->method = GET_FROM_STRING; goto consider_string_end; } - else - it->method = next_element_from_buffer; - } - else - /* There are no other methods defined, so this should be a bug. */ - abort (); - - xassert (it->method != next_element_from_string + it->method = GET_FROM_BUFFER; + break; + + default: + /* There are no other methods defined, so this should be a bug. */ + abort (); + } + + xassert (it->method != GET_FROM_STRING || (STRINGP (it->string) && IT_STRING_CHARPOS (*it) >= 0)); } @@ -5578,7 +5594,7 @@ was in IT->saved_face_id, and signal that it's there by setting face_before_selective_p. */ it->saved_face_id = it->face_id; - it->method = next_element_from_buffer; + it->method = GET_FROM_BUFFER; reseat_at_next_visible_line_start (it, 1); it->face_before_selective_p = 1; } @@ -5823,8 +5839,8 @@ ((op & MOVE_TO_POS) != 0 \ && BUFFERP (it->object) \ && IT_CHARPOS (*it) >= to_charpos \ - && (it->method == next_element_from_buffer || \ - (it->method == next_element_from_display_vector && \ + && (it->method == GET_FROM_BUFFER || \ + (it->method == GET_FROM_DISPLAY_VECTOR && \ it->dpvec + it->current.dpvec_index + 1 >= it->dpend))) @@ -6507,7 +6523,7 @@ in_display_vector_p (it) struct it *it; { - return (it->method == next_element_from_display_vector + return (it->method == GET_FROM_DISPLAY_VECTOR && it->current.dpvec_index > 0 && it->dpvec + it->current.dpvec_index != it->dpend); } @@ -15248,7 +15264,7 @@ /* Record whether this row ends inside an ellipsis. */ row->ends_in_ellipsis_p - = (it->method == next_element_from_display_vector + = (it->method == GET_FROM_DISPLAY_VECTOR && it->ellipsis_p); /* Save fringe bitmaps in this row. */