diff options
| author | Gerd Moellmann | 2001-05-16 12:17:43 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 2001-05-16 12:17:43 +0000 |
| commit | 04e4cb3a83ab051b47c8810dcb963dde78bb599a (patch) | |
| tree | d8d342e068ed4ccd20b13350905eeb37e9201ec5 /src | |
| parent | 21975a1fd9ce30f56830e186f0270d139fa140f3 (diff) | |
| download | emacs-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.c | 49 |
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 | ||
| 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. */ |
| @@ -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 | |||
| 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 |
| @@ -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 | ||