emacs-diffs
[Top][All Lists]
Advanced

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

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


From: Kim F . Storm
Subject: [Emacs-diffs] Changes to emacs/src/search.c
Date: Wed, 08 Jun 2005 18:32:20 -0400

Index: emacs/src/search.c
diff -c emacs/src/search.c:1.192 emacs/src/search.c:1.193
*** emacs/src/search.c:1.192    Wed Apr 20 07:21:47 2005
--- emacs/src/search.c  Wed Jun  8 22:32:20 2005
***************
*** 2739,2745 ****
    return match_limit (subexp, 0);
  }
  
! DEFUN ("match-data", Fmatch_data, Smatch_data, 0, 2, 0,
         doc: /* Return a list containing all info on what the last search 
matched.
  Element 2N is `(match-beginning N)'; element 2N + 1 is `(match-end N)'.
  All the elements are markers or nil (nil if the Nth pair didn't match)
--- 2739,2745 ----
    return match_limit (subexp, 0);
  }
  
! DEFUN ("match-data", Fmatch_data, Smatch_data, 0, 3, 0,
         doc: /* Return a list containing all info on what the last search 
matched.
  Element 2N is `(match-beginning N)'; element 2N + 1 is `(match-end N)'.
  All the elements are markers or nil (nil if the Nth pair didn't match)
***************
*** 2751,2767 ****
  this case, and if the last match was in a buffer, the buffer will get
  stored as one additional element at the end of the list.
  
! If REUSE is a list, reuse it as part of the value.  If REUSE is long enough
! to hold all the values, and if INTEGERS is non-nil, no consing is done.
  
  Return value is undefined if the last search failed.  */)
