aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGerd Moellmann2001-05-16 12:17:43 +0000
committerGerd Moellmann2001-05-16 12:17:43 +0000
commit04e4cb3a83ab051b47c8810dcb963dde78bb599a (patch)
treed8d342e068ed4ccd20b13350905eeb37e9201ec5 /src
parent21975a1fd9ce30f56830e186f0270d139fa140f3 (diff)
downloademacs-04e4cb3a83ab051b47c8810dcb963dde78bb599a.tar.gz
emacs-04e4cb3a83ab051b47c8810dcb963dde78bb599a.zip
(copy_overlays): New function.
(clone_per_buffer_values): Use it.
Diffstat (limited to 'src')
-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;
179 179
180static void alloc_buffer_text P_ ((struct buffer *, size_t)); 180static void alloc_buffer_text P_ ((struct buffer *, size_t));
181static void free_buffer_text P_ ((struct buffer *b)); 181static void free_buffer_text P_ ((struct buffer *b));
182static Lisp_Object copy_overlays P_ ((struct buffer *, Lisp_Object));
182 183
183 184
184/* For debugging; temporary. See set_buffer_internal. */ 185/* For debugging; temporary. See set_buffer_internal. */
@@ -415,6 +416,49 @@ The value is never nil.")
415} 416}
416 417
417 418
419/* Return a list of overlays which is a copy of the overlay list
420 LIST, but for buffer B. */
421
422static Lisp_Object
423copy_overlays (b, list)
424 struct buffer *b;
425 Lisp_Object list;
426{
427 Lisp_Object result, buffer;
428
429 XSETBUFFER (buffer, b);
430
431 for (result = Qnil; CONSP (list); list = XCDR (list))
432 {
433 Lisp_Object overlay, start, end, old_overlay;
434 int charpos;
435
436 old_overlay = XCAR (list);
437 charpos = marker_position (OVERLAY_START (old_overlay));
438 start = Fmake_marker ();
439 Fset_marker (start, charpos, buffer);
440 XMARKER (start)->insertion_type
441 = XMARKER (OVERLAY_START (old_overlay))->insertion_type;
442
443 charpos = marker_position (OVERLAY_END (old_overlay));
444 end = Fmake_marker ();
445 Fset_marker (end, charpos, buffer);
446 XMARKER (end)->insertion_type
447 = XMARKER (OVERLAY_END (old_overlay))->insertion_type;
448
449 overlay = allocate_misc ();
450 XMISCTYPE (overlay) = Lisp_Misc_Overlay;
451 OVERLAY_START (overlay) = start;
452 OVERLAY_END (overlay) = end;
453 OVERLAY_PLIST (overlay) = Fcopy_sequence (OVERLAY_PLIST (old_overlay));
454
455 result = Fcons (overlay, result);
456 }
457
458 return Fnreverse (result);
459}
460
461
418/* Clone per-buffer values of buffer FROM. 462/* Clone per-buffer values of buffer FROM.
419 463
420 Buffer TO gets the same per-buffer values as FROM, with the 464 Buffer TO gets the same per-buffer values as FROM, with the
@@ -449,9 +493,10 @@ clone_per_buffer_values (from, to)
449 PER_BUFFER_VALUE (to, offset) = obj; 493 PER_BUFFER_VALUE (to, offset) = obj;
450 } 494 }
451 495
452 to->overlays_after = Fcopy_sequence (from->overlays_after);
453 to->overlays_before = Fcopy_sequence (to->overlays_before);
454 bcopy (from->local_flags, to->local_flags, sizeof to->local_flags); 496 bcopy (from->local_flags, to->local_flags, sizeof to->local_flags);
497
498 to->overlays_before = copy_overlays (to, from->overlays_before);
499 to->overlays_after = copy_overlays (to, from->overlays_after);
455} 500}
456 501
457 502