Commit a6f82cc4 authored by Kim F. Storm's avatar Kim F. Storm
Browse files

(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.
parent 6a88f968
......@@ -827,7 +827,6 @@ static char *decode_mode_spec_coding P_ ((Lisp_Object, char *, int));
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 reseat_1 P_ ((struct it *, struct text_pos, int));
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 @@ static void
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 @@ check_it (it)
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 @@ init_from_display_pos (it, w, pos)
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 @@ init_from_display_pos (it, w, pos)
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 @@ init_from_display_pos (it, w, pos)
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 @@ handle_stop (it)
{
/* 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 @@ setup_for_ellipsis (it, len)
/* 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 @@ handle_single_display_spec (it, spec, object, position,
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 @@ handle_single_display_spec (it, spec, object, position,
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 @@ handle_single_display_spec (it, spec, object, position,
}
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 @@ handle_single_display_spec (it, spec, object, position,
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 @@ handle_composition_prop (it)
 
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 @@ next_overlay_string (it)
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 @@ next_overlay_string (it)
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 @@ get_overlay_strings (it, charpos)
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 @@ reseat_1 (it, pos, set_stop_p)
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 @@ reseat_to_string (it, s, string, charpos, precision, field_width, multibyte)
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 @@ reseat_to_string (it, s, string, charpos, precision, field_width, multibyte)
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 @@ reseat_to_string (it, s, string, charpos, precision, field_width, multibyte)
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 @@ get_next_display_element (it)
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 @@ get_next_display_element (it)
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 @@ get_next_display_element (it)
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 @@ set_iterator_to_next (it, reseat_p)
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 @@ set_iterator_to_next (it, reseat_p)
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;
it->method = GET_FROM_BUFFER;
}
}
else if (it->method == next_element_from_c_string)
{
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 @@ set_iterator_to_next (it, reseat_p)
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;
it->method = GET_FROM_STRING;
else
it->method = next_element_from_buffer;
it->method = GET_FROM_BUFFER;
 
it->dpvec = NULL;
it->current.dpvec_index = -1;
......@@ -5312,9 +5327,9 @@ set_iterator_to_next (it, reseat_p)
/* 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 @@ set_iterator_to_next (it, reseat_p)
&& 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;
it->method = GET_FROM_BUFFER;
}
}
}
else if (it->method == next_element_from_image
|| it->method == next_element_from_stretch)
{
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;
it->method = GET_FROM_BUFFER;
break;
default:
/* There are no other methods defined, so this should be a bug. */
abort ();
}
else
/* There are no other methods defined, so this should be a bug. */
abort ();
 
xassert (it->method != next_element_from_string
xassert (it->method != GET_FROM_STRING
|| (STRINGP (it->string)
&& IT_STRING_CHARPOS (*it) >= 0));
}
......@@ -5578,7 +5594,7 @@ next_element_from_ellipsis (it)
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 @@ move_it_in_display_line_to (it, to_charpos, to_x, op)
((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 @@ int
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 @@ display_line (it)
 
/* 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. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment