aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/buffer.c b/src/buffer.c
index bdc5c05f8e1..b7193942010 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -2663,7 +2663,7 @@ If there are no more overlay boundaries after POS, return (point-max).")
2663DEFUN ("previous-overlay-change", Fprevious_overlay_change, 2663DEFUN ("previous-overlay-change", Fprevious_overlay_change,
2664 Sprevious_overlay_change, 1, 1, 0, 2664 Sprevious_overlay_change, 1, 1, 0,
2665 "Return the previous position before POS where an overlay starts or ends.\n\ 2665 "Return the previous position before POS where an overlay starts or ends.\n\
2666If there are no more overlay boundaries after POS, return (point-min).") 2666If there are no more overlay boundaries before POS, return (point-min).")
2667 (pos) 2667 (pos)
2668 Lisp_Object pos; 2668 Lisp_Object pos;
2669{ 2669{
@@ -2672,19 +2672,25 @@ If there are no more overlay boundaries after POS, return (point-min).")
2672 Lisp_Object *overlay_vec; 2672 Lisp_Object *overlay_vec;
2673 int len; 2673 int len;
2674 int i; 2674 int i;
2675 Lisp_Object tail;
2675 2676
2676 CHECK_NUMBER_COERCE_MARKER (pos, 0); 2677 CHECK_NUMBER_COERCE_MARKER (pos, 0);
2677 2678
2678 len = 10; 2679 len = 10;
2679 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object)); 2680 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
2680 2681
2682 /* At beginning of buffer, we know the answer;
2683 avoid bug subtracting 1 below. */
2684 if (XINT (pos) == BEGV)
2685 return pos;
2686
2681 /* Put all the overlays we want in a vector in overlay_vec. 2687 /* Put all the overlays we want in a vector in overlay_vec.
2682 Store the length in len. 2688 Store the length in len.
2683 prevpos gets the position of an overlay end. */ 2689 prevpos gets the position of an overlay end. */
2684 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len, 2690 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len,
2685 (int *) 0, &prevpos); 2691 (int *) 0, &prevpos);
2686 2692
2687 /* If any of these overlays starts before endpos, 2693 /* If any of these overlays starts after prevpos,
2688 maybe use its starting point instead. */ 2694 maybe use its starting point instead. */
2689 for (i = 0; i < noverlays; i++) 2695 for (i = 0; i < noverlays; i++)
2690 { 2696 {
@@ -2697,6 +2703,22 @@ If there are no more overlay boundaries after POS, return (point-min).")
2697 prevpos = ostartpos; 2703 prevpos = ostartpos;
2698 } 2704 }
2699 2705
2706 /* If any overlay ends at pos, consider its starting point too. */
2707 for (tail = current_buffer->overlays_before;
2708 GC_CONSP (tail);
2709 tail = XCONS (tail)->cdr)
2710 {
2711 Lisp_Object overlay, ostart;
2712 int ostartpos;
2713
2714 overlay = XCONS (tail)->car;
2715
2716 ostart = OVERLAY_START (overlay);
2717 ostartpos = OVERLAY_POSITION (ostart);
2718 if (ostartpos > prevpos && ostartpos < XINT (pos))
2719 prevpos = ostartpos;
2720 }
2721
2700 xfree (overlay_vec); 2722 xfree (overlay_vec);
2701 return make_number (prevpos); 2723 return make_number (prevpos);
2702} 2724}