X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3f82a88a05e227145b0470991050698085d19fbe..089c6aab18ea8986bfc02ef3e65500b589e7afbe:/src/marker.c diff --git a/src/marker.c b/src/marker.c index a03a0b104c..d377efbc4f 100644 --- a/src/marker.c +++ b/src/marker.c @@ -1,5 +1,5 @@ /* Markers: examining, setting and deleting. - Copyright (C) 1985, 1997-1998, 2001-2013 Free Software Foundation, + Copyright (C) 1985, 1997-1998, 2001-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -127,6 +127,12 @@ clear_charpos_cache (struct buffer *b) } \ } +static void +CHECK_MARKER (Lisp_Object x) +{ + CHECK_TYPE (MARKERP (x), Qmarkerp, x); +} + /* Return the byte position corresponding to CHARPOS in B. */ ptrdiff_t @@ -449,21 +455,8 @@ attach_marker (struct Lisp_Marker *m, struct buffer *b, static struct buffer * live_buffer (Lisp_Object buffer) { - struct buffer *b; - - if (NILP (buffer)) - { - b = current_buffer; - eassert (BUFFER_LIVE_P (b)); - } - else - { - CHECK_BUFFER (buffer); - b = XBUFFER (buffer); - if (!BUFFER_LIVE_P (b)) - b = NULL; - } - return b; + struct buffer *b = decode_buffer (buffer); + return BUFFER_LIVE_P (b) ? b : NULL; } /* Internal function to set MARKER in BUFFER at POSITION. Non-zero @@ -499,20 +492,38 @@ set_marker_internal (Lisp_Object marker, Lisp_Object position, { register ptrdiff_t charpos, bytepos; - CHECK_NUMBER_COERCE_MARKER (position); - charpos = clip_to_bounds (restricted ? BUF_BEGV (b) : BUF_BEG (b), - XINT (position), - restricted ? BUF_ZV (b) : BUF_Z (b)); - bytepos = buf_charpos_to_bytepos (b, charpos); + /* Do not use CHECK_NUMBER_COERCE_MARKER because we + don't want to call buf_charpos_to_bytepos if POSITION + is a marker and so we know the bytepos already. */ + if (INTEGERP (position)) + charpos = XINT (position), bytepos = -1; + else if (MARKERP (position)) + { + charpos = XMARKER (position)->charpos; + bytepos = XMARKER (position)->bytepos; + } + else + wrong_type_argument (Qinteger_or_marker_p, position); + + charpos = clip_to_bounds + (restricted ? BUF_BEGV (b) : BUF_BEG (b), charpos, + restricted ? BUF_ZV (b) : BUF_Z (b)); + if (bytepos == -1) + bytepos = buf_charpos_to_bytepos (b, charpos); + else + bytepos = clip_to_bounds + (restricted ? BUF_BEGV_BYTE (b) : BUF_BEG_BYTE (b), + bytepos, restricted ? BUF_ZV_BYTE (b) : BUF_Z_BYTE (b)); + attach_marker (m, b, charpos, bytepos); } return marker; } DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0, - doc: /* Position MARKER before character number POSITION in BUFFER, -which defaults to the current buffer. If POSITION is nil, -makes marker point nowhere so it no longer slows down + doc: /* Position MARKER before character number POSITION in BUFFER. +If BUFFER is omitted or nil, it defaults to the current buffer. If +POSITION is nil, makes marker point nowhere so it no longer slows down editing in any buffer. Returns MARKER. */) (Lisp_Object marker, Lisp_Object position, Lisp_Object buffer) {