Mercurial > emacs
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