diff options
Diffstat (limited to 'src/marker-vector.h')
| -rw-r--r-- | src/marker-vector.h | 70 |
1 files changed, 49 insertions, 21 deletions
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); |