summaryrefslogtreecommitdiff
path: root/src/marker.c
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2012-07-06 12:53:15 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2012-07-06 12:53:15 +0400
commit4e57b342c5713d900b93ffde70cf7bb9150ca8fd (patch)
tree329eb7416b283832e020da1735c5e03fb9c9a5c3 /src/marker.c
parent5acf95603cccae8c1b91860d741a24e7a1387ef3 (diff)
downloademacs-4e57b342c5713d900b93ffde70cf7bb9150ca8fd.tar.gz
Avoid code repetition in marker-related functions.
* marker.c (attach_marker): New function. (Fset_marker, set_marker_restricted, set_marker_both) (set_marker_restricted_both): Use it. (Fset_marker, set_marker_restricted, Fbuffer_has_markers_at): Consistently rename charno to charpos. (marker_position): Add eassert. (marker_byte_position): Convert to eassert.
Diffstat (limited to 'src/marker.c')
-rw-r--r--src/marker.c111
1 files changed, 39 insertions, 72 deletions
diff --git a/src/marker.c b/src/marker.c
index 0a1dd41b498..47a3e85e582 100644
--- a/src/marker.c
+++ b/src/marker.c
@@ -432,7 +432,28 @@ Returns nil if MARKER points nowhere. */)
return Qnil;
}
-
+
+/* Change M so it points to B at CHARPOS and BYTEPOS. */
+
+static inline void
+attach_marker (struct Lisp_Marker *m, struct buffer *b,
+ ptrdiff_t charpos, ptrdiff_t bytepos)
+{
+ /* Every character is at least one byte. */
+ eassert (charpos <= bytepos);
+
+ m->charpos = charpos;
+ m->bytepos = bytepos;
+
+ if (m->buffer != b)
+ {
+ unchain_marker (m);
+ m->buffer = b;
+ m->next = BUF_MARKERS (b);
+ BUF_MARKERS (b) = m;
+ }
+}
+
DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0,
doc: /* Position MARKER before character number POSITION in BUFFER.
BUFFER defaults to the current buffer.
@@ -441,7 +462,7 @@ Then it no longer slows down editing in any buffer.
Returns MARKER. */)
(Lisp_Object marker, Lisp_Object position, Lisp_Object buffer)
{
- register ptrdiff_t charno;
+ register ptrdiff_t charpos;
register ptrdiff_t bytepos;
register struct buffer *b;
register struct Lisp_Marker *m;
@@ -483,24 +504,10 @@ Returns MARKER. */)
}
CHECK_NUMBER_COERCE_MARKER (position);
- charno = clip_to_bounds (BUF_BEG (b), XINT (position), BUF_Z (b));
- bytepos = buf_charpos_to_bytepos (b, charno);
-
- /* Every character is at least one byte. */
- if (charno > bytepos)
- abort ();
-
- m->bytepos = bytepos;
- m->charpos = charno;
-
- if (m->buffer != b)
- {
- unchain_marker (m);
- m->buffer = b;
- m->next = BUF_MARKERS (b);
- BUF_MARKERS (b) = m;
- }
+ charpos = clip_to_bounds (BUF_BEG (b), XINT (position), BUF_Z (b));
+ bytepos = buf_charpos_to_bytepos (b, charpos);
+ attach_marker (m, b, charpos, bytepos);
return marker;
}
@@ -510,7 +517,7 @@ Returns MARKER. */)
Lisp_Object
set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer)
{
- register ptrdiff_t charno;
+ register ptrdiff_t charpos;
register ptrdiff_t bytepos;
register struct buffer *b;
register struct Lisp_Marker *m;
@@ -552,24 +559,10 @@ set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer)
}
CHECK_NUMBER_COERCE_MARKER (pos);
- charno = clip_to_bounds (BUF_BEGV (b), XINT (pos), BUF_ZV (b));
- bytepos = buf_charpos_to_bytepos (b, charno);
-
- /* Every character is at least one byte. */
- if (charno > bytepos)
- abort ();
-
- m->bytepos = bytepos;
- m->charpos = charno;
-
- if (m->buffer != b)
- {
- unchain_marker (m);
- m->buffer = b;
- m->next = BUF_MARKERS (b);
- BUF_MARKERS (b) = m;
- }
+ charpos = clip_to_bounds (BUF_BEGV (b), XINT (pos), BUF_ZV (b));
+ bytepos = buf_charpos_to_bytepos (b, charpos);
+ attach_marker (m, b, charpos, bytepos);
return marker;
}
@@ -603,21 +596,8 @@ set_marker_both (Lisp_Object marker, Lisp_Object buffer, ptrdiff_t charpos, ptrd
if (BUF_Z (b) == BUF_Z_BYTE (b)
&& charpos != bytepos)
abort ();
- /* Every character is at least one byte. */
- if (charpos > bytepos)
- abort ();
-
- m->bytepos = bytepos;
- m->charpos = charpos;
-
- if (m->buffer != b)
- {
- unchain_marker (m);
- m->buffer = b;
- m->next = BUF_MARKERS (b);
- BUF_MARKERS (b) = m;
- }
+ attach_marker (m, b, charpos, bytepos);
return marker;
}
@@ -654,21 +634,8 @@ set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer, ptrdiff_t ch
if (BUF_Z (b) == BUF_Z_BYTE (b)
&& charpos != bytepos)
abort ();
- /* Every character is at least one byte. */
- if (charpos > bytepos)
- abort ();
-
- m->bytepos = bytepos;
- m->charpos = charpos;
-
- if (m->buffer != b)
- {
- unchain_marker (m);
- m->buffer = b;
- m->next = BUF_MARKERS (b);
- BUF_MARKERS (b) = m;
- }
+ attach_marker (m, b, charpos, bytepos);
return marker;
}
@@ -726,6 +693,8 @@ marker_position (Lisp_Object marker)
if (!buf)
error ("Marker does not point anywhere");
+ eassert (BUF_BEG (buf) <= m->charpos && m->charpos <= BUF_Z (buf));
+
return m->charpos;
}
@@ -736,15 +705,13 @@ marker_byte_position (Lisp_Object marker)
{
register struct Lisp_Marker *m = XMARKER (marker);
register struct buffer *buf = m->buffer;
- register ptrdiff_t i = m->bytepos;
if (!buf)
error ("Marker does not point anywhere");
- if (i < BUF_BEG_BYTE (buf) || i > BUF_Z_BYTE (buf))
- abort ();
+ eassert (BUF_BEG_BYTE (buf) <= m->bytepos && m->bytepos <= BUF_Z_BYTE (buf));
- return i;
+ return m->bytepos;
}
DEFUN ("copy-marker", Fcopy_marker, Scopy_marker, 0, 2, 0,
@@ -797,12 +764,12 @@ DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, Sbuffer_has_markers_at,
(Lisp_Object position)
{
register struct Lisp_Marker *tail;
- register ptrdiff_t charno;
+ register ptrdiff_t charpos;
- charno = clip_to_bounds (BEG, XINT (position), Z);
+ charpos = clip_to_bounds (BEG, XINT (position), Z);
for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next)
- if (tail->charpos == charno)
+ if (tail->charpos == charpos)
return Qt;
return Qnil;