diff options
author | Richard M. Stallman <rms@gnu.org> | 1993-07-13 21:05:26 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1993-07-13 21:05:26 +0000 |
commit | 91ebc99b74796ce7431851a862ee62e03f009582 (patch) | |
tree | 5cbac603cccbd3c324ef7b8428dd34804f84de96 | |
parent | b9e67d5b07f08db2f99cff3b05ea820c40743c8c (diff) | |
download | emacs-91ebc99b74796ce7431851a862ee62e03f009582.tar.gz |
(verify_overlay_modification): New function.
(call_overlay_mod_hooks): New function.
-rw-r--r-- | src/buffer.c | 95 |
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 |