diff options
| author | Stefan Monnier | 2003-07-09 15:10:47 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2003-07-09 15:10:47 +0000 |
| commit | 2410d73a13c00d0f1c0cfb3b1ef21a837a9100e3 (patch) | |
| tree | e7fc5f8bdaea89d8bcb65ac62ed4a06c311fbdb7 /src/buffer.c | |
| parent | f54253ec86cd867b20e348eb036522b4dc9733a8 (diff) | |
| download | emacs-2410d73a13c00d0f1c0cfb3b1ef21a837a9100e3.tar.gz emacs-2410d73a13c00d0f1c0cfb3b1ef21a837a9100e3.zip | |
(overlay_strings, recenter_overlay_lists): Fix typo in eassert in last commit.
(unchain_overlay): New function.
(add_overlay_mod_hooklist): Use AREF.
(copy_overlays, reset_buffer, overlays_at, overlays_in)
(overlay_touches_p, overlay_strings, recenter_overlay_lists)
(fix_overlays_in_range, fix_overlays_before, Fmake_overlay)
(Fmove_overlay, Fdelete_overlay, Foverlay_lists)
(report_overlay_modification, evaporate_overlays, init_buffer_once):
Adjust to new type of overlays_(before|after).
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 366 |
1 files changed, 199 insertions, 167 deletions
diff --git a/src/buffer.c b/src/buffer.c index aeb64e90d88..3b0a3226b9d 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -183,7 +183,7 @@ Lisp_Object Qinsert_behind_hooks; | |||
| 183 | 183 | ||
| 184 | static void alloc_buffer_text P_ ((struct buffer *, size_t)); | 184 | static void alloc_buffer_text P_ ((struct buffer *, size_t)); |
| 185 | static void free_buffer_text P_ ((struct buffer *b)); | 185 | static void free_buffer_text P_ ((struct buffer *b)); |
| 186 | static Lisp_Object copy_overlays P_ ((struct buffer *, Lisp_Object)); | 186 | static struct Lisp_Overlay * copy_overlays P_ ((struct buffer *, struct Lisp_Overlay *)); |
| 187 | static void modify_overlay P_ ((struct buffer *, int, int)); | 187 | static void modify_overlay P_ ((struct buffer *, int, int)); |
| 188 | 188 | ||
| 189 | 189 | ||
| @@ -434,21 +434,22 @@ The value is never nil. */) | |||
| 434 | /* Return a list of overlays which is a copy of the overlay list | 434 | /* Return a list of overlays which is a copy of the overlay list |
| 435 | LIST, but for buffer B. */ | 435 | LIST, but for buffer B. */ |
| 436 | 436 | ||
| 437 | static Lisp_Object | 437 | static struct Lisp_Overlay * |
| 438 | copy_overlays (b, list) | 438 | copy_overlays (b, list) |
| 439 | struct buffer *b; | 439 | struct buffer *b; |
| 440 | Lisp_Object list; | 440 | struct Lisp_Overlay *list; |
| 441 | { | 441 | { |
| 442 | Lisp_Object result, buffer; | 442 | Lisp_Object buffer; |
| 443 | struct Lisp_Overlay *result = NULL, *tail = NULL; | ||
| 443 | 444 | ||
| 444 | XSETBUFFER (buffer, b); | 445 | XSETBUFFER (buffer, b); |
| 445 | 446 | ||
| 446 | for (result = Qnil; CONSP (list); list = XCDR (list)) | 447 | for (; list; list = list->next) |
| 447 | { | 448 | { |
| 448 | Lisp_Object overlay, start, end, old_overlay; | 449 | Lisp_Object overlay, start, end, old_overlay; |
| 449 | int charpos; | 450 | int charpos; |
| 450 | 451 | ||
| 451 | old_overlay = XCAR (list); | 452 | XSETMISC (old_overlay, list); |
| 452 | charpos = marker_position (OVERLAY_START (old_overlay)); | 453 | charpos = marker_position (OVERLAY_START (old_overlay)); |
| 453 | start = Fmake_marker (); | 454 | start = Fmake_marker (); |
| 454 | Fset_marker (start, make_number (charpos), buffer); | 455 | Fset_marker (start, make_number (charpos), buffer); |
| @@ -466,11 +467,15 @@ copy_overlays (b, list) | |||
| 466 | OVERLAY_START (overlay) = start; | 467 | OVERLAY_START (overlay) = start; |
| 467 | OVERLAY_END (overlay) = end; | 468 | OVERLAY_END (overlay) = end; |
| 468 | OVERLAY_PLIST (overlay) = Fcopy_sequence (OVERLAY_PLIST (old_overlay)); | 469 | OVERLAY_PLIST (overlay) = Fcopy_sequence (OVERLAY_PLIST (old_overlay)); |
| 470 | XOVERLAY (overlay)->next = NULL; | ||
| 469 | 471 | ||
| 470 | result = Fcons (overlay, result); | 472 | if (tail) |
| 473 | tail = tail->next = XOVERLAY (overlay); | ||
| 474 | else | ||
| 475 | result = tail = XOVERLAY (overlay); | ||
| 471 | } | 476 | } |
| 472 | 477 | ||
| 473 | return Fnreverse (result); | 478 | return result; |
| 474 | } | 479 | } |
| 475 | 480 | ||
| 476 | 481 | ||
| @@ -646,8 +651,8 @@ reset_buffer (b) | |||
| 646 | b->auto_save_failure_time = -1; | 651 | b->auto_save_failure_time = -1; |
| 647 | b->auto_save_file_name = Qnil; | 652 | b->auto_save_file_name = Qnil; |
| 648 | b->read_only = Qnil; | 653 | b->read_only = Qnil; |
| 649 | b->overlays_before = Qnil; | 654 | b->overlays_before = NULL; |
| 650 | b->overlays_after = Qnil; | 655 | b->overlays_after = NULL; |
| 651 | b->overlay_center = BEG; | 656 | b->overlay_center = BEG; |
| 652 | b->mark_active = Qnil; | 657 | b->mark_active = Qnil; |
| 653 | b->point_before_scroll = Qnil; | 658 | b->point_before_scroll = Qnil; |
| @@ -2428,7 +2433,8 @@ overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr, prev_ptr, change_req) | |||
| 2428 | int *prev_ptr; | 2433 | int *prev_ptr; |
| 2429 | int change_req; | 2434 | int change_req; |
| 2430 | { | 2435 | { |
| 2431 | Lisp_Object tail, overlay, start, end; | 2436 | Lisp_Object overlay, start, end; |
| 2437 | struct Lisp_Overlay *tail; | ||
| 2432 | int idx = 0; | 2438 | int idx = 0; |
| 2433 | int len = *len_ptr; | 2439 | int len = *len_ptr; |
| 2434 | Lisp_Object *vec = *vec_ptr; | 2440 | Lisp_Object *vec = *vec_ptr; |
| @@ -2436,13 +2442,11 @@ overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr, prev_ptr, change_req) | |||
| 2436 | int prev = BEGV; | 2442 | int prev = BEGV; |
| 2437 | int inhibit_storing = 0; | 2443 | int inhibit_storing = 0; |
| 2438 | 2444 | ||
| 2439 | for (tail = current_buffer->overlays_before; | 2445 | for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 2440 | GC_CONSP (tail); | ||
| 2441 | tail = XCDR (tail)) | ||
| 2442 | { | 2446 | { |
| 2443 | int startpos, endpos; | 2447 | int startpos, endpos; |
| 2444 | 2448 | ||
| 2445 | overlay = XCAR (tail); | 2449 | XSETMISC (overlay, tail); |
| 2446 | 2450 | ||
| 2447 | start = OVERLAY_START (overlay); | 2451 | start = OVERLAY_START (overlay); |
| 2448 | end = OVERLAY_END (overlay); | 2452 | end = OVERLAY_END (overlay); |
| @@ -2489,13 +2493,11 @@ overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr, prev_ptr, change_req) | |||
| 2489 | next = startpos; | 2493 | next = startpos; |
| 2490 | } | 2494 | } |
| 2491 | 2495 | ||
| 2492 | for (tail = current_buffer->overlays_after; | 2496 | for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 2493 | GC_CONSP (tail); | ||
| 2494 | tail = XCDR (tail)) | ||
| 2495 | { | 2497 | { |
| 2496 | int startpos, endpos; | 2498 | int startpos, endpos; |
| 2497 | 2499 | ||
| 2498 | overlay = XCAR (tail); | 2500 | XSETMISC (overlay, tail); |
| 2499 | 2501 | ||
| 2500 | start = OVERLAY_START (overlay); | 2502 | start = OVERLAY_START (overlay); |
| 2501 | end = OVERLAY_END (overlay); | 2503 | end = OVERLAY_END (overlay); |
| @@ -2574,7 +2576,8 @@ overlays_in (beg, end, extend, vec_ptr, len_ptr, next_ptr, prev_ptr) | |||
| 2574 | int *next_ptr; | 2576 | int *next_ptr; |
| 2575 | int *prev_ptr; | 2577 | int *prev_ptr; |
| 2576 | { | 2578 | { |
| 2577 | Lisp_Object tail, overlay, ostart, oend; | 2579 | Lisp_Object overlay, ostart, oend; |
| 2580 | struct Lisp_Overlay *tail; | ||
| 2578 | int idx = 0; | 2581 | int idx = 0; |
| 2579 | int len = *len_ptr; | 2582 | int len = *len_ptr; |
| 2580 | Lisp_Object *vec = *vec_ptr; | 2583 | Lisp_Object *vec = *vec_ptr; |
| @@ -2582,13 +2585,11 @@ overlays_in (beg, end, extend, vec_ptr, len_ptr, next_ptr, prev_ptr) | |||
| 2582 | int prev = BEGV; | 2585 | int prev = BEGV; |
| 2583 | int inhibit_storing = 0; | 2586 | int inhibit_storing = 0; |
| 2584 | 2587 | ||
| 2585 | for (tail = current_buffer->overlays_before; | 2588 | for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 2586 | GC_CONSP (tail); | ||
| 2587 | tail = XCDR (tail)) | ||
| 2588 | { | 2589 | { |
| 2589 | int startpos, endpos; | 2590 | int startpos, endpos; |
| 2590 | 2591 | ||
| 2591 | overlay = XCAR (tail); | 2592 | XSETMISC (overlay, tail); |
| 2592 | 2593 | ||
| 2593 | ostart = OVERLAY_START (overlay); | 2594 | ostart = OVERLAY_START (overlay); |
| 2594 | oend = OVERLAY_END (overlay); | 2595 | oend = OVERLAY_END (overlay); |
| @@ -2632,13 +2633,11 @@ overlays_in (beg, end, extend, vec_ptr, len_ptr, next_ptr, prev_ptr) | |||
| 2632 | next = startpos; | 2633 | next = startpos; |
| 2633 | } | 2634 | } |
| 2634 | 2635 | ||
| 2635 | for (tail = current_buffer->overlays_after; | 2636 | for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 2636 | GC_CONSP (tail); | ||
| 2637 | tail = XCDR (tail)) | ||
| 2638 | { | 2637 | { |
| 2639 | int startpos, endpos; | 2638 | int startpos, endpos; |
| 2640 | 2639 | ||
| 2641 | overlay = XCAR (tail); | 2640 | XSETMISC (overlay, tail); |
| 2642 | 2641 | ||
| 2643 | ostart = OVERLAY_START (overlay); | 2642 | ostart = OVERLAY_START (overlay); |
| 2644 | oend = OVERLAY_END (overlay); | 2643 | oend = OVERLAY_END (overlay); |
| @@ -2724,14 +2723,14 @@ int | |||
| 2724 | overlay_touches_p (pos) | 2723 | overlay_touches_p (pos) |
| 2725 | int pos; | 2724 | int pos; |
| 2726 | { | 2725 | { |
| 2727 | Lisp_Object tail, overlay; | 2726 | Lisp_Object overlay; |
| 2727 | struct Lisp_Overlay *tail; | ||
| 2728 | 2728 | ||
| 2729 | for (tail = current_buffer->overlays_before; GC_CONSP (tail); | 2729 | for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 2730 | tail = XCDR (tail)) | ||
| 2731 | { | 2730 | { |
| 2732 | int endpos; | 2731 | int endpos; |
| 2733 | 2732 | ||
| 2734 | overlay = XCAR (tail); | 2733 | XSETMISC (overlay ,tail); |
| 2735 | if (!GC_OVERLAYP (overlay)) | 2734 | if (!GC_OVERLAYP (overlay)) |
| 2736 | abort (); | 2735 | abort (); |
| 2737 | 2736 | ||
| @@ -2742,12 +2741,11 @@ overlay_touches_p (pos) | |||
| 2742 | return 1; | 2741 | return 1; |
| 2743 | } | 2742 | } |
| 2744 | 2743 | ||
| 2745 | for (tail = current_buffer->overlays_after; GC_CONSP (tail); | 2744 | for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 2746 | tail = XCDR (tail)) | ||
| 2747 | { | 2745 | { |
| 2748 | int startpos; | 2746 | int startpos; |
| 2749 | 2747 | ||
| 2750 | overlay = XCAR (tail); | 2748 | XSETMISC (overlay, tail); |
| 2751 | if (!GC_OVERLAYP (overlay)) | 2749 | if (!GC_OVERLAYP (overlay)) |
| 2752 | abort (); | 2750 | abort (); |
| 2753 | 2751 | ||
| @@ -2946,15 +2944,16 @@ overlay_strings (pos, w, pstr) | |||
| 2946 | struct window *w; | 2944 | struct window *w; |
| 2947 | unsigned char **pstr; | 2945 | unsigned char **pstr; |
| 2948 | { | 2946 | { |
| 2949 | Lisp_Object ov, overlay, window, str; | 2947 | Lisp_Object overlay, window, str; |
| 2948 | struct Lisp_Overlay *ov; | ||
| 2950 | int startpos, endpos; | 2949 | int startpos, endpos; |
| 2951 | int multibyte = ! NILP (current_buffer->enable_multibyte_characters); | 2950 | int multibyte = ! NILP (current_buffer->enable_multibyte_characters); |
| 2952 | 2951 | ||
| 2953 | overlay_heads.used = overlay_heads.bytes = 0; | 2952 | overlay_heads.used = overlay_heads.bytes = 0; |
| 2954 | overlay_tails.used = overlay_tails.bytes = 0; | 2953 | overlay_tails.used = overlay_tails.bytes = 0; |
| 2955 | for (ov = current_buffer->overlays_before; CONSP (ov); ov = XCDR (ov)) | 2954 | for (ov = current_buffer->overlays_before; ov; ov = ov->next) |
| 2956 | { | 2955 | { |
| 2957 | overlay = XCAR (ov); | 2956 | XSETMISC (overlay, ov); |
| 2958 | eassert (OVERLAYP (overlay)); | 2957 | eassert (OVERLAYP (overlay)); |
| 2959 | 2958 | ||
| 2960 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 2959 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| @@ -2980,10 +2979,10 @@ overlay_strings (pos, w, pstr) | |||
| 2980 | Foverlay_get (overlay, Qpriority), | 2979 | Foverlay_get (overlay, Qpriority), |
| 2981 | endpos - startpos); | 2980 | endpos - startpos); |
| 2982 | } | 2981 | } |
| 2983 | for (ov = current_buffer->overlays_after; CONSP (ov); ov = XCDR (ov)) | 2982 | for (ov = current_buffer->overlays_after; ov; ov = ov->next) |
| 2984 | { | 2983 | { |
| 2985 | overlay = XCAR (ov); | 2984 | XSETMISC (overlay, ov); |
| 2986 | eassert (!OVERLAYP (overlay)); | 2985 | eassert (OVERLAYP (overlay)); |
| 2987 | 2986 | ||
| 2988 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 2987 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 2989 | endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 2988 | endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| @@ -3070,20 +3069,19 @@ recenter_overlay_lists (buf, pos) | |||
| 3070 | struct buffer *buf; | 3069 | struct buffer *buf; |
| 3071 | EMACS_INT pos; | 3070 | EMACS_INT pos; |
| 3072 | { | 3071 | { |
| 3073 | Lisp_Object overlay, tail, next, prev, beg, end; | 3072 | Lisp_Object overlay, beg, end; |
| 3073 | struct Lisp_Overlay *prev, *tail, *next; | ||
| 3074 | 3074 | ||
| 3075 | /* See if anything in overlays_before should move to overlays_after. */ | 3075 | /* See if anything in overlays_before should move to overlays_after. */ |
| 3076 | 3076 | ||
| 3077 | /* We don't strictly need prev in this loop; it should always be nil. | 3077 | /* We don't strictly need prev in this loop; it should always be nil. |
| 3078 | But we use it for symmetry and in case that should cease to be true | 3078 | But we use it for symmetry and in case that should cease to be true |
| 3079 | with some future change. */ | 3079 | with some future change. */ |
| 3080 | prev = Qnil; | 3080 | prev = NULL; |
| 3081 | for (tail = buf->overlays_before; | 3081 | for (tail = buf->overlays_before; tail; prev = tail, tail = next) |
| 3082 | CONSP (tail); | ||
| 3083 | prev = tail, tail = next) | ||
| 3084 | { | 3082 | { |
| 3085 | next = XCDR (tail); | 3083 | next = tail->next; |
| 3086 | overlay = XCAR (tail); | 3084 | XSETMISC (overlay, tail); |
| 3087 | 3085 | ||
| 3088 | /* If the overlay is not valid, get rid of it. */ | 3086 | /* If the overlay is not valid, get rid of it. */ |
| 3089 | if (!OVERLAY_VALID (overlay)) | 3087 | if (!OVERLAY_VALID (overlay)) |
| @@ -3108,24 +3106,23 @@ recenter_overlay_lists (buf, pos) | |||
| 3108 | { | 3106 | { |
| 3109 | /* OVERLAY needs to be moved. */ | 3107 | /* OVERLAY needs to be moved. */ |
| 3110 | int where = OVERLAY_POSITION (beg); | 3108 | int where = OVERLAY_POSITION (beg); |
| 3111 | Lisp_Object other, other_prev; | 3109 | struct Lisp_Overlay *other, *other_prev; |
| 3112 | 3110 | ||
| 3113 | /* Splice the cons cell TAIL out of overlays_before. */ | 3111 | /* Splice the cons cell TAIL out of overlays_before. */ |
| 3114 | if (!NILP (prev)) | 3112 | if (prev) |
| 3115 | XSETCDR (prev, next); | 3113 | prev->next = next; |
| 3116 | else | 3114 | else |
| 3117 | buf->overlays_before = next; | 3115 | buf->overlays_before = next; |
| 3118 | 3116 | ||
| 3119 | /* Search thru overlays_after for where to put it. */ | 3117 | /* Search thru overlays_after for where to put it. */ |
| 3120 | other_prev = Qnil; | 3118 | other_prev = NULL; |
| 3121 | for (other = buf->overlays_after; | 3119 | for (other = buf->overlays_after; other; |
| 3122 | CONSP (other); | 3120 | other_prev = other, other = other->next) |
| 3123 | other_prev = other, other = XCDR (other)) | ||
| 3124 | { | 3121 | { |
| 3125 | Lisp_Object otherbeg, otheroverlay; | 3122 | Lisp_Object otherbeg, otheroverlay; |
| 3126 | 3123 | ||
| 3127 | otheroverlay = XCAR (other); | 3124 | XSETMISC (otheroverlay, other); |
| 3128 | eassert (! OVERLAY_VALID (otheroverlay)); | 3125 | eassert (OVERLAY_VALID (otheroverlay)); |
| 3129 | 3126 | ||
| 3130 | otherbeg = OVERLAY_START (otheroverlay); | 3127 | otherbeg = OVERLAY_START (otheroverlay); |
| 3131 | if (OVERLAY_POSITION (otherbeg) >= where) | 3128 | if (OVERLAY_POSITION (otherbeg) >= where) |
| @@ -3133,9 +3130,9 @@ recenter_overlay_lists (buf, pos) | |||
| 3133 | } | 3130 | } |
| 3134 | 3131 | ||
| 3135 | /* Add TAIL to overlays_after before OTHER. */ | 3132 | /* Add TAIL to overlays_after before OTHER. */ |
| 3136 | XSETCDR (tail, other); | 3133 | tail->next = other; |
| 3137 | if (!NILP (other_prev)) | 3134 | if (other_prev) |
| 3138 | XSETCDR (other_prev, tail); | 3135 | other_prev->next = tail; |
| 3139 | else | 3136 | else |
| 3140 | buf->overlays_after = tail; | 3137 | buf->overlays_after = tail; |
| 3141 | tail = prev; | 3138 | tail = prev; |
| @@ -3148,13 +3145,11 @@ recenter_overlay_lists (buf, pos) | |||
| 3148 | } | 3145 | } |
| 3149 | 3146 | ||
| 3150 | /* See if anything in overlays_after should be in overlays_before. */ | 3147 | /* See if anything in overlays_after should be in overlays_before. */ |
| 3151 | prev = Qnil; | 3148 | prev = NULL; |
| 3152 | for (tail = buf->overlays_after; | 3149 | for (tail = buf->overlays_after; tail; prev = tail, tail = next) |
| 3153 | CONSP (tail); | ||
| 3154 | prev = tail, tail = next) | ||
| 3155 | { | 3150 | { |
| 3156 | next = XCDR (tail); | 3151 | next = tail->next; |
| 3157 | overlay = XCAR (tail); | 3152 | XSETMISC (overlay, tail); |
| 3158 | 3153 | ||
| 3159 | /* If the overlay is not valid, get rid of it. */ | 3154 | /* If the overlay is not valid, get rid of it. */ |
| 3160 | if (!OVERLAY_VALID (overlay)) | 3155 | if (!OVERLAY_VALID (overlay)) |
| @@ -3184,24 +3179,23 @@ recenter_overlay_lists (buf, pos) | |||
| 3184 | { | 3179 | { |
| 3185 | /* OVERLAY needs to be moved. */ | 3180 | /* OVERLAY needs to be moved. */ |
| 3186 | int where = OVERLAY_POSITION (end); | 3181 | int where = OVERLAY_POSITION (end); |
| 3187 | Lisp_Object other, other_prev; | 3182 | struct Lisp_Overlay *other, *other_prev; |
| 3188 | 3183 | ||
| 3189 | /* Splice the cons cell TAIL out of overlays_after. */ | 3184 | /* Splice the cons cell TAIL out of overlays_after. */ |
| 3190 | if (!NILP (prev)) | 3185 | if (prev) |
| 3191 | XSETCDR (prev, next); | 3186 | prev->next = next; |
| 3192 | else | 3187 | else |
| 3193 | buf->overlays_after = next; | 3188 | buf->overlays_after = next; |
| 3194 | 3189 | ||
| 3195 | /* Search thru overlays_before for where to put it. */ | 3190 | /* Search thru overlays_before for where to put it. */ |
| 3196 | other_prev = Qnil; | 3191 | other_prev = NULL; |
| 3197 | for (other = buf->overlays_before; | 3192 | for (other = buf->overlays_before; other; |
| 3198 | CONSP (other); | 3193 | other_prev = other, other = other->next) |
| 3199 | other_prev = other, other = XCDR (other)) | ||
| 3200 | { | 3194 | { |
| 3201 | Lisp_Object otherend, otheroverlay; | 3195 | Lisp_Object otherend, otheroverlay; |
| 3202 | 3196 | ||
| 3203 | otheroverlay = XCAR (other); | 3197 | XSETMISC (otheroverlay, other); |
| 3204 | eassert (! OVERLAY_VALID (otheroverlay)); | 3198 | eassert (OVERLAY_VALID (otheroverlay)); |
| 3205 | 3199 | ||
| 3206 | otherend = OVERLAY_END (otheroverlay); | 3200 | otherend = OVERLAY_END (otheroverlay); |
| 3207 | if (OVERLAY_POSITION (otherend) <= where) | 3201 | if (OVERLAY_POSITION (otherend) <= where) |
| @@ -3209,9 +3203,9 @@ recenter_overlay_lists (buf, pos) | |||
| 3209 | } | 3203 | } |
| 3210 | 3204 | ||
| 3211 | /* Add TAIL to overlays_before before OTHER. */ | 3205 | /* Add TAIL to overlays_before before OTHER. */ |
| 3212 | XSETCDR (tail, other); | 3206 | tail->next = other; |
| 3213 | if (!NILP (other_prev)) | 3207 | if (other_prev) |
| 3214 | XSETCDR (other_prev, tail); | 3208 | other_prev->next = tail; |
| 3215 | else | 3209 | else |
| 3216 | buf->overlays_before = tail; | 3210 | buf->overlays_before = tail; |
| 3217 | tail = prev; | 3211 | tail = prev; |
| @@ -3265,15 +3259,15 @@ fix_overlays_in_range (start, end) | |||
| 3265 | register int start, end; | 3259 | register int start, end; |
| 3266 | { | 3260 | { |
| 3267 | Lisp_Object overlay; | 3261 | Lisp_Object overlay; |
| 3268 | Lisp_Object before_list, after_list; | 3262 | struct Lisp_Overlay *before_list, *after_list; |
| 3269 | /* These are either nil, indicating that before_list or after_list | 3263 | /* These are either nil, indicating that before_list or after_list |
| 3270 | should be assigned, or the cons cell the cdr of which should be | 3264 | should be assigned, or the cons cell the cdr of which should be |
| 3271 | assigned. */ | 3265 | assigned. */ |
| 3272 | Lisp_Object beforep = Qnil, afterp = Qnil; | 3266 | struct Lisp_Overlay *beforep = NULL, *afterp = NULL; |
| 3273 | /* 'Parent', likewise, indicates a cons cell or | 3267 | /* 'Parent', likewise, indicates a cons cell or |
| 3274 | current_buffer->overlays_before or overlays_after, depending | 3268 | current_buffer->overlays_before or overlays_after, depending |
| 3275 | which loop we're in. */ | 3269 | which loop we're in. */ |
| 3276 | Lisp_Object tail, parent; | 3270 | struct Lisp_Overlay *tail, *parent; |
| 3277 | int startpos, endpos; | 3271 | int startpos, endpos; |
| 3278 | 3272 | ||
| 3279 | /* This algorithm shifts links around instead of consing and GCing. | 3273 | /* This algorithm shifts links around instead of consing and GCing. |
| @@ -3283,9 +3277,9 @@ fix_overlays_in_range (start, end) | |||
| 3283 | (after_list) if it is, is still uninitialized. So it's not a bug | 3277 | (after_list) if it is, is still uninitialized. So it's not a bug |
| 3284 | that before_list isn't initialized, although it may look | 3278 | that before_list isn't initialized, although it may look |
| 3285 | strange. */ | 3279 | strange. */ |
| 3286 | for (parent = Qnil, tail = current_buffer->overlays_before; CONSP (tail);) | 3280 | for (parent = NULL, tail = current_buffer->overlays_before; tail;) |
| 3287 | { | 3281 | { |
| 3288 | overlay = XCAR (tail); | 3282 | XSETMISC (overlay, tail); |
| 3289 | endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 3283 | endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 3290 | if (endpos < start) | 3284 | if (endpos < start) |
| 3291 | break; | 3285 | break; |
| @@ -3307,32 +3301,32 @@ fix_overlays_in_range (start, end) | |||
| 3307 | recenter_overlay_lists will move it to the right place. */ | 3301 | recenter_overlay_lists will move it to the right place. */ |
| 3308 | if (endpos < current_buffer->overlay_center) | 3302 | if (endpos < current_buffer->overlay_center) |
| 3309 | { | 3303 | { |
| 3310 | if (NILP (afterp)) | 3304 | if (!afterp) |
| 3311 | after_list = tail; | 3305 | after_list = tail; |
| 3312 | else | 3306 | else |
| 3313 | XSETCDR (afterp, tail); | 3307 | afterp->next = tail; |
| 3314 | afterp = tail; | 3308 | afterp = tail; |
| 3315 | } | 3309 | } |
| 3316 | else | 3310 | else |
| 3317 | { | 3311 | { |
| 3318 | if (NILP (beforep)) | 3312 | if (!beforep) |
| 3319 | before_list = tail; | 3313 | before_list = tail; |
| 3320 | else | 3314 | else |
| 3321 | XSETCDR (beforep, tail); | 3315 | beforep->next = tail; |
| 3322 | beforep = tail; | 3316 | beforep = tail; |
| 3323 | } | 3317 | } |
| 3324 | if (NILP (parent)) | 3318 | if (!parent) |
| 3325 | current_buffer->overlays_before = XCDR (tail); | 3319 | current_buffer->overlays_before = tail->next; |
| 3326 | else | 3320 | else |
| 3327 | XSETCDR (parent, XCDR (tail)); | 3321 | parent->next = tail->next; |
| 3328 | tail = XCDR (tail); | 3322 | tail = tail->next; |
| 3329 | } | 3323 | } |
| 3330 | else | 3324 | else |
| 3331 | parent = tail, tail = XCDR (parent); | 3325 | parent = tail, tail = parent->next; |
| 3332 | } | 3326 | } |
| 3333 | for (parent = Qnil, tail = current_buffer->overlays_after; CONSP (tail);) | 3327 | for (parent = NULL, tail = current_buffer->overlays_after; tail;) |
| 3334 | { | 3328 | { |
| 3335 | overlay = XCAR (tail); | 3329 | XSETMISC (overlay, tail); |
| 3336 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 3330 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 3337 | if (startpos >= end) | 3331 | if (startpos >= end) |
| 3338 | break; | 3332 | break; |
| @@ -3351,42 +3345,42 @@ fix_overlays_in_range (start, end) | |||
| 3351 | } | 3345 | } |
| 3352 | if (endpos < current_buffer->overlay_center) | 3346 | if (endpos < current_buffer->overlay_center) |
| 3353 | { | 3347 | { |
| 3354 | if (NILP (afterp)) | 3348 | if (!afterp) |
| 3355 | after_list = tail; | 3349 | after_list = tail; |
| 3356 | else | 3350 | else |
| 3357 | XSETCDR (afterp, tail); | 3351 | afterp->next = tail; |
| 3358 | afterp = tail; | 3352 | afterp = tail; |
| 3359 | } | 3353 | } |
| 3360 | else | 3354 | else |
| 3361 | { | 3355 | { |
| 3362 | if (NILP (beforep)) | 3356 | if (!beforep) |
| 3363 | before_list = tail; | 3357 | before_list = tail; |
| 3364 | else | 3358 | else |
| 3365 | XSETCDR (beforep, tail); | 3359 | beforep->next = tail; |
| 3366 | beforep = tail; | 3360 | beforep = tail; |
| 3367 | } | 3361 | } |
| 3368 | if (NILP (parent)) | 3362 | if (!parent) |
| 3369 | current_buffer->overlays_after = XCDR (tail); | 3363 | current_buffer->overlays_after = tail->next; |
| 3370 | else | 3364 | else |
| 3371 | XSETCDR (parent, XCDR (tail)); | 3365 | parent->next = tail->next; |
| 3372 | tail = XCDR (tail); | 3366 | tail = tail->next; |
| 3373 | } | 3367 | } |
| 3374 | else | 3368 | else |
| 3375 | parent = tail, tail = XCDR (parent); | 3369 | parent = tail, tail = parent->next; |
| 3376 | } | 3370 | } |
| 3377 | 3371 | ||
| 3378 | /* Splice the constructed (wrong) lists into the buffer's lists, | 3372 | /* Splice the constructed (wrong) lists into the buffer's lists, |
| 3379 | and let the recenter function make it sane again. */ | 3373 | and let the recenter function make it sane again. */ |
| 3380 | if (!NILP (beforep)) | 3374 | if (beforep) |
| 3381 | { | 3375 | { |
| 3382 | XSETCDR (beforep, current_buffer->overlays_before); | 3376 | beforep->next = current_buffer->overlays_before; |
| 3383 | current_buffer->overlays_before = before_list; | 3377 | current_buffer->overlays_before = before_list; |
| 3384 | } | 3378 | } |
| 3385 | recenter_overlay_lists (current_buffer, current_buffer->overlay_center); | 3379 | recenter_overlay_lists (current_buffer, current_buffer->overlay_center); |
| 3386 | 3380 | ||
| 3387 | if (!NILP (afterp)) | 3381 | if (afterp) |
| 3388 | { | 3382 | { |
| 3389 | XSETCDR (afterp, current_buffer->overlays_after); | 3383 | afterp->next = current_buffer->overlays_after; |
| 3390 | current_buffer->overlays_after = after_list; | 3384 | current_buffer->overlays_after = after_list; |
| 3391 | } | 3385 | } |
| 3392 | recenter_overlay_lists (current_buffer, current_buffer->overlay_center); | 3386 | recenter_overlay_lists (current_buffer, current_buffer->overlay_center); |
| @@ -3409,9 +3403,9 @@ fix_overlays_before (bp, prev, pos) | |||
| 3409 | struct buffer *bp; | 3403 | struct buffer *bp; |
| 3410 | EMACS_INT prev, pos; | 3404 | EMACS_INT prev, pos; |
| 3411 | { | 3405 | { |
| 3412 | /* If parent is nil, replace overlays_before; otherwise, XCDR(parent). */ | 3406 | /* If parent is nil, replace overlays_before; otherwise, parent->next. */ |
| 3413 | Lisp_Object tail = bp->overlays_before, parent = Qnil; | 3407 | struct Lisp_Overlay *tail = bp->overlays_before, *parent = NULL, *right_pair; |
| 3414 | Lisp_Object right_pair; | 3408 | Lisp_Object tem; |
| 3415 | EMACS_INT end; | 3409 | EMACS_INT end; |
| 3416 | 3410 | ||
| 3417 | /* After the insertion, the several overlays may be in incorrect | 3411 | /* After the insertion, the several overlays may be in incorrect |
| @@ -3425,60 +3419,59 @@ fix_overlays_before (bp, prev, pos) | |||
| 3425 | in. It is where an overlay which end before POS exists. (i.e. an | 3419 | in. It is where an overlay which end before POS exists. (i.e. an |
| 3426 | overlay whose ending marker is after-insertion-marker if disorder | 3420 | overlay whose ending marker is after-insertion-marker if disorder |
| 3427 | exists). */ | 3421 | exists). */ |
| 3428 | while (!NILP (tail) | 3422 | while (tail |
| 3429 | && ((end = OVERLAY_POSITION (OVERLAY_END (XCAR (tail)))) | 3423 | && (XSETMISC (tem, tail), |
| 3430 | >= pos)) | 3424 | (end = OVERLAY_POSITION (OVERLAY_END (tem))) >= pos)) |
| 3431 | { | 3425 | { |
| 3432 | parent = tail; | 3426 | parent = tail; |
| 3433 | tail = XCDR (tail); | 3427 | tail = tail->next; |
| 3434 | } | 3428 | } |
| 3435 | 3429 | ||
| 3436 | /* If we don't find such an overlay, | 3430 | /* If we don't find such an overlay, |
| 3437 | or the found one ends before PREV, | 3431 | or the found one ends before PREV, |
| 3438 | or the found one is the last one in the list, | 3432 | or the found one is the last one in the list, |
| 3439 | we don't have to fix anything. */ | 3433 | we don't have to fix anything. */ |
| 3440 | if (NILP (tail) | 3434 | if (tail || end < prev || !tail->next) |
| 3441 | || end < prev | ||
| 3442 | || NILP (XCDR (tail))) | ||
| 3443 | return; | 3435 | return; |
| 3444 | 3436 | ||
| 3445 | right_pair = parent; | 3437 | right_pair = parent; |
| 3446 | parent = tail; | 3438 | parent = tail; |
| 3447 | tail = XCDR (tail); | 3439 | tail = tail->next; |
| 3448 | 3440 | ||
| 3449 | /* Now, end position of overlays in the list TAIL should be before | 3441 | /* Now, end position of overlays in the list TAIL should be before |
| 3450 | or equal to PREV. In the loop, an overlay which ends at POS is | 3442 | or equal to PREV. In the loop, an overlay which ends at POS is |
| 3451 | moved ahead to the place indicated by the CDR of RIGHT_PAIR. If | 3443 | moved ahead to the place indicated by the CDR of RIGHT_PAIR. If |
| 3452 | we found an overlay which ends before PREV, the remaining | 3444 | we found an overlay which ends before PREV, the remaining |
| 3453 | overlays are in correct order. */ | 3445 | overlays are in correct order. */ |
| 3454 | while (!NILP (tail)) | 3446 | while (tail) |
| 3455 | { | 3447 | { |
| 3456 | end = OVERLAY_POSITION (OVERLAY_END (XCAR (tail))); | 3448 | XSETMISC (tem, tail); |
| 3449 | end = OVERLAY_POSITION (OVERLAY_END (tem)); | ||
| 3457 | 3450 | ||
| 3458 | if (end == pos) | 3451 | if (end == pos) |
| 3459 | { /* This overlay is disordered. */ | 3452 | { /* This overlay is disordered. */ |
| 3460 | Lisp_Object found = tail; | 3453 | struct Lisp_Overlay *found = tail; |
| 3461 | 3454 | ||
| 3462 | /* Unlink the found overlay. */ | 3455 | /* Unlink the found overlay. */ |
| 3463 | tail = XCDR (found); | 3456 | tail = found->next; |
| 3464 | XSETCDR (parent, tail); | 3457 | parent->next = tail; |
| 3465 | /* Move an overlay at RIGHT_PLACE to the next of the found one, | 3458 | /* Move an overlay at RIGHT_PLACE to the next of the found one, |
| 3466 | and link it into the right place. */ | 3459 | and link it into the right place. */ |
| 3467 | if (NILP (right_pair)) | 3460 | if (!right_pair) |
| 3468 | { | 3461 | { |
| 3469 | XSETCDR (found, bp->overlays_before); | 3462 | found->next = bp->overlays_before; |
| 3470 | bp->overlays_before = found; | 3463 | bp->overlays_before = found; |
| 3471 | } | 3464 | } |
| 3472 | else | 3465 | else |
| 3473 | { | 3466 | { |
| 3474 | XSETCDR (found, XCDR (right_pair)); | 3467 | found->next = right_pair->next; |
| 3475 | XSETCDR (right_pair, found); | 3468 | right_pair->next = found; |
| 3476 | } | 3469 | } |
| 3477 | } | 3470 | } |
| 3478 | else if (end == prev) | 3471 | else if (end == prev) |
| 3479 | { | 3472 | { |
| 3480 | parent = tail; | 3473 | parent = tail; |
| 3481 | tail = XCDR (tail); | 3474 | tail = tail->next; |
| 3482 | } | 3475 | } |
| 3483 | else /* No more disordered overlay. */ | 3476 | else /* No more disordered overlay. */ |
| 3484 | break; | 3477 | break; |
| @@ -3543,13 +3536,22 @@ rear delimiter advance when text is inserted there. */) | |||
| 3543 | XOVERLAY (overlay)->start = beg; | 3536 | XOVERLAY (overlay)->start = beg; |
| 3544 | XOVERLAY (overlay)->end = end; | 3537 | XOVERLAY (overlay)->end = end; |
| 3545 | XOVERLAY (overlay)->plist = Qnil; | 3538 | XOVERLAY (overlay)->plist = Qnil; |
| 3539 | XOVERLAY (overlay)->next = NULL; | ||
| 3546 | 3540 | ||
| 3547 | /* Put the new overlay on the wrong list. */ | 3541 | /* Put the new overlay on the wrong list. */ |
| 3548 | end = OVERLAY_END (overlay); | 3542 | end = OVERLAY_END (overlay); |
| 3549 | if (OVERLAY_POSITION (end) < b->overlay_center) | 3543 | if (OVERLAY_POSITION (end) < b->overlay_center) |
| 3550 | b->overlays_after = Fcons (overlay, b->overlays_after); | 3544 | { |
| 3545 | if (b->overlays_after) | ||
| 3546 | XOVERLAY (overlay)->next = b->overlays_after; | ||
| 3547 | b->overlays_after = XOVERLAY (overlay); | ||
| 3548 | } | ||
| 3551 | else | 3549 | else |
| 3552 | b->overlays_before = Fcons (overlay, b->overlays_before); | 3550 | { |
| 3551 | if (b->overlays_before) | ||
| 3552 | XOVERLAY (overlay)->next = b->overlays_before; | ||
| 3553 | b->overlays_before = XOVERLAY (overlay); | ||
| 3554 | } | ||
| 3553 | 3555 | ||
| 3554 | /* This puts it in the right list, and in the right order. */ | 3556 | /* This puts it in the right list, and in the right order. */ |
| 3555 | recenter_overlay_lists (b, b->overlay_center); | 3557 | recenter_overlay_lists (b, b->overlay_center); |
| @@ -3590,6 +3592,24 @@ modify_overlay (buf, start, end) | |||
| 3590 | 3592 | ||
| 3591 | Lisp_Object Fdelete_overlay (); | 3593 | Lisp_Object Fdelete_overlay (); |
| 3592 | 3594 | ||
| 3595 | static struct Lisp_Overlay * | ||
| 3596 | unchain_overlay (list, overlay) | ||
| 3597 | struct Lisp_Overlay *list, *overlay; | ||
| 3598 | { | ||
| 3599 | struct Lisp_Overlay *tmp, *prev; | ||
| 3600 | for (tmp = list, prev = NULL; tmp; prev = tmp, tmp = tmp->next) | ||
| 3601 | if (tmp == overlay) | ||
| 3602 | { | ||
| 3603 | if (prev) | ||
| 3604 | prev->next = tmp->next; | ||
| 3605 | else | ||
| 3606 | list = tmp->next; | ||
| 3607 | overlay->next = NULL; | ||
| 3608 | break; | ||
| 3609 | } | ||
| 3610 | return list; | ||
| 3611 | } | ||
| 3612 | |||
| 3593 | DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0, | 3613 | DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0, |
| 3594 | doc: /* Set the endpoints of OVERLAY to BEG and END in BUFFER. | 3614 | doc: /* Set the endpoints of OVERLAY to BEG and END in BUFFER. |
| 3595 | If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now. | 3615 | If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now. |
| @@ -3674,8 +3694,11 @@ buffer. */) | |||
| 3674 | 3694 | ||
| 3675 | if (!NILP (obuffer)) | 3695 | if (!NILP (obuffer)) |
| 3676 | { | 3696 | { |
| 3677 | ob->overlays_before = Fdelq (overlay, ob->overlays_before); | 3697 | ob->overlays_before |
| 3678 | ob->overlays_after = Fdelq (overlay, ob->overlays_after); | 3698 | = unchain_overlay (ob->overlays_before, XOVERLAY (overlay)); |
| 3699 | ob->overlays_after | ||
| 3700 | = unchain_overlay (ob->overlays_after, XOVERLAY (overlay)); | ||
| 3701 | eassert (XOVERLAY (overlay)->next == NULL); | ||
| 3679 | } | 3702 | } |
| 3680 | 3703 | ||
| 3681 | Fset_marker (OVERLAY_START (overlay), beg, buffer); | 3704 | Fset_marker (OVERLAY_START (overlay), beg, buffer); |
| @@ -3684,9 +3707,17 @@ buffer. */) | |||
| 3684 | /* Put the overlay on the wrong list. */ | 3707 | /* Put the overlay on the wrong list. */ |
| 3685 | end = OVERLAY_END (overlay); | 3708 | end = OVERLAY_END (overlay); |
| 3686 | if (OVERLAY_POSITION (end) < b->overlay_center) | 3709 | if (OVERLAY_POSITION (end) < b->overlay_center) |
| 3687 | b->overlays_after = Fcons (overlay, b->overlays_after); | 3710 | { |
| 3711 | if (b->overlays_after) | ||
| 3712 | XOVERLAY (overlay)->next = b->overlays_after; | ||
| 3713 | b->overlays_after = XOVERLAY (overlay); | ||
| 3714 | } | ||
| 3688 | else | 3715 | else |
| 3689 | b->overlays_before = Fcons (overlay, b->overlays_before); | 3716 | { |
| 3717 | if (b->overlays_before) | ||
| 3718 | XOVERLAY (overlay)->next = b->overlays_before; | ||
| 3719 | b->overlays_before = XOVERLAY (overlay); | ||
| 3720 | } | ||
| 3690 | 3721 | ||
| 3691 | /* This puts it in the right list, and in the right order. */ | 3722 | /* This puts it in the right list, and in the right order. */ |
| 3692 | recenter_overlay_lists (b, b->overlay_center); | 3723 | recenter_overlay_lists (b, b->overlay_center); |
| @@ -3712,8 +3743,9 @@ DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0, | |||
| 3712 | b = XBUFFER (buffer); | 3743 | b = XBUFFER (buffer); |
| 3713 | specbind (Qinhibit_quit, Qt); | 3744 | specbind (Qinhibit_quit, Qt); |
| 3714 | 3745 | ||
| 3715 | b->overlays_before = Fdelq (overlay, b->overlays_before); | 3746 | b->overlays_before = unchain_overlay (b->overlays_before,XOVERLAY (overlay)); |
| 3716 | b->overlays_after = Fdelq (overlay, b->overlays_after); | 3747 | b->overlays_after = unchain_overlay (b->overlays_after, XOVERLAY (overlay)); |
| 3748 | eassert (XOVERLAY (overlay)->next == NULL); | ||
| 3717 | modify_overlay (b, | 3749 | modify_overlay (b, |
| 3718 | marker_position (OVERLAY_START (overlay)), | 3750 | marker_position (OVERLAY_START (overlay)), |
| 3719 | marker_position (OVERLAY_END (overlay))); | 3751 | marker_position (OVERLAY_END (overlay))); |
| @@ -3921,15 +3953,19 @@ The lists you get are copies, so that changing them has no effect. | |||
| 3921 | However, the overlays you get are the real objects that the buffer uses. */) | 3953 | However, the overlays you get are the real objects that the buffer uses. */) |
| 3922 | () | 3954 | () |
| 3923 | { | 3955 | { |
| 3924 | Lisp_Object before, after; | 3956 | struct Lisp_Overlay *ol; |
| 3925 | before = current_buffer->overlays_before; | 3957 | Lisp_Object before = Qnil, after = Qnil, tmp; |
| 3926 | if (CONSP (before)) | 3958 | for (ol = current_buffer->overlays_before; ol; ol = ol->next) |
| 3927 | before = Fcopy_sequence (before); | 3959 | { |
| 3928 | after = current_buffer->overlays_after; | 3960 | XSETMISC (tmp, ol); |
| 3929 | if (CONSP (after)) | 3961 | before = Fcons (tmp, before); |
| 3930 | after = Fcopy_sequence (after); | 3962 | } |
| 3931 | 3963 | for (ol = current_buffer->overlays_after; ol; ol = ol->next) | |
| 3932 | return Fcons (before, after); | 3964 | { |
| 3965 | XSETMISC (tmp, ol); | ||
| 3966 | after = Fcons (tmp, after); | ||
| 3967 | } | ||
| 3968 | return Fcons (Fnreverse (before), Fnreverse (after)); | ||
| 3933 | } | 3969 | } |
| 3934 | 3970 | ||
| 3935 | DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0, | 3971 | DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0, |
| @@ -4029,8 +4065,8 @@ add_overlay_mod_hooklist (functionlist, overlay) | |||
| 4029 | XVECTOR (last_overlay_modification_hooks)->contents, | 4065 | XVECTOR (last_overlay_modification_hooks)->contents, |
| 4030 | sizeof (Lisp_Object) * oldsize); | 4066 | sizeof (Lisp_Object) * oldsize); |
| 4031 | } | 4067 | } |
| 4032 | XVECTOR (last_overlay_modification_hooks)->contents[last_overlay_modification_hooks_used++] = functionlist; | 4068 | AREF (last_overlay_modification_hooks, last_overlay_modification_hooks_used++) = functionlist; |
| 4033 | XVECTOR (last_overlay_modification_hooks)->contents[last_overlay_modification_hooks_used++] = overlay; | 4069 | AREF (last_overlay_modification_hooks, last_overlay_modification_hooks_used++) = overlay; |
| 4034 | } | 4070 | } |
| 4035 | 4071 | ||
| 4036 | /* Run the modification-hooks of overlays that include | 4072 | /* Run the modification-hooks of overlays that include |
| @@ -4053,27 +4089,26 @@ report_overlay_modification (start, end, after, arg1, arg2, arg3) | |||
| 4053 | int after; | 4089 | int after; |
| 4054 | Lisp_Object arg1, arg2, arg3; | 4090 | Lisp_Object arg1, arg2, arg3; |
| 4055 | { | 4091 | { |
| 4056 | Lisp_Object prop, overlay, tail; | 4092 | Lisp_Object prop, overlay; |
| 4093 | struct Lisp_Overlay *tail; | ||
| 4057 | /* 1 if this change is an insertion. */ | 4094 | /* 1 if this change is an insertion. */ |
| 4058 | int insertion = (after ? XFASTINT (arg3) == 0 : EQ (start, end)); | 4095 | int insertion = (after ? XFASTINT (arg3) == 0 : EQ (start, end)); |
| 4059 | struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; | 4096 | struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
| 4060 | 4097 | ||
| 4061 | overlay = Qnil; | 4098 | overlay = Qnil; |
| 4062 | tail = Qnil; | 4099 | tail = NULL; |
| 4063 | 4100 | ||
| 4064 | if (!after) | 4101 | if (!after) |
| 4065 | { | 4102 | { |
| 4066 | /* We are being called before a change. | 4103 | /* We are being called before a change. |
| 4067 | Scan the overlays to find the functions to call. */ | 4104 | Scan the overlays to find the functions to call. */ |
| 4068 | last_overlay_modification_hooks_used = 0; | 4105 | last_overlay_modification_hooks_used = 0; |
| 4069 | for (tail = current_buffer->overlays_before; | 4106 | for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 4070 | CONSP (tail); | ||
| 4071 | tail = XCDR (tail)) | ||
| 4072 | { | 4107 | { |
| 4073 | int startpos, endpos; | 4108 | int startpos, endpos; |
| 4074 | Lisp_Object ostart, oend; | 4109 | Lisp_Object ostart, oend; |
| 4075 | 4110 | ||
| 4076 | overlay = XCAR (tail); | 4111 | XSETMISC (overlay, tail); |
| 4077 | 4112 | ||
| 4078 | ostart = OVERLAY_START (overlay); | 4113 | ostart = OVERLAY_START (overlay); |
| 4079 | oend = OVERLAY_END (overlay); | 4114 | oend = OVERLAY_END (overlay); |
| @@ -4104,15 +4139,13 @@ report_overlay_modification (start, end, after, arg1, arg2, arg3) | |||
| 4104 | add_overlay_mod_hooklist (prop, overlay); | 4139 | add_overlay_mod_hooklist (prop, overlay); |
| 4105 | } | 4140 | } |
| 4106 | } | 4141 | } |
| 4107 | 4142 | ||
| 4108 | for (tail = current_buffer->overlays_after; | 4143 | for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 4109 | CONSP (tail); | ||
| 4110 | tail = XCDR (tail)) | ||
| 4111 | { | 4144 | { |
| 4112 | int startpos, endpos; | 4145 | int startpos, endpos; |
| 4113 | Lisp_Object ostart, oend; | 4146 | Lisp_Object ostart, oend; |
| 4114 | 4147 | ||
| 4115 | overlay = XCAR (tail); | 4148 | XSETMISC (overlay, tail); |
| 4116 | 4149 | ||
| 4117 | ostart = OVERLAY_START (overlay); | 4150 | ostart = OVERLAY_START (overlay); |
| 4118 | oend = OVERLAY_END (overlay); | 4151 | oend = OVERLAY_END (overlay); |
| @@ -4197,15 +4230,15 @@ void | |||
| 4197 | evaporate_overlays (pos) | 4230 | evaporate_overlays (pos) |
| 4198 | EMACS_INT pos; | 4231 | EMACS_INT pos; |
| 4199 | { | 4232 | { |
| 4200 | Lisp_Object tail, overlay, hit_list; | 4233 | Lisp_Object overlay, hit_list; |
| 4234 | struct Lisp_Overlay *tail; | ||
| 4201 | 4235 | ||
| 4202 | hit_list = Qnil; | 4236 | hit_list = Qnil; |
| 4203 | if (pos <= current_buffer->overlay_center) | 4237 | if (pos <= current_buffer->overlay_center) |
| 4204 | for (tail = current_buffer->overlays_before; CONSP (tail); | 4238 | for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 4205 | tail = XCDR (tail)) | ||
| 4206 | { | 4239 | { |
| 4207 | int endpos; | 4240 | int endpos; |
| 4208 | overlay = XCAR (tail); | 4241 | XSETMISC (overlay, tail); |
| 4209 | endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 4242 | endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 4210 | if (endpos < pos) | 4243 | if (endpos < pos) |
| 4211 | break; | 4244 | break; |
| @@ -4214,11 +4247,10 @@ evaporate_overlays (pos) | |||
| 4214 | hit_list = Fcons (overlay, hit_list); | 4247 | hit_list = Fcons (overlay, hit_list); |
| 4215 | } | 4248 | } |
| 4216 | else | 4249 | else |
| 4217 | for (tail = current_buffer->overlays_after; CONSP (tail); | 4250 | for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 4218 | tail = XCDR (tail)) | ||
| 4219 | { | 4251 | { |
| 4220 | int startpos; | 4252 | int startpos; |
| 4221 | overlay = XCAR (tail); | 4253 | XSETMISC (overlay, tail); |
| 4222 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 4254 | startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 4223 | if (startpos > pos) | 4255 | if (startpos > pos) |
| 4224 | break; | 4256 | break; |
| @@ -4858,8 +4890,8 @@ init_buffer_once () | |||
| 4858 | buffer_defaults.undo_list = Qnil; | 4890 | buffer_defaults.undo_list = Qnil; |
| 4859 | buffer_defaults.mark_active = Qnil; | 4891 | buffer_defaults.mark_active = Qnil; |
| 4860 | buffer_defaults.file_format = Qnil; | 4892 | buffer_defaults.file_format = Qnil; |
| 4861 | buffer_defaults.overlays_before = Qnil; | 4893 | buffer_defaults.overlays_before = NULL; |
| 4862 | buffer_defaults.overlays_after = Qnil; | 4894 | buffer_defaults.overlays_after = NULL; |
| 4863 | buffer_defaults.overlay_center = BEG; | 4895 | buffer_defaults.overlay_center = BEG; |
| 4864 | 4896 | ||
| 4865 | XSETFASTINT (buffer_defaults.tab_width, 8); | 4897 | XSETFASTINT (buffer_defaults.tab_width, 8); |