diff options
| author | Gerd Möllmann | 2025-05-08 06:46:17 +0200 |
|---|---|---|
| committer | Gerd Möllmann | 2025-05-08 06:54:03 +0200 |
| commit | 38892c66d5467781b0ea512432fea6ecf637b4c7 (patch) | |
| tree | 2a8b7ff8e1c4e5147724440958219dd146ed377b | |
| parent | 3aa95eddac15fb09cdd73dbfea305c1b00f1ac03 (diff) | |
| download | emacs-scratch/text-index.tar.gz emacs-scratch/text-index.zip | |
DO_MARKERS -> Pip's FOR_EACH_MARKERscratch/text-index
* src/marker-vector.h (DO_MARKERS_OF_VECTOR, DO_MARKERS): Remove.
(build_for_each_marker_data, next_marker_entry):
(FOR_EACH_MARKER_OF_VECTOR, FOR_EACH_MARKER): New.
* .clang-format (IndentPPDirectives): Add new FOR_EACH_ macros.
* src/alloc.c (unchain_dead_markers):
* src/buffer.c (Fkill_buffer, Fbuffer_swap_text)
(Fset_buffer_multibyte):
* src/coding.c (decode_coding_object, encode_coding_object):
* src/editfns.c (transpose_markers):
* src/marker-vector.c (check_marker_vector, marker_vector_reset)
(marker_vector_adjust_for_insert)
(marker_vector_adjust_for_replace):
* src/undo.c (record_marker_adjustments): Use FOR_EACH_MARKER.
| -rw-r--r-- | .clang-format | 2 | ||||
| -rw-r--r-- | src/alloc.c | 3 | ||||
| -rw-r--r-- | src/buffer.c | 15 | ||||
| -rw-r--r-- | src/coding.c | 12 | ||||
| -rw-r--r-- | src/editfns.c | 3 | ||||
| -rw-r--r-- | src/marker-vector.c | 13 | ||||
| -rw-r--r-- | src/marker-vector.h | 70 | ||||
| -rw-r--r-- | src/undo.c | 3 |
8 files changed, 67 insertions, 54 deletions
diff --git a/.clang-format b/.clang-format index 7929a7435f2..8fea915960f 100644 --- a/.clang-format +++ b/.clang-format | |||
| @@ -9,6 +9,8 @@ ContinuationIndentWidth: 2 | |||
| 9 | IndentPPDirectives: AfterHash | 9 | IndentPPDirectives: AfterHash |
| 10 | PPIndentWidth: 1 | 10 | PPIndentWidth: 1 |
| 11 | ForEachMacros: | 11 | ForEachMacros: |
| 12 | - FOR_EACH_MARKER | ||
| 13 | - FOR_EACH_MARKER_OF_VECTOR | ||
| 12 | - FOR_EACH_TAIL | 14 | - FOR_EACH_TAIL |
| 13 | - FOR_EACH_TAIL_SAFE | 15 | - FOR_EACH_TAIL_SAFE |
| 14 | - FOR_EACH_LIVE_BUFFER | 16 | - FOR_EACH_LIVE_BUFFER |
diff --git a/src/alloc.c b/src/alloc.c index c90f60ee518..30bdd1140b8 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -7114,12 +7114,11 @@ sweep_symbols (void) | |||
| 7114 | static void | 7114 | static void |
| 7115 | unchain_dead_markers (struct buffer *b) | 7115 | unchain_dead_markers (struct buffer *b) |
| 7116 | { | 7116 | { |
| 7117 | DO_MARKERS (b, m) | 7117 | FOR_EACH_MARKER (b, m) |
| 7118 | { | 7118 | { |
| 7119 | if (!vectorlike_marked_p (&m->header)) | 7119 | if (!vectorlike_marked_p (&m->header)) |
| 7120 | marker_vector_remove (XVECTOR (BUF_MARKERS (b)), m); | 7120 | marker_vector_remove (XVECTOR (BUF_MARKERS (b)), m); |
| 7121 | } | 7121 | } |
| 7122 | END_DO_MARKERS; | ||
| 7123 | } | 7122 | } |
| 7124 | 7123 | ||
| 7125 | NO_INLINE /* For better stack traces */ | 7124 | NO_INLINE /* For better stack traces */ |
diff --git a/src/buffer.c b/src/buffer.c index 93a2edb3693..21b6096517d 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -2073,12 +2073,11 @@ cleaning up all windows currently displaying the buffer to be killed. */) | |||
| 2073 | /* Unchain all markers that belong to this indirect buffer. | 2073 | /* Unchain all markers that belong to this indirect buffer. |
| 2074 | Don't unchain the markers that belong to the base buffer | 2074 | Don't unchain the markers that belong to the base buffer |
| 2075 | or its other indirect buffers. */ | 2075 | or its other indirect buffers. */ |
| 2076 | DO_MARKERS (b, m) | 2076 | FOR_EACH_MARKER (b, m) |
| 2077 | { | 2077 | { |
| 2078 | if (m->buffer == b) | 2078 | if (m->buffer == b) |
| 2079 | marker_vector_remove (XVECTOR (BUF_MARKERS (b)), m); | 2079 | marker_vector_remove (XVECTOR (BUF_MARKERS (b)), m); |
| 2080 | } | 2080 | } |
| 2081 | END_DO_MARKERS; | ||
| 2082 | 2081 | ||
| 2083 | /* Intervals should be owned by the base buffer (Bug#16502). */ | 2082 | /* Intervals should be owned by the base buffer (Bug#16502). */ |
| 2084 | i = buffer_intervals (b); | 2083 | i = buffer_intervals (b); |
| @@ -2618,7 +2617,7 @@ results, see Info node `(elisp)Swapping Text'. */) | |||
| 2618 | other_buffer->text->end_unchanged = other_buffer->text->gpt; | 2617 | other_buffer->text->end_unchanged = other_buffer->text->gpt; |
| 2619 | swap_buffer_overlays (current_buffer, other_buffer); | 2618 | swap_buffer_overlays (current_buffer, other_buffer); |
| 2620 | { | 2619 | { |
| 2621 | DO_MARKERS (current_buffer, m) | 2620 | FOR_EACH_MARKER (current_buffer, m) |
| 2622 | { | 2621 | { |
| 2623 | if (m->buffer == other_buffer) | 2622 | if (m->buffer == other_buffer) |
| 2624 | m->buffer = current_buffer; | 2623 | m->buffer = current_buffer; |
| @@ -2627,8 +2626,7 @@ results, see Info node `(elisp)Swapping Text'. */) | |||
| 2627 | BUF_MARKERS(buf) should either be for `buf' or dead. */ | 2626 | BUF_MARKERS(buf) should either be for `buf' or dead. */ |
| 2628 | eassert (!m->buffer); | 2627 | eassert (!m->buffer); |
| 2629 | } | 2628 | } |
| 2630 | END_DO_MARKERS; | 2629 | FOR_EACH_MARKER (other_buffer, m) |
| 2631 | DO_MARKERS (other_buffer, m) | ||
| 2632 | { | 2630 | { |
| 2633 | if (m->buffer == current_buffer) | 2631 | if (m->buffer == current_buffer) |
| 2634 | m->buffer = other_buffer; | 2632 | m->buffer = other_buffer; |
| @@ -2637,7 +2635,6 @@ results, see Info node `(elisp)Swapping Text'. */) | |||
| 2637 | BUF_MARKERS(buf) should either be for `buf' or dead. */ | 2635 | BUF_MARKERS(buf) should either be for `buf' or dead. */ |
| 2638 | eassert (!m->buffer); | 2636 | eassert (!m->buffer); |
| 2639 | } | 2637 | } |
| 2640 | END_DO_MARKERS; | ||
| 2641 | } | 2638 | } |
| 2642 | 2639 | ||
| 2643 | { /* Some of the C code expects that both window markers of a | 2640 | { /* Some of the C code expects that both window markers of a |
| @@ -2746,12 +2743,11 @@ current buffer is cleared. */) | |||
| 2746 | GPT = GPT_BYTE; | 2743 | GPT = GPT_BYTE; |
| 2747 | TEMP_SET_PT_BOTH (PT_BYTE, PT_BYTE); | 2744 | TEMP_SET_PT_BOTH (PT_BYTE, PT_BYTE); |
| 2748 | 2745 | ||
| 2749 | DO_MARKERS (current_buffer, tail) | 2746 | FOR_EACH_MARKER (current_buffer, tail) |
| 2750 | { | 2747 | { |
| 2751 | const ptrdiff_t bytepos = marker_vector_bytepos (tail); | 2748 | const ptrdiff_t bytepos = marker_vector_bytepos (tail); |
| 2752 | marker_vector_set_charpos (tail, bytepos); | 2749 | marker_vector_set_charpos (tail, bytepos); |
| 2753 | } | 2750 | } |
| 2754 | END_DO_MARKERS; | ||
| 2755 | 2751 | ||
| 2756 | /* Convert multibyte form of 8-bit characters to unibyte. */ | 2752 | /* Convert multibyte form of 8-bit characters to unibyte. */ |
| 2757 | pos = BEG; | 2753 | pos = BEG; |
| @@ -2901,13 +2897,12 @@ current buffer is cleared. */) | |||
| 2901 | TEMP_SET_PT_BOTH (position, byte); | 2897 | TEMP_SET_PT_BOTH (position, byte); |
| 2902 | } | 2898 | } |
| 2903 | 2899 | ||
| 2904 | DO_MARKERS (current_buffer, tail) | 2900 | FOR_EACH_MARKER (current_buffer, tail) |
| 2905 | { | 2901 | { |
| 2906 | ptrdiff_t bytepos = marker_vector_bytepos (tail); | 2902 | ptrdiff_t bytepos = marker_vector_bytepos (tail); |
| 2907 | bytepos = advance_to_char_boundary (bytepos); | 2903 | bytepos = advance_to_char_boundary (bytepos); |
| 2908 | marker_vector_set_charpos (tail, BYTE_TO_CHAR (bytepos)); | 2904 | marker_vector_set_charpos (tail, BYTE_TO_CHAR (bytepos)); |
| 2909 | } | 2905 | } |
| 2910 | END_DO_MARKERS; | ||
| 2911 | 2906 | ||
| 2912 | /* Do this last, so it can calculate the new correspondences | 2907 | /* Do this last, so it can calculate the new correspondences |
| 2913 | between chars and bytes. */ | 2908 | between chars and bytes. */ |
diff --git a/src/coding.c b/src/coding.c index f3dd2639e73..51c87fb3161 100644 --- a/src/coding.c +++ b/src/coding.c | |||
| @@ -8118,14 +8118,13 @@ decode_coding_object (struct coding_system *coding, | |||
| 8118 | move_gap_both (from, from_byte); | 8118 | move_gap_both (from, from_byte); |
| 8119 | if (BASE_EQ (src_object, dst_object)) | 8119 | if (BASE_EQ (src_object, dst_object)) |
| 8120 | { | 8120 | { |
| 8121 | DO_MARKERS (current_buffer, tail) | 8121 | FOR_EACH_MARKER (current_buffer, tail) |
| 8122 | { | 8122 | { |
| 8123 | const ptrdiff_t charpos = marker_vector_charpos (tail); | 8123 | const ptrdiff_t charpos = marker_vector_charpos (tail); |
| 8124 | tail->need_adjustment | 8124 | tail->need_adjustment |
| 8125 | = charpos == (tail->insertion_type ? from : to); | 8125 | = charpos == (tail->insertion_type ? from : to); |
| 8126 | need_marker_adjustment |= tail->need_adjustment; | 8126 | need_marker_adjustment |= tail->need_adjustment; |
| 8127 | } | 8127 | } |
| 8128 | END_DO_MARKERS; | ||
| 8129 | saved_pt = PT, saved_pt_byte = PT_BYTE; | 8128 | saved_pt = PT, saved_pt_byte = PT_BYTE; |
| 8130 | TEMP_SET_PT_BOTH (from, from_byte); | 8129 | TEMP_SET_PT_BOTH (from, from_byte); |
| 8131 | current_buffer->text->inhibit_shrinking = true; | 8130 | current_buffer->text->inhibit_shrinking = true; |
| @@ -8250,7 +8249,7 @@ decode_coding_object (struct coding_system *coding, | |||
| 8250 | 8249 | ||
| 8251 | if (need_marker_adjustment) | 8250 | if (need_marker_adjustment) |
| 8252 | { | 8251 | { |
| 8253 | DO_MARKERS (current_buffer, tail) | 8252 | FOR_EACH_MARKER (current_buffer, tail) |
| 8254 | { | 8253 | { |
| 8255 | if (tail->need_adjustment) | 8254 | if (tail->need_adjustment) |
| 8256 | { | 8255 | { |
| @@ -8269,7 +8268,6 @@ decode_coding_object (struct coding_system *coding, | |||
| 8269 | } | 8268 | } |
| 8270 | } | 8269 | } |
| 8271 | } | 8270 | } |
| 8272 | END_DO_MARKERS; | ||
| 8273 | } | 8271 | } |
| 8274 | } | 8272 | } |
| 8275 | 8273 | ||
| @@ -8340,14 +8338,13 @@ encode_coding_object (struct coding_system *coding, | |||
| 8340 | if (BASE_EQ (src_object, dst_object) && BUFFERP (src_object)) | 8338 | if (BASE_EQ (src_object, dst_object) && BUFFERP (src_object)) |
| 8341 | { | 8339 | { |
| 8342 | same_buffer = true; | 8340 | same_buffer = true; |
| 8343 | DO_MARKERS (XBUFFER (src_object), tail) | 8341 | FOR_EACH_MARKER (XBUFFER (src_object), tail) |
| 8344 | { | 8342 | { |
| 8345 | const ptrdiff_t charpos = marker_vector_charpos (tail); | 8343 | const ptrdiff_t charpos = marker_vector_charpos (tail); |
| 8346 | tail->need_adjustment | 8344 | tail->need_adjustment |
| 8347 | = charpos == (tail->insertion_type ? from : to); | 8345 | = charpos == (tail->insertion_type ? from : to); |
| 8348 | need_marker_adjustment |= tail->need_adjustment; | 8346 | need_marker_adjustment |= tail->need_adjustment; |
| 8349 | } | 8347 | } |
| 8350 | END_DO_MARKERS; | ||
| 8351 | } | 8348 | } |
| 8352 | 8349 | ||
| 8353 | if (! NILP (CODING_ATTR_PRE_WRITE (attrs))) | 8350 | if (! NILP (CODING_ATTR_PRE_WRITE (attrs))) |
| @@ -8505,7 +8502,7 @@ encode_coding_object (struct coding_system *coding, | |||
| 8505 | 8502 | ||
| 8506 | if (need_marker_adjustment) | 8503 | if (need_marker_adjustment) |
| 8507 | { | 8504 | { |
| 8508 | DO_MARKERS (current_buffer, tail) | 8505 | FOR_EACH_MARKER (current_buffer, tail) |
| 8509 | { | 8506 | { |
| 8510 | if (tail->need_adjustment) | 8507 | if (tail->need_adjustment) |
| 8511 | { | 8508 | { |
| @@ -8524,7 +8521,6 @@ encode_coding_object (struct coding_system *coding, | |||
| 8524 | } | 8521 | } |
| 8525 | } | 8522 | } |
| 8526 | } | 8523 | } |
| 8527 | END_DO_MARKERS; | ||
| 8528 | } | 8524 | } |
| 8529 | } | 8525 | } |
| 8530 | 8526 | ||
diff --git a/src/editfns.c b/src/editfns.c index 61cb7bdd201..b96275dc0a3 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -4438,7 +4438,7 @@ transpose_markers (ptrdiff_t start1, ptrdiff_t end1, | |||
| 4438 | amt1 = (end2 - start2) + (start2 - end1); | 4438 | amt1 = (end2 - start2) + (start2 - end1); |
| 4439 | amt2 = (end1 - start1) + (start2 - end1); | 4439 | amt2 = (end1 - start1) + (start2 - end1); |
| 4440 | 4440 | ||
| 4441 | DO_MARKERS (current_buffer, marker) | 4441 | FOR_EACH_MARKER (current_buffer, marker) |
| 4442 | { | 4442 | { |
| 4443 | mpos = marker_vector_charpos (marker); | 4443 | mpos = marker_vector_charpos (marker); |
| 4444 | if (mpos >= start1 && mpos < end2) | 4444 | if (mpos >= start1 && mpos < end2) |
| @@ -4452,7 +4452,6 @@ transpose_markers (ptrdiff_t start1, ptrdiff_t end1, | |||
| 4452 | } | 4452 | } |
| 4453 | marker_vector_set_charpos (marker, mpos); | 4453 | marker_vector_set_charpos (marker, mpos); |
| 4454 | } | 4454 | } |
| 4455 | END_DO_MARKERS; | ||
| 4456 | } | 4455 | } |
| 4457 | 4456 | ||
| 4458 | DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, | 4457 | DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, |
diff --git a/src/marker-vector.c b/src/marker-vector.c index a53e5f4b666..904b44be50d 100644 --- a/src/marker-vector.c +++ b/src/marker-vector.c | |||
| @@ -164,9 +164,8 @@ check_marker_vector (struct Lisp_Vector *v, bool allocating) | |||
| 164 | 164 | ||
| 165 | size_t nused = 0; | 165 | size_t nused = 0; |
| 166 | Lisp_Object mv = make_lisp_ptr (v, Lisp_Vectorlike); | 166 | Lisp_Object mv = make_lisp_ptr (v, Lisp_Vectorlike); |
| 167 | DO_MARKERS_OF_VECTOR (mv, m) | 167 | FOR_EACH_MARKER_OF_VECTOR (mv, m) |
| 168 | { | 168 | { |
| 169 | eassert (m->entry == e_); | ||
| 170 | eassert (m->buffer != NULL); | 169 | eassert (m->buffer != NULL); |
| 171 | if (!allocating) | 170 | if (!allocating) |
| 172 | { | 171 | { |
| @@ -175,7 +174,6 @@ check_marker_vector (struct Lisp_Vector *v, bool allocating) | |||
| 175 | } | 174 | } |
| 176 | ++nused; | 175 | ++nused; |
| 177 | } | 176 | } |
| 178 | END_DO_MARKERS; | ||
| 179 | 177 | ||
| 180 | eassert ((nused + nfree) * MARKER_VECTOR_ENTRY_SIZE | 178 | eassert ((nused + nfree) * MARKER_VECTOR_ENTRY_SIZE |
| 181 | + MARKER_VECTOR_HEADER_SIZE == gc_vsize (v)); | 179 | + MARKER_VECTOR_HEADER_SIZE == gc_vsize (v)); |
| @@ -280,13 +278,12 @@ marker_vector_remove (struct Lisp_Vector *v, struct Lisp_Marker *m) | |||
| 280 | void | 278 | void |
| 281 | marker_vector_reset (struct buffer *b) | 279 | marker_vector_reset (struct buffer *b) |
| 282 | { | 280 | { |
| 283 | DO_MARKERS (b, m) | 281 | FOR_EACH_MARKER (b, m) |
| 284 | { | 282 | { |
| 285 | const struct Lisp_Vector *v = XVECTOR (BUF_MARKERS (m->buffer)); | 283 | const struct Lisp_Vector *v = XVECTOR (BUF_MARKERS (m->buffer)); |
| 286 | m->entry = - XFIXNUM (CHARPOS (v, m->entry)); | 284 | m->entry = - XFIXNUM (CHARPOS (v, m->entry)); |
| 287 | m->buffer = NULL; | 285 | m->buffer = NULL; |
| 288 | } | 286 | } |
| 289 | END_DO_MARKERS; | ||
| 290 | BUF_MARKERS (b) = Qnil; | 287 | BUF_MARKERS (b) = Qnil; |
| 291 | } | 288 | } |
| 292 | 289 | ||
| @@ -344,7 +341,7 @@ marker_vector_adjust_for_insert (struct buffer *b, | |||
| 344 | { | 341 | { |
| 345 | const ptrdiff_t nchars = to_charpos - from_charpos; | 342 | const ptrdiff_t nchars = to_charpos - from_charpos; |
| 346 | struct Lisp_Vector *v = XVECTOR (BUF_MARKERS (b)); | 343 | struct Lisp_Vector *v = XVECTOR (BUF_MARKERS (b)); |
| 347 | DO_MARKERS (b, m) | 344 | FOR_EACH_MARKER (b, m) |
| 348 | { | 345 | { |
| 349 | const ptrdiff_t charpos = XFIXNUM (CHARPOS (v, m->entry)); | 346 | const ptrdiff_t charpos = XFIXNUM (CHARPOS (v, m->entry)); |
| 350 | if (charpos == from_charpos) | 347 | if (charpos == from_charpos) |
| @@ -355,7 +352,6 @@ marker_vector_adjust_for_insert (struct buffer *b, | |||
| 355 | else if (charpos > from_charpos) | 352 | else if (charpos > from_charpos) |
| 356 | CHARPOS (v, m->entry) = make_fixnum (charpos + nchars); | 353 | CHARPOS (v, m->entry) = make_fixnum (charpos + nchars); |
| 357 | } | 354 | } |
| 358 | END_DO_MARKERS; | ||
| 359 | } | 355 | } |
| 360 | 356 | ||
| 361 | /* Adjust marker positions of buffer Bs for a replacement of text at | 357 | /* Adjust marker positions of buffer Bs for a replacement of text at |
| @@ -371,7 +367,7 @@ marker_vector_adjust_for_replace (struct buffer *b, | |||
| 371 | const ptrdiff_t diff_nchars = new_nchars - old_nchars; | 367 | const ptrdiff_t diff_nchars = new_nchars - old_nchars; |
| 372 | const ptrdiff_t old_to_charpos = from_charpos + old_nchars; | 368 | const ptrdiff_t old_to_charpos = from_charpos + old_nchars; |
| 373 | struct Lisp_Vector *v = XVECTOR (BUF_MARKERS (b)); | 369 | struct Lisp_Vector *v = XVECTOR (BUF_MARKERS (b)); |
| 374 | DO_MARKERS (b, m) | 370 | FOR_EACH_MARKER (b, m) |
| 375 | { | 371 | { |
| 376 | const ptrdiff_t charpos = XFIXNUM (CHARPOS (v, m->entry)); | 372 | const ptrdiff_t charpos = XFIXNUM (CHARPOS (v, m->entry)); |
| 377 | if (charpos >= old_to_charpos) | 373 | if (charpos >= old_to_charpos) |
| @@ -379,5 +375,4 @@ marker_vector_adjust_for_replace (struct buffer *b, | |||
| 379 | else if (charpos > from_charpos) | 375 | else if (charpos > from_charpos) |
| 380 | CHARPOS (v, m->entry) = make_fixnum (from_charpos); | 376 | CHARPOS (v, m->entry) = make_fixnum (from_charpos); |
| 381 | } | 377 | } |
| 382 | END_DO_MARKERS; | ||
| 383 | } | 378 | } |
diff --git a/src/marker-vector.h b/src/marker-vector.h index 141e79ac0ee..6a0ee8a9507 100644 --- a/src/marker-vector.h +++ b/src/marker-vector.h | |||
| @@ -39,27 +39,55 @@ enum | |||
| 39 | MARKER_VECTOR_ENTRY_SIZE = 2, | 39 | MARKER_VECTOR_ENTRY_SIZE = 2, |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | /* Iterate over markers in marker vector MV, binding a variable with | 42 | struct for_each_marker_data |
| 43 | name M to a pointer to Lisp_Marker. The loop must be ended | 43 | { |
| 44 | with an END_DO_MARKERS. */ | 44 | ptrdiff_t e; |
| 45 | 45 | ptrdiff_t end; | |
| 46 | # define DO_MARKERS_OF_VECTOR(mv, m) \ | 46 | Lisp_Object m; |
| 47 | for (ptrdiff_t e_ = MARKER_VECTOR_HEADER_SIZE, \ | 47 | Lisp_Object mv; |
| 48 | end_ = XFIXNUM (AREF (mv, MARKER_VECTOR_MAX_ENTRY)); \ | 48 | bool continued; |
| 49 | e_ <= end_; \ | 49 | struct Lisp_Marker *marker; |
| 50 | e_ += MARKER_VECTOR_ENTRY_SIZE) \ | 50 | }; |
| 51 | { \ | 51 | |
| 52 | Lisp_Object m_ = AREF (mv, e_ + MARKER_VECTOR_OFFSET_MARKER); \ | 52 | INLINE struct for_each_marker_data |
| 53 | if (MARKERP (m_)) \ | 53 | build_for_each_marker_data(Lisp_Object mv) |
| 54 | { \ | 54 | { |
| 55 | struct Lisp_Marker *m = XMARKER (m_); | 55 | struct for_each_marker_data ret; |
| 56 | 56 | ret.e = MARKER_VECTOR_HEADER_SIZE; | |
| 57 | /* Iterate over markers of buffer B, binding a variable with name M to a | 57 | ret.end = XFIXNUM (AREF (mv, MARKER_VECTOR_MAX_ENTRY)); |
| 58 | pointer to Lisp_Marker. The loop must be ended with an | 58 | ret.m = Qnil; |
| 59 | END_DO_MARKERS. */ | 59 | ret.mv = mv; |
| 60 | 60 | ret.marker = NULL; | |
| 61 | # define DO_MARKERS(b, m) DO_MARKERS_OF_VECTOR (BUF_MARKERS (b), m) | 61 | ret.continued = true; |
| 62 | # define END_DO_MARKERS }} | 62 | return ret; |
| 63 | } | ||
| 64 | |||
| 65 | INLINE bool | ||
| 66 | next_marker_entry (struct for_each_marker_data *d) | ||
| 67 | { | ||
| 68 | if (!d->continued) | ||
| 69 | return false; | ||
| 70 | while (d->e <= d->end) | ||
| 71 | { | ||
| 72 | d->m = AREF (d->mv, d->e + MARKER_VECTOR_OFFSET_MARKER); | ||
| 73 | d->e += MARKER_VECTOR_ENTRY_SIZE; | ||
| 74 | if (MARKERP (d->m)) | ||
| 75 | { | ||
| 76 | d->marker = XMARKER (d->m); | ||
| 77 | d->continued = false; | ||
| 78 | return true; | ||
| 79 | } | ||
| 80 | } | ||
| 81 | return false; | ||
| 82 | } | ||
| 83 | |||
| 84 | #define FOR_EACH_MARKER_OF_VECTOR(v, m) \ | ||
| 85 | for (struct for_each_marker_data d_ = build_for_each_marker_data (v); \ | ||
| 86 | next_marker_entry (&d_);) \ | ||
| 87 | for (struct Lisp_Marker *m = d_.marker; !d_.continued; d_.continued = true) | ||
| 88 | |||
| 89 | #define FOR_EACH_MARKER(b, m) \ | ||
| 90 | FOR_EACH_MARKER_OF_VECTOR (BUF_MARKERS (b), m) | ||
| 63 | 91 | ||
| 64 | Lisp_Object make_marker_vector (void); | 92 | Lisp_Object make_marker_vector (void); |
| 65 | Lisp_Object alloc_marker_vector (ptrdiff_t len); | 93 | Lisp_Object alloc_marker_vector (ptrdiff_t len); |
diff --git a/src/undo.c b/src/undo.c index 65de0bd4e13..3e63c8af3f9 100644 --- a/src/undo.c +++ b/src/undo.c | |||
| @@ -128,7 +128,7 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to) | |||
| 128 | { | 128 | { |
| 129 | prepare_record (); | 129 | prepare_record (); |
| 130 | 130 | ||
| 131 | DO_MARKERS (current_buffer, m) | 131 | FOR_EACH_MARKER (current_buffer, m) |
| 132 | { | 132 | { |
| 133 | ptrdiff_t charpos = marker_vector_charpos (m); | 133 | ptrdiff_t charpos = marker_vector_charpos (m); |
| 134 | eassert (charpos <= Z); | 134 | eassert (charpos <= Z); |
| @@ -154,7 +154,6 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to) | |||
| 154 | } | 154 | } |
| 155 | } | 155 | } |
| 156 | } | 156 | } |
| 157 | END_DO_MARKERS; | ||
| 158 | } | 157 | } |
| 159 | 158 | ||
| 160 | /* Record that a deletion is about to take place, of the characters in | 159 | /* Record that a deletion is about to take place, of the characters in |