!      (integers, reuse)
!      Lisp_Object integers, reuse;
  {
    Lisp_Object tail, prev;
    Lisp_Object *data;
    int i, len;
  
    if (NILP (last_thing_searched))
      return Qnil;
  
--- 2751,2785 ----
  this case, and if the last match was in a buffer, the buffer will get
  stored as one additional element at the end of the list.
  
! If REUSE is a list, reuse it as part of the value.  If REUSE is long
! enough to hold all the values, and if INTEGERS is non-nil, no consing
! is done.
! 
! If optional third arg RESEAT is non-nil, any previous markers on the
! REUSE list will be modified to point to nowhere.
! 
! If RESEAT is `evaporate', put markers back on the free list.
! Note: No other references to the markers must exist if you use this.
  
  Return value is undefined if the last search failed.  */)
!   (integers, reuse, reseat)
!      Lisp_Object integers, reuse, reseat;
  {
    Lisp_Object tail, prev;
    Lisp_Object *data;
    int i, len;
  
+   if (!NILP (reseat))
+     for (tail = reuse; CONSP (tail); tail = XCDR (tail))
+       if (MARKERP (XCAR (tail)))
+       {
+         if (EQ (reseat, Qevaporate))
+           free_marker (XCAR (tail));
+         else
+           unchain_marker (XMARKER (XCAR (tail)));
+         XSETCAR (tail, Qnil);
+       }
+ 
    if (NILP (last_thing_searched))
      return Qnil;
  
***************
*** 2797,2806 ****
            /* last_thing_searched must always be Qt, a buffer, or Qnil.  */
            abort ();
  
!         len = 2*(i+1);
        }
        else
!       data[2 * i] = data [2 * i + 1] = Qnil;
      }
  
    if (BUFFERP (last_thing_searched) && !NILP (integers))
--- 2815,2824 ----
            /* last_thing_searched must always be Qt, a buffer, or Qnil.  */
            abort ();
  
!         len = 2 * i + 2;
        }
        else
!       data[2 * i] = data[2 * i + 1] = Qnil;
      }
  
    if (BUFFERP (last_thing_searched) && !NILP (integers))
***************
*** 2834,2844 ****
  }
  
  
! DEFUN ("set-match-data", Fset_match_data, Sset_match_data, 1, 1, 0,
         doc: /* Set internal data on last search match from elements of LIST.
! LIST should have been created by calling `match-data' previously.  */)
!      (list)
!      register Lisp_Object list;
  {
    register int i;
    register Lisp_Object marker;
--- 2852,2866 ----
  }
  
  
! DEFUN ("set-match-data", Fset_match_data, Sset_match_data, 1, 2, 0,
         doc: /* Set internal data on last search match from elements of LIST.
! LIST should have been created by calling `match-data' previously.
! 
! If optional arg RESEAT is non-nil, make markers on LIST point nowhere.
! If RESEAT is `evaporate', put the markers back on the free list.
! Note: No other references to the markers must exist if you use this.  */)
!     (list, reseat)
!      register Lisp_Object list, reseat;
  {
    register int i;
    register Lisp_Object marker;
***************
*** 2882,2890 ****
        search_regs.num_regs = length;
        }
  
!     for (i = 0;; i++)
        {
!       marker = Fcar (list);
        if (BUFFERP (marker))
          {
            last_thing_searched = marker;
--- 2904,2912 ----
        search_regs.num_regs = length;
        }
  
!     for (i = 0; CONSP (list); i++)
        {
!       marker = XCAR (list);
        if (BUFFERP (marker))
          {
            last_thing_searched = marker;
***************
*** 2895,2906 ****
        if (NILP (marker))
          {
            search_regs.start[i] = -1;
!           list = Fcdr (list);
          }
        else
          {
            int from;
  
            if (MARKERP (marker))
              {
                if (XMARKER (marker)->buffer == 0)
--- 2917,2930 ----
        if (NILP (marker))
          {
            search_regs.start[i] = -1;
!           list = XCDR (list);
          }
        else
          {
            int from;
+           Lisp_Object m;
  
+           m = marker;
            if (MARKERP (marker))
              {
                if (XMARKER (marker)->buffer == 0)
***************
*** 2911,2927 ****
  
            CHECK_NUMBER_COERCE_MARKER (marker);
            from = XINT (marker);
-           list = Fcdr (list);
  
!           marker = Fcar (list);
            if (MARKERP (marker) && XMARKER (marker)->buffer == 0)
              XSETFASTINT (marker, 0);
  
            CHECK_NUMBER_COERCE_MARKER (marker);
            search_regs.start[i] = from;
            search_regs.end[i] = XINT (marker);
          }
!       list = Fcdr (list);
        }
  
      for (; i < search_regs.num_regs; i++)
--- 2935,2970 ----
  
            CHECK_NUMBER_COERCE_MARKER (marker);
            from = XINT (marker);
  
!           if (!NILP (reseat) && MARKERP (m))
!             {
!               if (EQ (reseat, Qevaporate))
!                 free_marker (m);
!               else
!                 unchain_marker (XMARKER (m));
!             }
! 
!           if ((list = XCDR (list), !CONSP (list)))
!             break;
! 
!           m = marker = XCAR (list);
! 
            if (MARKERP (marker) && XMARKER (marker)->buffer == 0)
              XSETFASTINT (marker, 0);
  
            CHECK_NUMBER_COERCE_MARKER (marker);
            search_regs.start[i] = from;
            search_regs.end[i] = XINT (marker);
+ 
+           if (!NILP (reseat) && MARKERP (m))
+             {
+               if (EQ (reseat, Qevaporate))
+                 free_marker (m);
+               else
+                 unchain_marker (XMARKER (m));
+             }
          }
!       list = XCDR (list);
        }
  
      for (; i < search_regs.num_regs; i++)
***************
*** 2959,2965 ****
  
  /* Called upon exit from filters and sentinels. */
  void
! restore_match_data ()
  {
    if (search_regs_saved)
      {
--- 3002,3008 ----
  
  /* Called upon exit from filters and sentinels. */
  void
! restore_search_regs ()
  {
    if (search_regs_saved)
      {
***************
*** 2977,2982 ****
--- 3020,3040 ----
      }
  }
  
+ static Lisp_Object
+ unwind_set_match_data (list)
+      Lisp_Object list;
+ {
+   return Fset_match_data (list, Qevaporate);
+ }
+ 
+ /* Called to unwind protect the match data.  */
+ void
+ record_unwind_save_match_data ()
+ {
+   record_unwind_protect (unwind_set_match_data,
+                        Fmatch_data (Qnil, Qnil, Qnil));
+ }
+ 
  /* Quote a string to inactivate reg-expr chars */
  
  DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0,




reply via email to

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