emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/xdisp.c


From: Kim F . Storm
Subject: [Emacs-diffs] Changes to emacs/src/xdisp.c
Date: Wed, 16 Feb 2005 18:45:03 -0500

Index: emacs/src/xdisp.c
diff -c emacs/src/xdisp.c:1.980 emacs/src/xdisp.c:1.981
*** emacs/src/xdisp.c:1.980     Tue Feb 15 23:04:45 2005
--- emacs/src/xdisp.c   Wed Feb 16 23:45:03 2005
***************
*** 827,833 ****
  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,
--- 827,832 ----
***************
*** 902,907 ****
--- 901,907 ----
  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,2049 ****
  check_it (it)
       struct it *it;
  {
!   if (it->method == next_element_from_string)
      {
        xassert (STRINGP (it->string));
        xassert (IT_STRING_CHARPOS (*it) >= 0);
--- 2043,2049 ----
  check_it (it)
       struct it *it;
  {
!   if (it->method == GET_FROM_STRING)
      {
        xassert (STRINGP (it->string));
        xassert (IT_STRING_CHARPOS (*it) >= 0);
***************
*** 2051,2057 ****
    else
      {
        xassert (IT_STRING_CHARPOS (*it) < 0);
!       if (it->method == next_element_from_buffer)
        {
          /* Check that character and byte positions agree.  */
          xassert (IT_CHARPOS (*it) == BYTE_TO_CHAR (IT_BYTEPOS (*it)));
--- 2051,2057 ----
    else
      {
        xassert (IT_STRING_CHARPOS (*it) < 0);
!       if (it->method == GET_FROM_BUFFER)
        {
          /* Check that character and byte positions agree.  */
          xassert (IT_CHARPOS (*it) == BYTE_TO_CHAR (IT_BYTEPOS (*it)));
***************
*** 2561,2567 ****
         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)
        pop_it (it);
  
        /* We already have the first chunk of overlay strings in
--- 2561,2567 ----
         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 == GET_FROM_IMAGE)
        pop_it (it);
  
        /* We already have the first chunk of overlay strings in
***************
*** 2584,2590 ****
        it->string = it->overlay_strings[relative_index];
        xassert (STRINGP (it->string));
        it->current.string_pos = pos->string_pos;
!       it->method = next_element_from_string;
      }
  
  #if 0 /* This is bogus because POS not having an overlay string
--- 2584,2590 ----
        it->string = it->overlay_strings[relative_index];
        xassert (STRINGP (it->string));
        it->current.string_pos = pos->string_pos;
!       it->method = GET_FROM_STRING;
      }
  
  #if 0 /* This is bogus because POS not having an overlay string
***************
*** 2600,2606 ****
        while (it->sp)
        pop_it (it);
        it->current.overlay_string_index = -1;
!       it->method = next_element_from_buffer;
        if (CHARPOS (pos->pos) == ZV)
        it->overlay_strings_at_end_processed_p = 1;
      }
--- 2600,2606 ----
        while (it->sp)
        pop_it (it);
        it->current.overlay_string_index = -1;
!       it->method = GET_FROM_BUFFER;
        if (CHARPOS (pos->pos) == ZV)
        it->overlay_strings_at_end_processed_p = 1;
      }
***************
*** 2714,2720 ****
        {
          /* Don't check for overlay strings below when set to deliver
             characters from a display vector.  */
!         if (it->method == next_element_from_display_vector)
            handle_overlay_change_p = 0;
  
          /* Handle overlay changes.  */
--- 2714,2720 ----
        {
          /* Don't check for overlay strings below when set to deliver
             characters from a display vector.  */
!         if (it->method == GET_FROM_DISPLAY_VECTOR)
            handle_overlay_change_p = 0;
  
          /* Handle overlay changes.  */
***************
*** 3372,3378 ****
    /* 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->ellipsis_p = 1;
  }
  
--- 3372,3378 ----
    /* 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 = GET_FROM_DISPLAY_VECTOR;
    it->ellipsis_p = 1;
  }
  
***************
*** 3737,3743 ****
        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->face_id = face_id;
  
        /* Say that we haven't consumed the characters with
--- 3737,3743 ----
        it->image_id = -1; /* no image */
        it->position = start_pos;
        it->object = NILP (object) ? it->w->buffer : object;
!       it->method = GET_FROM_IMAGE;
        it->face_id = face_id;
  
        /* Say that we haven't consumed the characters with
***************
*** 3820,3826 ****
          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->stop_charpos = 0;
          it->string_from_display_prop_p = 1;
          /* Say that we haven't consumed the characters with
--- 3820,3826 ----
          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 = GET_FROM_STRING;
          it->stop_charpos = 0;
          it->string_from_display_prop_p = 1;
          /* Say that we haven't consumed the characters with
***************
*** 3830,3836 ****
        }
        else if (CONSP (value) && EQ (XCAR (value), Qspace))
        {
!         it->method = next_element_from_stretch;
          it->object = value;
          it->current.pos = it->position = start_pos;
        }
--- 3830,3836 ----
        }
        else if (CONSP (value) && EQ (XCAR (value), Qspace))
        {
!         it->method = GET_FROM_STRETCH;
          it->object = value;
          it->current.pos = it->position = start_pos;
        }
***************
*** 3841,3847 ****
          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;
  
          /* Say that we haven't consumed the characters with
             `display' property yet.  The call to pop_it in
--- 3841,3847 ----
          it->image_id = lookup_image (it->f, value);
          it->position = start_pos;
          it->object = NILP (object) ? it->w->buffer : object;
!         it->method = GET_FROM_IMAGE;
  
          /* Say that we haven't consumed the characters with
             `display' property yet.  The call to pop_it in
***************
*** 4097,4103 ****
  
        if (id >= 0)
        {
!         it->method = next_element_from_composition;
          it->cmp_id = id;
          it->cmp_len = COMPOSITION_LENGTH (prop);
          /* For a terminal, draw only the first character of the
--- 4097,4103 ----
  
        if (id >= 0)
        {
!         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,4178 ****
        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;
  
        /* If we're at the end of the buffer, record that we have
         processed the overlay strings there already, so that
--- 4172,4178 ----
        it->current.overlay_string_index = -1;
        SET_TEXT_POS (it->current.string_pos, -1, -1);
        it->n_overlay_strings = 0;
!       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,4207 ****
        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->stop_charpos = 0;
      }
  
--- 4201,4207 ----
        it->string = it->overlay_strings[i];
        it->multibyte_p = STRING_MULTIBYTE (it->string);
        SET_TEXT_POS (it->current.string_pos, 0, 0);
!       it->method = GET_FROM_STRING;
        it->stop_charpos = 0;
      }
  
***************
*** 4466,4478 ****
        xassert (STRINGP (it->string));
        it->end_charpos = SCHARS (it->string);
        it->multibyte_p = STRING_MULTIBYTE (it->string);
!       it->method = next_element_from_string;
      }
    else
      {
        it->string = Qnil;
        it->current.overlay_string_index = -1;
!       it->method = next_element_from_buffer;
      }
  
    CHECK_IT (it);
--- 4466,4478 ----
        xassert (STRINGP (it->string));
        it->end_charpos = SCHARS (it->string);
        it->multibyte_p = STRING_MULTIBYTE (it->string);
!       it->method = GET_FROM_STRING;
      }
    else
      {
        it->string = Qnil;
        it->current.overlay_string_index = -1;
!       it->method = GET_FROM_BUFFER;
      }
  
    CHECK_IT (it);
***************
*** 4850,4856 ****
    IT_STRING_CHARPOS (*it) = -1;
    IT_STRING_BYTEPOS (*it) = -1;
    it->string = Qnil;
!   it->method = next_element_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
--- 4850,4856 ----
    IT_STRING_CHARPOS (*it) = -1;
    IT_STRING_BYTEPOS (*it) = -1;
    it->string = Qnil;
!   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,4922 ****
        it->string = string;
        it->s = NULL;
        it->end_charpos = it->string_nchars = SCHARS (string);
!       it->method = next_element_from_string;
        it->current.string_pos = string_pos (charpos, string);
      }
    else
--- 4916,4922 ----
        it->string = string;
        it->s = NULL;
        it->end_charpos = it->string_nchars = SCHARS (string);
!       it->method = GET_FROM_STRING;
        it->current.string_pos = string_pos (charpos, string);
      }
    else
***************
*** 4938,4944 ****
          it->end_charpos = it->string_nchars = strlen (s);
        }
  
!       it->method = next_element_from_c_string;
      }
  
    /* PRECISION > 0 means don't return more than PRECISION characters
--- 4938,4944 ----
          it->end_charpos = it->string_nchars = strlen (s);
        }
  
!       it->method = GET_FROM_C_STRING;
      }
  
    /* PRECISION > 0 means don't return more than PRECISION characters
***************
*** 4969,4974 ****
--- 4969,4988 ----
                              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,4990 ****
    int success_p;
  
   get_next:
!   success_p = (*it->method) (it);
  
    if (it->what == IT_CHARACTER)
      {
--- 4998,5004 ----
    int success_p;
  
   get_next:
!   success_p = (*get_next_element[it->method]) (it);
  
    if (it->what == IT_CHARACTER)
      {
***************
*** 5018,5024 ****
                  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->ellipsis_p = 0;
                }
              else
--- 5032,5038 ----
                  it->current.dpvec_index = 0;
                  it->dpvec_face_id = -1;
                  it->saved_face_id = it->face_id;
!                 it->method = GET_FROM_DISPLAY_VECTOR;
                  it->ellipsis_p = 0;
                }
              else
***************
*** 5176,5182 ****
              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->ellipsis_p = 0;
              goto get_next;
            }
--- 5190,5196 ----
              it->current.dpvec_index = 0;
              it->dpvec_face_id = face_id;
              it->saved_face_id = it->face_id;
!             it->method = GET_FROM_DISPLAY_VECTOR;
              it->ellipsis_p = 0;
              goto get_next;
            }
***************
*** 5238,5245 ****
       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)
      {
        /* 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,5260 ----
       moving the iterator to a new position might set them.  */
    it->start_of_box_run_p = it->end_of_box_run_p = 0;
  
!   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,5283 ****
          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);
        if (STRINGP (it->string))
        {
          IT_STRING_BYTEPOS (*it) += it->len;
          IT_STRING_CHARPOS (*it) += it->cmp_len;
!         it->method = next_element_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)
!     {
        /* 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)
!     {
        /* 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/
--- 5267,5298 ----
          IT_CHARPOS (*it) += 1;
          xassert (IT_BYTEPOS (*it) == CHAR_TO_BYTE (IT_CHARPOS (*it)));
        }
!       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 = GET_FROM_STRING;
          goto consider_string_end;
        }
        else
        {
          IT_BYTEPOS (*it) += it->len;
          IT_CHARPOS (*it) += it->cmp_len;
!         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;
!       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,5301 ****
        if (it->dpvec + it->current.dpvec_index == it->dpend)
        {
          if (it->s)
!           it->method = next_element_from_c_string;
          else if (STRINGP (it->string))
!           it->method = next_element_from_string;
          else
!           it->method = next_element_from_buffer;
  
          it->dpvec = NULL;
          it->current.dpvec_index = -1;
--- 5306,5316 ----
        if (it->dpvec + it->current.dpvec_index == it->dpend)
        {
          if (it->s)
!           it->method = GET_FROM_C_STRING;
          else if (STRINGP (it->string))
!           it->method = GET_FROM_STRING;
          else
!           it->method = GET_FROM_BUFFER;
  
          it->dpvec = NULL;
          it->current.dpvec_index = -1;
***************
*** 5312,5320 ****
          /* Recheck faces after display vector */
          it->stop_charpos = IT_CHARPOS (*it);
        }
!     }
!   else if (it->method == next_element_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;
--- 5327,5335 ----
          /* Recheck faces after display vector */
          it->stop_charpos = IT_CHARPOS (*it);
        }
!       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,5372 ****
              && it->sp > 0)
            {
              pop_it (it);
!             if (!STRINGP (it->string))
!               it->method = next_element_from_buffer;
!             else
                goto consider_string_end;
            }
        }
!     }
!   else if (it->method == next_element_from_image
!          || it->method == next_element_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.  */
        pop_it (it);
        it->image_id = 0;
        if (STRINGP (it->string))
        {
!         it->method = next_element_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
           || (STRINGP (it->string)
               && IT_STRING_CHARPOS (*it) >= 0));
  }
--- 5354,5388 ----
              && it->sp > 0)
            {
              pop_it (it);
!             if (STRINGP (it->string))
                goto consider_string_end;
+             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 = GET_FROM_STRING;
          goto consider_string_end;
        }
!       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,5584 ****
         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;
        reseat_at_next_visible_line_start (it, 1);
        it->face_before_selective_p = 1;
      }
--- 5594,5600 ----
         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 = GET_FROM_BUFFER;
        reseat_at_next_visible_line_start (it, 1);
        it->face_before_selective_p = 1;
      }
