diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 26 |
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).") | |||
| 2663 | DEFUN ("previous-overlay-change", Fprevious_overlay_change, | 2663 | DEFUN ("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\ |
| 2666 | If there are no more overlay boundaries after POS, return (point-min).") | 2666 | If 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 | } |