aboutsummaryrefslogtreecommitdiffstats
path: root/src/marker-vector.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/marker-vector.h')
-rw-r--r--src/marker-vector.h70
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 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);