aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c85
1 files changed, 43 insertions, 42 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 5d431f21a70..20260d5a5d8 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3676,10 +3676,10 @@ If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current
3676buffer. */) 3676buffer. */)
3677 (Lisp_Object overlay, Lisp_Object beg, Lisp_Object end, Lisp_Object buffer) 3677 (Lisp_Object overlay, Lisp_Object beg, Lisp_Object end, Lisp_Object buffer)
3678{ 3678{
3679 struct buffer *b, *ob; 3679 struct buffer *b, *ob = 0;
3680 Lisp_Object obuffer; 3680 Lisp_Object obuffer;
3681 ptrdiff_t count = SPECPDL_INDEX (); 3681 ptrdiff_t count = SPECPDL_INDEX ();
3682 ptrdiff_t n_beg, n_end; 3682 ptrdiff_t n_beg, n_end, o_beg IF_LINT (= 0), o_end IF_LINT (= 0);
3683 3683
3684 CHECK_OVERLAY (overlay); 3684 CHECK_OVERLAY (overlay);
3685 if (NILP (buffer)) 3685 if (NILP (buffer))
@@ -3688,6 +3688,9 @@ buffer. */)
3688 XSETBUFFER (buffer, current_buffer); 3688 XSETBUFFER (buffer, current_buffer);
3689 CHECK_BUFFER (buffer); 3689 CHECK_BUFFER (buffer);
3690 3690
3691 if (NILP (Fbuffer_live_p (buffer)))
3692 error ("Attempt to move overlay to a dead buffer");
3693
3691 if (MARKERP (beg) 3694 if (MARKERP (beg)
3692 && ! EQ (Fmarker_buffer (beg), buffer)) 3695 && ! EQ (Fmarker_buffer (beg), buffer))
3693 error ("Marker points into wrong buffer"); 3696 error ("Marker points into wrong buffer");
@@ -3697,38 +3700,45 @@ buffer. */)
3697 3700
3698 CHECK_NUMBER_COERCE_MARKER (beg); 3701 CHECK_NUMBER_COERCE_MARKER (beg);
3699 CHECK_NUMBER_COERCE_MARKER (end); 3702 CHECK_NUMBER_COERCE_MARKER (end);
3700 n_beg = clip_to_bounds (PTRDIFF_MIN, XINT (beg), PTRDIFF_MAX);
3701 n_end = clip_to_bounds (PTRDIFF_MIN, XINT (end), PTRDIFF_MAX);
3702
3703 if (n_beg == n_end && ! NILP (Foverlay_get (overlay, Qevaporate)))
3704 return Fdelete_overlay (overlay);
3705 3703
3706 if (n_beg > n_end) 3704 if (XINT (beg) > XINT (end))
3707 { 3705 {
3708 ptrdiff_t temp; 3706 Lisp_Object temp;
3709 temp = n_beg; n_beg = n_end; n_end = temp; 3707 temp = beg; beg = end; end = temp;
3710 } 3708 }
3711 3709
3712 specbind (Qinhibit_quit, Qt); 3710 specbind (Qinhibit_quit, Qt);
3713 3711
3714 obuffer = Fmarker_buffer (OVERLAY_START (overlay)); 3712 obuffer = Fmarker_buffer (OVERLAY_START (overlay));
3715 b = XBUFFER (buffer); 3713 b = XBUFFER (buffer);
3716 ob = BUFFERP (obuffer) ? XBUFFER (obuffer) : (struct buffer *) 0; 3714
3715 if (!NILP (obuffer))
3716 {
3717 ob = XBUFFER (obuffer);
3718
3719 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3720 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
3721
3722 ob->overlays_before =
3723 unchain_overlay (ob->overlays_before, XOVERLAY (overlay));
3724 ob->overlays_after =
3725 unchain_overlay (ob->overlays_after, XOVERLAY (overlay));
3726 eassert (XOVERLAY (overlay)->next == NULL);
3727 }
3728
3729 /* Set the overlay boundaries, which may clip them. */
3730 Fset_marker (OVERLAY_START (overlay), beg, buffer);
3731 Fset_marker (OVERLAY_END (overlay), end, buffer);
3732
3733 n_beg = marker_position (OVERLAY_START (overlay));
3734 n_end = marker_position (OVERLAY_END (overlay));
3717 3735
3718 /* If the overlay has changed buffers, do a thorough redisplay. */ 3736 /* If the overlay has changed buffers, do a thorough redisplay. */
3719 if (!EQ (buffer, obuffer)) 3737 if (!EQ (buffer, obuffer))
3720 { 3738 {
3721 /* Redisplay where the overlay was. */ 3739 /* Redisplay where the overlay was. */
3722 if (!NILP (obuffer)) 3740 if (ob)
3723 { 3741 modify_overlay (ob, o_beg, o_end);
3724 ptrdiff_t o_beg;
3725 ptrdiff_t o_end;
3726
3727 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3728 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
3729
3730 modify_overlay (ob, o_beg, o_end);
3731 }
3732 3742
3733 /* Redisplay where the overlay is going to be. */ 3743 /* Redisplay where the overlay is going to be. */
3734 modify_overlay (b, n_beg, n_end); 3744 modify_overlay (b, n_beg, n_end);
@@ -3736,11 +3746,6 @@ buffer. */)
3736 else 3746 else
3737 /* Redisplay the area the overlay has just left, or just enclosed. */ 3747 /* Redisplay the area the overlay has just left, or just enclosed. */
3738 { 3748 {
3739 ptrdiff_t o_beg, o_end;
3740
3741 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3742 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
3743
3744 if (o_beg == n_beg) 3749 if (o_beg == n_beg)
3745 modify_overlay (b, o_end, n_end); 3750 modify_overlay (b, o_end, n_end);
3746 else if (o_end == n_end) 3751 else if (o_end == n_end)
@@ -3749,21 +3754,14 @@ buffer. */)
3749 modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end)); 3754 modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end));
3750 } 3755 }
3751 3756
3752 if (!NILP (obuffer)) 3757 /* Delete the overlay if it is empty after clipping and has the
3753 { 3758 evaporate property. */
3754 ob->overlays_before 3759 if (n_beg == n_end && !NILP (Foverlay_get (overlay, Qevaporate)))
3755 = unchain_overlay (ob->overlays_before, XOVERLAY (overlay)); 3760 return unbind_to (count, Fdelete_overlay (overlay));
3756 ob->overlays_after
3757 = unchain_overlay (ob->overlays_after, XOVERLAY (overlay));
3758 eassert (XOVERLAY (overlay)->next == NULL);
3759 }
3760
3761 Fset_marker (OVERLAY_START (overlay), beg, buffer);
3762 Fset_marker (OVERLAY_END (overlay), end, buffer);
3763 3761
3764 /* Put the overlay on the wrong list. */ 3762 /* Put the overlay into the new buffer's overlay lists, first on the
3765 end = OVERLAY_END (overlay); 3763 wrong list. */
3766 if (OVERLAY_POSITION (end) < b->overlay_center) 3764 if (n_end < b->overlay_center)
3767 { 3765 {
3768 XOVERLAY (overlay)->next = b->overlays_after; 3766 XOVERLAY (overlay)->next = b->overlays_after;
3769 b->overlays_after = XOVERLAY (overlay); 3767 b->overlays_after = XOVERLAY (overlay);
@@ -3797,9 +3795,12 @@ DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
3797 b = XBUFFER (buffer); 3795 b = XBUFFER (buffer);
3798 specbind (Qinhibit_quit, Qt); 3796 specbind (Qinhibit_quit, Qt);
3799 3797
3800 b->overlays_before = unchain_overlay (b->overlays_before,XOVERLAY (overlay)); 3798 b->overlays_before
3801 b->overlays_after = unchain_overlay (b->overlays_after, XOVERLAY (overlay)); 3799 = unchain_overlay (b->overlays_before, XOVERLAY (overlay));
3800 b->overlays_after
3801 = unchain_overlay (b->overlays_after, XOVERLAY (overlay));
3802 eassert (XOVERLAY (overlay)->next == NULL); 3802 eassert (XOVERLAY (overlay)->next == NULL);
3803
3803 modify_overlay (b, 3804 modify_overlay (b,
3804 marker_position (OVERLAY_START (overlay)), 3805 marker_position (OVERLAY_START (overlay)),
3805 marker_position (OVERLAY_END (overlay))); 3806 marker_position (OVERLAY_END (overlay)));