END, provided END denotes the position at the end of the accessible
part of the buffer.
+ If TRAILING is true, include overlays that begin at END, provided
+ END denotes the position at the end of the accessible part of the
+ buffer.
+
Return the number found, and store them in a vector in *VEC_PTR.
Store in *LEN_PTR the size allocated for the vector.
Store in *NEXT_PTR the next position after POS where an overlay starts,
ptrdiff_t
overlays_in (ptrdiff_t beg, ptrdiff_t end, bool extend,
- Lisp_Object **vec_ptr, ptrdiff_t *len_ptr, bool empty,
+ Lisp_Object **vec_ptr, ptrdiff_t *len_ptr,
+ bool empty, bool trailing,
ptrdiff_t *next_ptr)
{
ptrdiff_t idx = 0;
Lisp_Object *vec = *vec_ptr;
struct itree_node *node;
- ITREE_FOREACH (node, current_buffer->overlays, beg,
- /* Find empty OV at ZV ? */
- (end >= ZV && empty) ? ZV + 1 : ZV, ASCENDING)
+ /* Extend the search range if overlays beginning at ZV are
+ wanted. */
+ ptrdiff_t search_end = ZV;
+ if (end >= ZV && (empty || trailing))
+ ++search_end;
+
+ ITREE_FOREACH (node, current_buffer->overlays, beg, search_end,
+ ASCENDING)
{
if (node->begin > end)
{
Lisp_Object **vec_ptr, ptrdiff_t *len_ptr,
ptrdiff_t *next_ptr)
{
- return overlays_in (pos, pos + 1, extend, vec_ptr, len_ptr, false, next_ptr);
+ return overlays_in (pos, pos + 1, extend, vec_ptr, len_ptr,
+ false, true, next_ptr);
}
ptrdiff_t
size = ARRAYELTS (vbuf);
v = vbuf;
- n = overlays_in (start, end, 0, &v, &size, true, NULL);
+ n = overlays_in (start, end, 0, &v, &size, true, false, NULL);
if (n > size)
{
SAFE_NALLOCA (v, 1, n);
- overlays_in (start, end, 0, &v, &n, true, NULL);
+ overlays_in (start, end, 0, &v, &n, true, false, NULL);
}
for (i = 0; i < n; ++i)
size = ARRAYELTS (vbuf);
v = vbuf;
- n = overlays_in (ZV, ZV, 0, &v, &size, false, NULL);
+ n = overlays_in (ZV, ZV, 0, &v, &size, false, false, NULL);
if (n > size)
{
SAFE_NALLOCA (v, 1, n);
- overlays_in (ZV, ZV, 0, &v, &n, false, NULL);
+ overlays_in (ZV, ZV, 0, &v, &n, false, false, NULL);
}
for (i = 0; i < n; ++i)
/* Put all the overlays we want in a vector in overlay_vec.
Store the length in len. */
noverlays = overlays_in (XFIXNUM (beg), XFIXNUM (end), 1, &overlay_vec, &len,
- true, NULL);
+ true, false, NULL);
/* Make a list of them all. */
result = Flist (noverlays, overlay_vec);
extern void evaporate_overlays (ptrdiff_t);
extern ptrdiff_t overlays_at (ptrdiff_t, bool, Lisp_Object **, ptrdiff_t *, ptrdiff_t *);
extern ptrdiff_t overlays_in (ptrdiff_t, ptrdiff_t, bool, Lisp_Object **,
- ptrdiff_t *, bool, ptrdiff_t *);
+ ptrdiff_t *, bool, bool, ptrdiff_t *);
extern ptrdiff_t previous_overlay_change (ptrdiff_t);
extern ptrdiff_t next_overlay_change (ptrdiff_t);
extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *);
(should-length 1 (overlays-at 15))
(should-length 1 (overlays-at (point-max))))))
+(defun sorted-overlays (overlays)
+ (sort
+ (mapcar (lambda (overlay)
+ (list (overlay-start overlay)
+ (overlay-end overlay)))
+ overlays)
+ (lambda (first second)
+ (cl-loop for a in first
+ for b in second
+ thereis (< a b)
+ until (> a b)))))
+
+(defun sorted-overlays-at (pos)
+ (sorted-overlays (overlays-at pos)))
+
+(defun sorted-overlays-in (beg end)
+ (sorted-overlays (overlays-in beg end)))
+
+(ert-deftest test-overlays-at-narrow-to-region-end ()
+ ;; See bug#58703.
+ (with-temp-buffer
+ (insert (make-string 30 ?x))
+ (make-overlay 10 11)
+ (narrow-to-region 10 10)
+ (should (equal
+ '((10 11))
+ (sorted-overlays-at 10)))))
;; +==========================================================================+
;; | overlay-in
(deftest-overlays-in-1 ae 9 11 (a) (a 10 10))
(deftest-overlays-in-1 af 10 11 (a) (a 10 10))
-(defun sorted-overlays-in (beg end)
- (sort
- (mapcar (lambda (overlay)
- (list (overlay-start overlay)
- (overlay-end overlay)))
- (overlays-in beg end))
- (lambda (first second)
- (cl-loop for a in first
- for b in second
- thereis (< a b)
- until (> a b)))))
-
;; behavior for empty range
(ert-deftest test-overlays-in-empty-range ()
(with-temp-buffer