summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
authorGerd Moellmann <gerd@gnu.org>2001-05-16 12:17:43 +0000
committerGerd Moellmann <gerd@gnu.org>2001-05-16 12:17:43 +0000
commit04e4cb3a83ab051b47c8810dcb963dde78bb599a (patch)
treed8d342e068ed4ccd20b13350905eeb37e9201ec5 /src/buffer.c
parent21975a1fd9ce30f56830e186f0270d139fa140f3 (diff)
downloademacs-04e4cb3a83ab051b47c8810dcb963dde78bb599a.tar.gz
(copy_overlays): New function.
(clone_per_buffer_values): Use it.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 0171f74e089..bc41f2e3179 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -179,6 +179,7 @@ Lisp_Object Qinsert_behind_hooks;
static void alloc_buffer_text P_ ((struct buffer *, size_t));
static void free_buffer_text P_ ((struct buffer *b));
+static Lisp_Object copy_overlays P_ ((struct buffer *, Lisp_Object));
/* For debugging; temporary. See set_buffer_internal. */
@@ -415,6 +416,49 @@ The value is never nil.")
}
+/* Return a list of overlays which is a copy of the overlay list
+ LIST, but for buffer B. */
+
+static Lisp_Object
+copy_overlays (b, list)
+ struct buffer *b;
+ Lisp_Object list;
+{
+ Lisp_Object result, buffer;
+
+ XSETBUFFER (buffer, b);
+
+ for (result = Qnil; CONSP (list); list = XCDR (list))
+ {
+ Lisp_Object overlay, start, end, old_overlay;
+ int charpos;
+
+ old_overlay = XCAR (list);
+ charpos = marker_position (OVERLAY_START (old_overlay));
+ start = Fmake_marker ();
+ Fset_marker (start, charpos, buffer);
+ XMARKER (start)->insertion_type
+ = XMARKER (OVERLAY_START (old_overlay))->insertion_type;
+
+ charpos = marker_position (OVERLAY_END (old_overlay));
+ end = Fmake_marker ();
+ Fset_marker (end, charpos, buffer);
+ XMARKER (end)->insertion_type
+ = XMARKER (OVERLAY_END (old_overlay))->insertion_type;
+
+ overlay = allocate_misc ();
+ XMISCTYPE (overlay) = Lisp_Misc_Overlay;
+ OVERLAY_START (overlay) = start;
+ OVERLAY_END (overlay) = end;
+ OVERLAY_PLIST (overlay) = Fcopy_sequence (OVERLAY_PLIST (old_overlay));
+
+ result = Fcons (overlay, result);
+ }
+
+ return Fnreverse (result);
+}
+
+
/* Clone per-buffer values of buffer FROM.
Buffer TO gets the same per-buffer values as FROM, with the
@@ -449,9 +493,10 @@ clone_per_buffer_values (from, to)
PER_BUFFER_VALUE (to, offset) = obj;
}
- to->overlays_after = Fcopy_sequence (from->overlays_after);
- to->overlays_before = Fcopy_sequence (to->overlays_before);
bcopy (from->local_flags, to->local_flags, sizeof to->local_flags);
+
+ to->overlays_before = copy_overlays (to, from->overlays_before);
+ to->overlays_after = copy_overlays (to, from->overlays_after);
}