summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2012-08-08 18:47:11 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2012-08-08 18:47:11 +0400
commit4cb3e6b38ac6c50279474db0e87a52253af52f59 (patch)
tree3a4af4b3aa9291bea206fd76f729a2bda4c93c58 /src/buffer.c
parentd9f9b465414c4c345574d9f179808380751c070e (diff)
downloademacs-4cb3e6b38ac6c50279474db0e87a52253af52f59.tar.gz
emacs-4cb3e6b38ac6c50279474db0e87a52253af52f59.tar.bz2
emacs-4cb3e6b38ac6c50279474db0e87a52253af52f59.zip
Inline functions to examine and change buffer overlays.
* buffer.c (unchain_both): New function. * buffer.h (buffer_get_overlays, buffer_set_overlays): (buffer_has_overlays): New function. (enum overlay_type): New enum. * alloc.c, buffer.c, editfns.c, fileio.c, indent.c: * insdel.c, intervals.c, print.c, xdisp.c: Adjust users.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c132
1 files changed, 73 insertions, 59 deletions
diff --git a/src/buffer.c b/src/buffer.c
index fab7330b195..6b68f34bb15 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -474,8 +474,10 @@ clone_per_buffer_values (struct buffer *from, struct buffer *to)
memcpy (to->local_flags, from->local_flags, sizeof to->local_flags);
- to->overlays_before = copy_overlays (to, from->overlays_before);
- to->overlays_after = copy_overlays (to, from->overlays_after);
+ buffer_set_overlays
+ (to, copy_overlays (to, buffer_get_overlays (from, OV_BEFORE)), OV_BEFORE);
+ buffer_set_overlays
+ (to, copy_overlays (to, buffer_get_overlays (from, OV_AFTER)), OV_AFTER);
/* Get (a copy of) the alist of Lisp-level local variables of FROM
and install that in TO. */
@@ -674,21 +676,22 @@ delete_all_overlays (struct buffer *b)
{
struct Lisp_Overlay *ov, *next;
- for (ov = b->overlays_before; ov; ov = next)
+ for (ov = buffer_get_overlays (b, OV_BEFORE); ov; ov = next)
{
drop_overlay (b, ov);
next = ov->next;
ov->next = NULL;
}
- for (ov = b->overlays_after; ov; ov = next)
+ for (ov = buffer_get_overlays (b, OV_AFTER); ov; ov = next)
{
drop_overlay (b, ov);
next = ov->next;
ov->next = NULL;
}
- b->overlays_before = b->overlays_after = NULL;
+ buffer_set_overlays (b, NULL, OV_BEFORE);
+ buffer_set_overlays (b, NULL, OV_AFTER);
}
/* Reinitialize everything about a buffer except its name and contents
@@ -716,8 +719,8 @@ reset_buffer (register struct buffer *b)
b->auto_save_failure_time = 0;
BVAR (b, auto_save_file_name) = Qnil;
BVAR (b, read_only) = Qnil;
- b->overlays_before = NULL;
- b->overlays_after = NULL;
+ buffer_set_overlays (b, NULL, OV_BEFORE);
+ buffer_set_overlays (b, NULL, OV_AFTER);
b->overlay_center = BEG;
BVAR (b, mark_active) = Qnil;
BVAR (b, point_before_scroll) = Qnil;
@@ -2602,7 +2605,7 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr,
ptrdiff_t prev = BEGV;
int inhibit_storing = 0;
- for (tail = current_buffer->overlays_before; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_BEFORE); tail; tail = tail->next)
{
ptrdiff_t startpos, endpos;
@@ -2650,7 +2653,7 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr,
next = startpos;
}
- for (tail = current_buffer->overlays_after; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_AFTER); tail; tail = tail->next)
{
ptrdiff_t startpos, endpos;
@@ -2737,7 +2740,7 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend,
int inhibit_storing = 0;
int end_is_Z = end == Z;
- for (tail = current_buffer->overlays_before; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_BEFORE); tail; tail = tail->next)
{
ptrdiff_t startpos, endpos;
@@ -2784,7 +2787,7 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend,
next = startpos;
}
- for (tail = current_buffer->overlays_after; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_AFTER); tail; tail = tail->next)
{
ptrdiff_t startpos, endpos;
@@ -2874,7 +2877,7 @@ overlay_touches_p (ptrdiff_t pos)
Lisp_Object overlay;
struct Lisp_Overlay *tail;
- for (tail = current_buffer->overlays_before; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_BEFORE); tail; tail = tail->next)
{
ptrdiff_t endpos;
@@ -2888,7 +2891,7 @@ overlay_touches_p (ptrdiff_t pos)
return 1;
}
- for (tail = current_buffer->overlays_after; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_AFTER); tail; tail = tail->next)
{
ptrdiff_t startpos;
@@ -3089,7 +3092,7 @@ overlay_strings (ptrdiff_t pos, struct window *w, unsigned char **pstr)
overlay_heads.used = overlay_heads.bytes = 0;
overlay_tails.used = overlay_tails.bytes = 0;
- for (ov = current_buffer->overlays_before; ov; ov = ov->next)
+ for (ov = buffer_get_overlays (NULL, OV_BEFORE); ov; ov = ov->next)
{
XSETMISC (overlay, ov);
eassert (OVERLAYP (overlay));
@@ -3117,7 +3120,7 @@ overlay_strings (ptrdiff_t pos, struct window *w, unsigned char **pstr)
Foverlay_get (overlay, Qpriority),
endpos - startpos);
}
- for (ov = current_buffer->overlays_after; ov; ov = ov->next)
+ for (ov = buffer_get_overlays (NULL, OV_AFTER); ov; ov = ov->next)
{
XSETMISC (overlay, ov);
eassert (OVERLAYP (overlay));
@@ -3215,7 +3218,7 @@ recenter_overlay_lists (struct buffer *buf, ptrdiff_t pos)
But we use it for symmetry and in case that should cease to be true
with some future change. */
prev = NULL;
- for (tail = buf->overlays_before; tail; prev = tail, tail = next)
+ for (tail = buffer_get_overlays (buf, OV_BEFORE); tail; prev = tail, tail = next)
{
next = tail->next;
XSETMISC (overlay, tail);
@@ -3234,11 +3237,11 @@ recenter_overlay_lists (struct buffer *buf, ptrdiff_t pos)
if (prev)
prev->next = next;
else
- buf->overlays_before = next;
+ buffer_set_overlays (buf, next, OV_BEFORE);
/* Search thru overlays_after for where to put it. */
other_prev = NULL;
- for (other = buf->overlays_after; other;
+ for (other = buffer_get_overlays (buf, OV_AFTER); other;
other_prev = other, other = other->next)
{
Lisp_Object otherbeg, otheroverlay;
@@ -3256,7 +3259,7 @@ recenter_overlay_lists (struct buffer *buf, ptrdiff_t pos)
if (other_prev)
other_prev->next = tail;
else
- buf->overlays_after = tail;
+ buffer_set_overlays (buf, tail, OV_AFTER);
tail = prev;
}
else
@@ -3268,7 +3271,7 @@ recenter_overlay_lists (struct buffer *buf, ptrdiff_t pos)
/* See if anything in overlays_after should be in overlays_before. */
prev = NULL;
- for (tail = buf->overlays_after; tail; prev = tail, tail = next)
+ for (tail = buffer_get_overlays (buf, OV_AFTER); tail; prev = tail, tail = next)
{
next = tail->next;
XSETMISC (overlay, tail);
@@ -3292,11 +3295,11 @@ recenter_overlay_lists (struct buffer *buf, ptrdiff_t pos)
if (prev)
prev->next = next;
else
- buf->overlays_after = next;
+ buffer_set_overlays (buf, next, OV_AFTER);
/* Search thru overlays_before for where to put it. */
other_prev = NULL;
- for (other = buf->overlays_before; other;
+ for (other = buffer_get_overlays (buf, OV_BEFORE); other;
other_prev = other, other = other->next)
{
Lisp_Object otherend, otheroverlay;
@@ -3314,7 +3317,7 @@ recenter_overlay_lists (struct buffer *buf, ptrdiff_t pos)
if (other_prev)
other_prev->next = tail;
else
- buf->overlays_before = tail;
+ buffer_set_overlays (buf, tail, OV_BEFORE);
tail = prev;
}
}
@@ -3367,7 +3370,7 @@ fix_start_end_in_overlays (register ptrdiff_t start, register ptrdiff_t end)
assigned. */
struct Lisp_Overlay *beforep = NULL, *afterp = NULL;
/* 'Parent', likewise, indicates a cons cell or
- current_buffer->overlays_before or overlays_after, depending
+ before or after overlays list, depending
which loop we're in. */
struct Lisp_Overlay *tail, *parent;
ptrdiff_t startpos, endpos;
@@ -3379,7 +3382,7 @@ fix_start_end_in_overlays (register ptrdiff_t start, register ptrdiff_t end)
(after_list) if it is, is still uninitialized. So it's not a bug
that before_list isn't initialized, although it may look
strange. */
- for (parent = NULL, tail = current_buffer->overlays_before; tail;)
+ for (parent = NULL, tail = buffer_get_overlays (NULL, OV_BEFORE); tail;)
{
XSETMISC (overlay, tail);
@@ -3419,7 +3422,7 @@ fix_start_end_in_overlays (register ptrdiff_t start, register ptrdiff_t end)
beforep = tail;
}
if (!parent)
- current_buffer->overlays_before = tail->next;
+ buffer_set_overlays (NULL, tail->next, OV_BEFORE);
else
parent->next = tail->next;
tail = tail->next;
@@ -3427,7 +3430,7 @@ fix_start_end_in_overlays (register ptrdiff_t start, register ptrdiff_t end)
else
parent = tail, tail = parent->next;
}
- for (parent = NULL, tail = current_buffer->overlays_after; tail;)
+ for (parent = NULL, tail = buffer_get_overlays (NULL, OV_AFTER); tail;)
{
XSETMISC (overlay, tail);
@@ -3465,7 +3468,7 @@ fix_start_end_in_overlays (register ptrdiff_t start, register ptrdiff_t end)
beforep = tail;
}
if (!parent)
- current_buffer->overlays_after = tail->next;
+ buffer_set_overlays (NULL, tail->next, OV_AFTER);
else
parent->next = tail->next;
tail = tail->next;
@@ -3478,15 +3481,15 @@ fix_start_end_in_overlays (register ptrdiff_t start, register ptrdiff_t end)
and let the recenter function make it sane again. */
if (beforep)
{
- beforep->next = current_buffer->overlays_before;
- current_buffer->overlays_before = before_list;
+ beforep->next = buffer_get_overlays (NULL, OV_BEFORE);
+ buffer_set_overlays (NULL, before_list, OV_BEFORE);
}
recenter_overlay_lists (current_buffer, current_buffer->overlay_center);
if (afterp)
{
- afterp->next = current_buffer->overlays_after;
- current_buffer->overlays_after = after_list;
+ afterp->next = buffer_get_overlays (NULL, OV_AFTER);
+ buffer_set_overlays (NULL, after_list, OV_AFTER);
}
recenter_overlay_lists (current_buffer, current_buffer->overlay_center);
}
@@ -3507,7 +3510,8 @@ void
fix_overlays_before (struct buffer *bp, ptrdiff_t prev, ptrdiff_t pos)
{
/* If parent is nil, replace overlays_before; otherwise, parent->next. */
- struct Lisp_Overlay *tail = bp->overlays_before, *parent = NULL, *right_pair;
+ struct Lisp_Overlay *tail = buffer_get_overlays (bp, OV_BEFORE);
+ struct Lisp_Overlay *parent = NULL, *right_pair;
Lisp_Object tem;
ptrdiff_t end IF_LINT (= 0);
@@ -3562,8 +3566,8 @@ fix_overlays_before (struct buffer *bp, ptrdiff_t prev, ptrdiff_t pos)
and link it into the right place. */
if (!right_pair)
{
- found->next = bp->overlays_before;
- bp->overlays_before = found;
+ found->next = buffer_get_overlays (bp, OV_BEFORE);
+ buffer_set_overlays (bp, found, OV_BEFORE);
}
else
{
@@ -3639,15 +3643,15 @@ for the rear of the overlay advance when text is inserted there
end = OVERLAY_END (overlay);
if (OVERLAY_POSITION (end) < b->overlay_center)
{
- if (b->overlays_after)
- XOVERLAY (overlay)->next = b->overlays_after;
- b->overlays_after = XOVERLAY (overlay);
+ if (buffer_get_overlays (b, OV_AFTER))
+ XOVERLAY (overlay)->next = buffer_get_overlays (b, OV_AFTER);
+ buffer_set_overlays (b, XOVERLAY (overlay), OV_AFTER);
}
else
{
- if (b->overlays_before)
- XOVERLAY (overlay)->next = b->overlays_before;
- b->overlays_before = XOVERLAY (overlay);
+ if (buffer_get_overlays (b, OV_BEFORE))
+ XOVERLAY (overlay)->next = buffer_get_overlays (b, OV_BEFORE);
+ buffer_set_overlays (b, XOVERLAY (overlay), OV_BEFORE);
}
/* This puts it in the right list, and in the right order. */
@@ -3705,6 +3709,19 @@ unchain_overlay (struct Lisp_Overlay *list, struct Lisp_Overlay *overlay)
return list;
}
+/* Remove OVERLAY from both overlay lists of B. */
+
+static void
+unchain_both (struct buffer *b, Lisp_Object overlay)
+{
+ struct Lisp_Overlay *ov = XOVERLAY (overlay);
+
+ buffer_set_overlays
+ (b, unchain_overlay (buffer_get_overlays (b, OV_BEFORE), ov), OV_BEFORE);
+ buffer_set_overlays
+ (b, unchain_overlay (buffer_get_overlays (b, OV_AFTER), ov), OV_AFTER);
+}
+
DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0,
doc: /* Set the endpoints of OVERLAY to BEG and END in BUFFER.
If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now.
@@ -3755,10 +3772,7 @@ buffer. */)
o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
- ob->overlays_before =
- unchain_overlay (ob->overlays_before, XOVERLAY (overlay));
- ob->overlays_after =
- unchain_overlay (ob->overlays_after, XOVERLAY (overlay));
+ unchain_both (ob, overlay);
eassert (XOVERLAY (overlay)->next == NULL);
}
@@ -3799,13 +3813,13 @@ buffer. */)
wrong list. */
if (n_end < b->overlay_center)
{
- XOVERLAY (overlay)->next = b->overlays_after;
- b->overlays_after = XOVERLAY (overlay);
+ XOVERLAY (overlay)->next = buffer_get_overlays (b, OV_AFTER);
+ buffer_set_overlays (b, XOVERLAY (overlay), OV_AFTER);
}
else
{
- XOVERLAY (overlay)->next = b->overlays_before;
- b->overlays_before = XOVERLAY (overlay);
+ XOVERLAY (overlay)->next = buffer_get_overlays (b, OV_BEFORE);
+ buffer_set_overlays (b, XOVERLAY (overlay), OV_BEFORE);
}
/* This puts it in the right list, and in the right order. */
@@ -3831,10 +3845,7 @@ DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
b = XBUFFER (buffer);
specbind (Qinhibit_quit, Qt);
- b->overlays_before
- = unchain_overlay (b->overlays_before, XOVERLAY (overlay));
- b->overlays_after
- = unchain_overlay (b->overlays_after, XOVERLAY (overlay));
+ unchain_both (b, overlay);
eassert (XOVERLAY (overlay)->next == NULL);
drop_overlay (b, XOVERLAY (overlay));
@@ -4033,16 +4044,19 @@ However, the overlays you get are the real objects that the buffer uses. */)
{
struct Lisp_Overlay *ol;
Lisp_Object before = Qnil, after = Qnil, tmp;
- for (ol = current_buffer->overlays_before; ol; ol = ol->next)
+
+ for (ol = buffer_get_overlays (NULL, OV_BEFORE); ol; ol = ol->next)
{
XSETMISC (tmp, ol);
before = Fcons (tmp, before);
}
- for (ol = current_buffer->overlays_after; ol; ol = ol->next)
+
+ for (ol = buffer_get_overlays (NULL, OV_AFTER); ol; ol = ol->next)
{
XSETMISC (tmp, ol);
after = Fcons (tmp, after);
}
+
return Fcons (Fnreverse (before), Fnreverse (after));
}
@@ -4182,7 +4196,7 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, int after,
/* We are being called before a change.
Scan the overlays to find the functions to call. */
last_overlay_modification_hooks_used = 0;
- for (tail = current_buffer->overlays_before; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_BEFORE); tail; tail = tail->next)
{
ptrdiff_t startpos, endpos;
Lisp_Object ostart, oend;
@@ -4219,7 +4233,7 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, int after,
}
}
- for (tail = current_buffer->overlays_after; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_AFTER); tail; tail = tail->next)
{
ptrdiff_t startpos, endpos;
Lisp_Object ostart, oend;
@@ -4311,7 +4325,7 @@ evaporate_overlays (ptrdiff_t pos)
hit_list = Qnil;
if (pos <= current_buffer->overlay_center)
- for (tail = current_buffer->overlays_before; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_BEFORE); tail; tail = tail->next)
{
ptrdiff_t endpos;
XSETMISC (overlay, tail);
@@ -4323,7 +4337,7 @@ evaporate_overlays (ptrdiff_t pos)
hit_list = Fcons (overlay, hit_list);
}
else
- for (tail = current_buffer->overlays_after; tail; tail = tail->next)
+ for (tail = buffer_get_overlays (NULL, OV_AFTER); tail; tail = tail->next)
{
ptrdiff_t startpos;
XSETMISC (overlay, tail);