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,