Mercurial > emacs
comparison src/buffer.c @ 37752:1085e1cfebaf
(copy_overlays): New function.
(clone_per_buffer_values): Use it.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Wed, 16 May 2001 12:17:43 +0000 |
parents | 7db9a70334b7 |
children | fd7c0dac2110 f01f454ea6bf |
comparison
equal
deleted
inserted
replaced
37751:ac83181a33d0 | 37752:1085e1cfebaf |
---|---|
177 Lisp_Object Qinsert_in_front_hooks; | 177 Lisp_Object Qinsert_in_front_hooks; |
178 Lisp_Object Qinsert_behind_hooks; | 178 Lisp_Object Qinsert_behind_hooks; |
179 | 179 |
180 static void alloc_buffer_text P_ ((struct buffer *, size_t)); | 180 static void alloc_buffer_text P_ ((struct buffer *, size_t)); |
181 static void free_buffer_text P_ ((struct buffer *b)); | 181 static void free_buffer_text P_ ((struct buffer *b)); |
182 static 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. */ |
185 /* Lisp_Object Qlisp_mode, Vcheck_symbol; */ | 186 /* Lisp_Object Qlisp_mode, Vcheck_symbol; */ |
186 | 187 |
413 b->name = name; | 414 b->name = name; |
414 return buf; | 415 return buf; |
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 | |
422 static Lisp_Object | |
423 copy_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 |
421 following exceptions: (1) TO's name is left untouched, (2) markers | 465 following exceptions: (1) TO's name is left untouched, (2) markers |
422 are copied and made to refer to TO, and (3) overlay lists are | 466 are copied and made to refer to TO, and (3) overlay lists are |
447 } | 491 } |
448 | 492 |
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 |
458 DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, | 503 DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, |
459 2, 3, | 504 2, 3, |