comparison src/buffer.c @ 92975:ca18807830f1

(overlays_in, Foverlays_in): Include empty overlays at end of range when it coincides with the end of the buffer.
author Martin Rudalics <rudalics@gmx.at>
date Sat, 15 Mar 2008 09:13:59 +0000
parents b0c32527b009
children 87f463ae1530
comparison
equal deleted inserted replaced
92974:ea61d2529bd4 92975:ca18807830f1
1632 1632
1633 XSETCDR (link, Vbuffer_alist); 1633 XSETCDR (link, Vbuffer_alist);
1634 Vbuffer_alist = link; 1634 Vbuffer_alist = link;
1635 1635
1636 /* Effectively do a delq on buried_buffer_list. */ 1636 /* Effectively do a delq on buried_buffer_list. */
1637 1637
1638 prev = Qnil; 1638 prev = Qnil;
1639 for (link = XFRAME (frame)->buried_buffer_list; CONSP (link); 1639 for (link = XFRAME (frame)->buried_buffer_list; CONSP (link);
1640 link = XCDR (link)) 1640 link = XCDR (link))
1641 { 1641 {
1642 if (EQ (XCAR (link), buf)) 1642 if (EQ (XCAR (link), buf))
2811 if (prev_ptr) 2811 if (prev_ptr)
2812 *prev_ptr = prev; 2812 *prev_ptr = prev;
2813 return idx; 2813 return idx;
2814 } 2814 }
2815 2815
2816 /* Find all the overlays in the current buffer that overlap the range BEG-END 2816 /* Find all the overlays in the current buffer that overlap the range
2817 or are empty at BEG. 2817 BEG-END, or are empty at BEG, or are empty at END provided END
2818 denotes the position at the end of the current buffer.
2818 2819
2819 Return the number found, and store them in a vector in *VEC_PTR. 2820 Return the number found, and store them in a vector in *VEC_PTR.
2820 Store in *LEN_PTR the size allocated for the vector. 2821 Store in *LEN_PTR the size allocated for the vector.
2821 Store in *NEXT_PTR the next position after POS where an overlay starts, 2822 Store in *NEXT_PTR the next position after POS where an overlay starts,
2822 or ZV if there are no more overlays. 2823 or ZV if there are no more overlays.
2847 int len = *len_ptr; 2848 int len = *len_ptr;
2848 Lisp_Object *vec = *vec_ptr; 2849 Lisp_Object *vec = *vec_ptr;
2849 int next = ZV; 2850 int next = ZV;
2850 int prev = BEGV; 2851 int prev = BEGV;
2851 int inhibit_storing = 0; 2852 int inhibit_storing = 0;
2853 int end_is_Z = end == Z;
2852 2854
2853 for (tail = current_buffer->overlays_before; tail; tail = tail->next) 2855 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
2854 { 2856 {
2855 int startpos, endpos; 2857 int startpos, endpos;
2856 2858
2864 if (prev < endpos) 2866 if (prev < endpos)
2865 prev = endpos; 2867 prev = endpos;
2866 break; 2868 break;
2867 } 2869 }
2868 startpos = OVERLAY_POSITION (ostart); 2870 startpos = OVERLAY_POSITION (ostart);
2869 /* Count an interval if it either overlaps the range 2871 /* Count an interval if it overlaps the range, is empty at the
2870 or is empty at the start of the range. */ 2872 start of the range, or is empty at END provided END denotes the
2873 end of the buffer. */
2871 if ((beg < endpos && startpos < end) 2874 if ((beg < endpos && startpos < end)
2872 || (startpos == endpos && beg == endpos)) 2875 || (startpos == endpos
2876 && (beg == endpos || (end_is_Z && endpos == end))))
2873 { 2877 {
2874 if (idx == len) 2878 if (idx == len)
2875 { 2879 {
2876 /* The supplied vector is full. 2880 /* The supplied vector is full.
2877 Either make it bigger, or don't store any more in it. */ 2881 Either make it bigger, or don't store any more in it. */
2912 if (startpos < next) 2916 if (startpos < next)
2913 next = startpos; 2917 next = startpos;
2914 break; 2918 break;
2915 } 2919 }
2916 endpos = OVERLAY_POSITION (oend); 2920 endpos = OVERLAY_POSITION (oend);
2917 /* Count an interval if it either overlaps the range 2921 /* Count an interval if it overlaps the range, is empty at the
2918 or is empty at the start of the range. */ 2922 start of the range, or is empty at END provided END denotes the
2923 end of the buffer. */
2919 if ((beg < endpos && startpos < end) 2924 if ((beg < endpos && startpos < end)
2920 || (startpos == endpos && beg == endpos)) 2925 || (startpos == endpos
2926 && (beg == endpos || (end_is_Z && endpos == end))))
2921 { 2927 {
2922 if (idx == len) 2928 if (idx == len)
2923 { 2929 {
2924 if (extend) 2930 if (extend)
2925 { 2931 {
4111 4117
4112 DEFUN ("overlays-in", Foverlays_in, Soverlays_in, 2, 2, 0, 4118 DEFUN ("overlays-in", Foverlays_in, Soverlays_in, 2, 2, 0,
4113 doc: /* Return a list of the overlays that overlap the region BEG ... END. 4119 doc: /* Return a list of the overlays that overlap the region BEG ... END.
4114 Overlap means that at least one character is contained within the overlay 4120 Overlap means that at least one character is contained within the overlay
4115 and also contained within the specified region. 4121 and also contained within the specified region.
4116 Empty overlays are included in the result if they are located at BEG 4122 Empty overlays are included in the result if they are located at BEG,
4117 or between BEG and END. */) 4123 between BEG and END, or at END provided END denotes the position at the
4124 end of the buffer. */)
4118 (beg, end) 4125 (beg, end)
4119 Lisp_Object beg, end; 4126 Lisp_Object beg, end;
4120 { 4127 {
4121 int noverlays; 4128 int noverlays;
4122 Lisp_Object *overlay_vec; 4129 Lisp_Object *overlay_vec;