summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1993-07-13 21:05:26 +0000
committerRichard M. Stallman <rms@gnu.org>1993-07-13 21:05:26 +0000
commit91ebc99b74796ce7431851a862ee62e03f009582 (patch)
tree5cbac603cccbd3c324ef7b8428dd34804f84de96
parentb9e67d5b07f08db2f99cff3b05ea820c40743c8c (diff)
downloademacs-91ebc99b74796ce7431851a862ee62e03f009582.tar.gz
(verify_overlay_modification): New function.
(call_overlay_mod_hooks): New function.
-rw-r--r--src/buffer.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 403d1ef22b0..ce07c2a21d3 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -100,6 +100,7 @@ struct buffer buffer_local_types;
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 @@ DEFUN ("overlay-put", Foverlay_put, Soverlay_put, 3, 3, 0,
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