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.  */