***************
*** 5823,5830 ****
    ((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->dpvec + it->current.dpvec_index + 1 >= it->dpend)))
  
  
--- 5839,5846 ----
    ((op & MOVE_TO_POS) != 0                                    \
     && BUFFERP (it->object)                                    \
     && IT_CHARPOS (*it) >= to_charpos                          \
!    && (it->method == GET_FROM_BUFFER ||                               \
!        (it->method == GET_FROM_DISPLAY_VECTOR &&              \
        it->dpvec + it->current.dpvec_index + 1 >= it->dpend)))
  
  
***************
*** 6507,6513 ****
  in_display_vector_p (it)
       struct it *it;
  {
!   return (it->method == next_element_from_display_vector
          && it->current.dpvec_index > 0
          && it->dpvec + it->current.dpvec_index != it->dpend);
  }
--- 6523,6529 ----
  in_display_vector_p (it)
       struct it *it;
  {
!   return (it->method == GET_FROM_DISPLAY_VECTOR
          && it->current.dpvec_index > 0
          && it->dpvec + it->current.dpvec_index != it->dpend);
  }
***************
*** 15248,15254 ****
  
    /* Record whether this row ends inside an ellipsis.  */
    row->ends_in_ellipsis_p
!     = (it->method == next_element_from_display_vector
         && it->ellipsis_p);
  
    /* Save fringe bitmaps in this row.  */
--- 15264,15270 ----
  
    /* Record whether this row ends inside an ellipsis.  */
    row->ends_in_ellipsis_p
!     = (it->method == GET_FROM_DISPLAY_VECTOR
         && it->ellipsis_p);
  
    /* Save fringe bitmaps in this row.  */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]