changeset 2508:3aa2f3b35353

* buffer.c (Fmake_overlay, Fmove_overlay): New optional BUFFER arguments. (recenter_overlay_lists): New argument BUF, to use instead of the current buffer. (Foverlay_recenter): Pass the appropriate arguments to recenter_overlay_lists. * buffer.c (Fdelete_overlay): Don't assume that overlay is in the current buffer. Don't forget to declare the argument a Lisp_Object.
author Jim Blandy <jimb@redhat.com>
date Sat, 10 Apr 1993 07:57:57 +0000
parents 7ba4316ae840
children daaa78c8c980
files src/buffer.c
diffstat 1 files changed, 84 insertions(+), 51 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c	Sat Apr 10 07:57:21 1993 +0000
+++ b/src/buffer.c	Sat Apr 10 07:57:57 1993 +0000
@@ -1275,11 +1275,11 @@
   return idx;
 }
 
-/* Shift overlays in the current buffer's overlay lists,
-   to center the lists at POS.  */
+/* Shift overlays in BUF's overlay lists, to center the lists at POS.  */
 
 void
-recenter_overlay_lists (pos)
+recenter_overlay_lists (buf, pos)
+     struct buffer *buf;
      int pos;
 {
   Lisp_Object overlay, tail, next, prev, beg, end;
@@ -1290,7 +1290,7 @@
      But we use it for symmetry and in case that should cease to be true
      with some future change.  */
   prev = Qnil;
-  for (tail = current_buffer->overlays_before;
+  for (tail = buf->overlays_before;
        CONSP (tail);
        prev = tail, tail = next)
     {
@@ -1304,7 +1304,7 @@
 	  if (!NILP (prev))
 	    XCONS (prev)->cdr = next;
 	  else
-	    current_buffer->overlays_before = next;
+	    buf->overlays_before = next;
 	  tail = prev;
 	  continue;
 	}
@@ -1322,11 +1322,11 @@
 	  if (!NILP (prev))
 	    XCONS (prev)->cdr = next;
 	  else
-	    current_buffer->overlays_before = next;
+	    buf->overlays_before = next;
 
 	  /* Search thru overlays_after for where to put it.  */
 	  other_prev = Qnil;
-	  for (other = current_buffer->overlays_after;
+	  for (other = buf->overlays_after;
 	       CONSP (other);
 	       other_prev = other, other = XCONS (other)->cdr)
 	    {
@@ -1347,7 +1347,7 @@
 	  if (!NILP (other_prev))
 	    XCONS (other_prev)->cdr = tail;
 	  else
-	    current_buffer->overlays_after = tail;
+	    buf->overlays_after = tail;
 	  tail = prev;
 	}
       else
@@ -1359,7 +1359,7 @@
 
   /* See if anything in overlays_after should be in overlays_before.  */
   prev = Qnil;
-  for (tail = current_buffer->overlays_after;
+  for (tail = buf->overlays_after;
        CONSP (tail);
        prev = tail, tail = next)
     {
@@ -1373,7 +1373,7 @@
 	  if (!NILP (prev))
 	    XCONS (prev)->cdr = next;
 	  else
-	    current_buffer->overlays_after = next;
+	    buf->overlays_after = next;
 	  tail = prev;
 	  continue;
 	}
@@ -1396,11 +1396,11 @@
 	  if (!NILP (prev))
 	    XCONS (prev)->cdr = next;
 	  else
-	    current_buffer->overlays_after = next;
+	    buf->overlays_after = next;
 
 	  /* Search thru overlays_before for where to put it.  */
 	  other_prev = Qnil;
-	  for (other = current_buffer->overlays_before;
+	  for (other = buf->overlays_before;
 	       CONSP (other);
 	       other_prev = other, other = XCONS (other)->cdr)
 	    {
@@ -1421,83 +1421,116 @@
 	  if (!NILP (other_prev))
 	    XCONS (other_prev)->cdr = tail;
 	  else
-	    current_buffer->overlays_before = tail;
+	    buf->overlays_before = tail;
 	  tail = prev;
 	}
     }
 
-  XFASTINT (current_buffer->overlay_center) = pos;
+  XFASTINT (buf->overlay_center) = pos;
 }
 
-DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 2, 0,
-  "Create a new overlay in the current buffer, with range BEG to END.\n\
+DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 3, 0,
+  "Create a new overlay with range BEG to END in BUFFER.\n\
+If omitted, BUFFER defaults to the current buffer.\n\
 BEG and END may be integers or markers.")
-  (beg, end)
-     Lisp_Object beg, end;
+  (beg, end, buffer)
+     Lisp_Object beg, end, buffer;
 {
   Lisp_Object overlay;
+  struct buffer *b;
 
-  if (MARKERP (beg) && XBUFFER (Fmarker_buffer (beg)) != current_buffer)
-    error ("Marker points into wrong buffer");
-  if (MARKERP (end) && XBUFFER (Fmarker_buffer (end)) != current_buffer)
-    error ("Marker points into wrong buffer");
+  if (NILP (buffer))
+    XSET (buffer, Lisp_Buffer, current_buffer);
+  CHECK_BUFFER (buffer, 2);
+
+  b = XBUFFER (buffer);
 
-  overlay = Fcons (Fcons (Fcopy_marker (beg), Fcopy_marker (end)), Qnil);
+  if (MARKERP (beg))
+    {
+      if (! EQ (Fmarker_buffer (beg), buffer))
+	error ("Marker points into wrong buffer");
+      else
+	beg = Fcopy_marker (beg);
+    }
+  else
+    beg = Fset_marker (Fmake_marker (), beg, buffer);
+  if (MARKERP (end))
+    {
+      if (! EQ (Fmarker_buffer (end), buffer))
+	error ("Marker points into wrong buffer");
+      else
+	end = Fcopy_marker (end);
+    }
+  else
+    end = Fset_marker (Fmake_marker (), end, buffer);
+
+  overlay = Fcons (Fcons (beg, end), Qnil);
 
   /* Put the new overlay on the wrong list.  */ 
   end = OVERLAY_END (overlay);
-  if (OVERLAY_POSITION (end) < XINT (current_buffer->overlay_center))
-    current_buffer->overlays_after
-      = Fcons (overlay, current_buffer->overlays_after);
+  if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
+    b->overlays_after = Fcons (overlay, b->overlays_after);
   else
-    current_buffer->overlays_before
-      = Fcons (overlay, current_buffer->overlays_before);
+    b->overlays_before = Fcons (overlay, b->overlays_before);
 
   /* This puts it in the right list, and in the right order.  */
-  recenter_overlay_lists (XINT (current_buffer->overlay_center));
+  recenter_overlay_lists (b, XINT (b->overlay_center));
 
   return overlay;
 }
 
-DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 3, 0,
-  "Set the endpoints of OVERLAY to BEG and END.")
-  (overlay, beg, end)
-     Lisp_Object overlay, beg, end;
+DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0,
+  "Set the endpoints of OVERLAY to BEG and END in BUFFER.\n\
+If omitted, don't change OVERLAY's buffer.")
+  (overlay, beg, end, buffer)
+     Lisp_Object overlay, beg, end, buffer;
 {
+  struct buffer *b;
+
   if (!OVERLAY_VALID (overlay))
     error ("Invalid overlay object");
 
-  current_buffer->overlays_before
-    = Fdelq (overlay, current_buffer->overlays_before);
-  current_buffer->overlays_after
-    = Fdelq (overlay, current_buffer->overlays_after);
+  if (NILP (buffer))
+    buffer = Fmarker_buffer (OVERLAY_START (overlay));
+  CHECK_BUFFER (buffer, 3);
+
+  b = XBUFFER (buffer);
 
-  Fset_marker (OVERLAY_START (overlay), beg, Qnil);
-  Fset_marker (OVERLAY_END (overlay), end, Qnil);
+  b->overlays_before = Fdelq (overlay, b->overlays_before);
+  b->overlays_after  = Fdelq (overlay, b->overlays_after);
+
+  Fset_marker (OVERLAY_START (overlay), beg, buffer);
+  Fset_marker (OVERLAY_END   (overlay), end, buffer);
 
   /* Put the overlay on the wrong list.  */ 
   end = OVERLAY_END (overlay);
-  if (OVERLAY_POSITION (end) < XINT (current_buffer->overlay_center))
-    current_buffer->overlays_after
-      = Fcons (overlay, current_buffer->overlays_after);
+  if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
+    b->overlays_after = Fcons (overlay, b->overlays_after);
   else
-    current_buffer->overlays_before
-      = Fcons (overlay, current_buffer->overlays_before);
+    b->overlays_before = Fcons (overlay, b->overlays_before);
 
   /* This puts it in the right list, and in the right order.  */
-  recenter_overlay_lists (XINT (current_buffer->overlay_center));
+  recenter_overlay_lists (b, XINT (b->overlay_center));
 
   return overlay;
 }
 
 DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
-  "Delete the overlay OVERLAY from the current buffer.")
+  "Delete the overlay OVERLAY from its buffer.")
   (overlay)
+     Lisp_Object overlay;
 {
-  current_buffer->overlays_before
-    = Fdelq (overlay, current_buffer->overlays_before);
-  current_buffer->overlays_after
-    = Fdelq (overlay, current_buffer->overlays_after);
+  struct buffer *b;
+
+  if (OVERLAY_VALID (overlay))
+    b = XBUFFER (Fmarker_buffer (OVERLAY_START (overlay)));
+  else
+    /* Guess! */
+    b = current_buffer;
+
+  b->overlays_before = Fdelq (overlay, b->overlays_before);
+  b->overlays_after  = Fdelq (overlay, b->overlays_after);
+
   return Qnil;
 }
 
@@ -1597,7 +1630,7 @@
 {
   CHECK_NUMBER_COERCE_MARKER (pos, 0);
 
-  recenter_overlay_lists (XINT (pos));
+  recenter_overlay_lists (current_buffer, XINT (pos));
   return Qnil;
 }