diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 85 |
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 | |||
| 3676 | buffer. */) | 3676 | buffer. */) |
| 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))); |