aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Möllmann2025-05-08 06:46:17 +0200
committerGerd Möllmann2025-05-08 06:54:03 +0200
commit38892c66d5467781b0ea512432fea6ecf637b4c7 (patch)
tree2a8b7ff8e1c4e5147724440958219dd146ed377b
parent3aa95eddac15fb09cdd73dbfea305c1b00f1ac03 (diff)
downloademacs-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-format2
-rw-r--r--src/alloc.c3
-rw-r--r--src/buffer.c15
-rw-r--r--src/coding.c12
-rw-r--r--src/editfns.c3
-rw-r--r--src/marker-vector.c13
-rw-r--r--src/marker-vector.h70
-rw-r--r--src/undo.c3
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
9IndentPPDirectives: AfterHash 9IndentPPDirectives: AfterHash
10PPIndentWidth: 1 10PPIndentWidth: 1
11ForEachMacros: 11ForEachMacros:
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)
7114static void 7114static void
7115unchain_dead_markers (struct buffer *b) 7115unchain_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
7125NO_INLINE /* For better stack traces */ 7124NO_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
4458DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, 4457DEFUN ("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)
280void 278void
281marker_vector_reset (struct buffer *b) 279marker_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 42struct 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); \ 52INLINE struct for_each_marker_data
53 if (MARKERP (m_)) \ 53build_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
65INLINE bool
66next_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
64Lisp_Object make_marker_vector (void); 92Lisp_Object make_marker_vector (void);
65Lisp_Object alloc_marker_vector (ptrdiff_t len); 93Lisp_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