changeset 4077:a860278e3ab3

(verify_overlay_modification): New function. (call_overlay_mod_hooks): New function.
author Richard M. Stallman <rms@gnu.org>
date Tue, 13 Jul 1993 21:05:26 +0000
parents 9fd5ecacfbbb
children 7d7b899db77d
files src/buffer.c
diffstat 1 files changed, 95 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c	Tue Jul 13 21:04:07 1993 +0000
+++ b/src/buffer.c	Tue Jul 13 21:05:26 1993 +0000
@@ -100,6 +100,7 @@
 
 Lisp_Object Fset_buffer ();
 void set_buffer_internal ();
+static void call_overlay_mod_hooks ();
 
 /* Alist of all buffer names vs the buffers. */
 /* This used to be a variable, but is no longer,
@@ -1868,6 +1869,100 @@
   return value;
 }
 
+/* Run the modification-hooks of overlays that include
+   any part of the text in START to END.
+   Run the insert-before-hooks of overlay starting at END,
+   and the insert-after-hooks of overlay ending at START.  */
+
+void
+verify_overlay_modification (start, end)
+     Lisp_Object start, end;
+{
+  Lisp_Object prop, overlay, tail;
+  int insertion = EQ (start, end);
+
+  for (tail = current_buffer->overlays_before;
+       CONSP (tail);
+       tail = XCONS (tail)->cdr)
+    {
+      int startpos, endpos;
+      int ostart, oend;
+
+      overlay = XCONS (tail)->car;
+
+      ostart = OVERLAY_START (overlay);
+      oend = OVERLAY_END (overlay);
+      endpos = OVERLAY_POSITION (oend);
+      if (XFASTINT (start) > endpos)
+	break;
+      startpos = OVERLAY_POSITION (ostart);
+      if (XFASTINT (end) == startpos && insertion)
+	{
+	  prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
+	  call_overlay_mod_hooks (prop, overlay, start, end);
+	}
+      if (XFASTINT (start) == endpos && insertion)
+	{
+	  prop = Foverlay_get (overlay, Qinsert_behind_hooks);
+	  call_overlay_mod_hooks (prop, overlay, start, end);
+	}
+      if (insertion
+	  ? (XFASTINT (start) > startpos && XFASTINT (end) < endpos)
+	  : (XFASTINT (start) >= startpos && XFASTINT (end) <= endpos))
+	{
+	  prop = Foverlay_get (overlay, Qmodification_hooks);
+	  call_overlay_mod_hooks (prop, overlay, start, end);
+	}
+    }
+
+  for (tail = current_buffer->overlays_after;
+       CONSP (tail);
+       tail = XCONS (tail)->cdr)
+    {
+      int startpos, endpos;
+      int ostart, oend;
+
+      overlay = XCONS (tail)->car;
+
+      ostart = OVERLAY_START (overlay);
+      oend = OVERLAY_END (overlay);
+      startpos = OVERLAY_POSITION (ostart);
+      if (XFASTINT (end) < startpos)
+	break;
+      if (XFASTINT (end) == startpos && insertion)
+	{
+	  prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
+	  call_overlay_mod_hooks (prop, overlay, start, end);
+	}
+      if (XFASTINT (start) == endpos && insertion)
+	{
+	  prop = Foverlay_get (overlay, Qinsert_behind_hooks);
+	  call_overlay_mod_hooks (prop, overlay, start, end);
+	}
+      if (insertion
+	  ? (XFASTINT (start) > startpos && XFASTINT (end) < endpos)
+	  : (XFASTINT (start) >= startpos && XFASTINT (end) <= endpos))
+	{
+	  prop = Foverlay_get (overlay, Qmodification_hooks);
+	  call_overlay_mod_hooks (prop, overlay, start, end);
+	}
+    }
+}
+
+static void
+call_overlay_mod_hooks (list, overlay, start, end)
+     Lisp_Object list, overlay, start, end;
+{
+  struct gcpro gcpro1;
+  GCPRO1 (list);
+  while (!NILP (list))
+    {
+      call3 (Fcar (list), overlay, start, end);
+      list = Fcdr (list);
+    }
+  UNGCPRO;
+}
+
 /* Somebody has tried to store NEWVAL into the buffer-local slot with
    offset XUINT (valcontents), and NEWVAL has an unacceptable type.  */
 void