]> code.delx.au - gnu-emacs/blobdiff - src/marker.c
* lisp/isearch.el (isearch-forward-symbol-at-point): Add isearch-push-state.
[gnu-emacs] / src / marker.c
index a03a0b104ca0e3a861227f937664f1fb8ab1c301..febdb17689a5d9af8d32b37e97972c5a97f64389 100644 (file)
@@ -1,13 +1,13 @@
 /* Markers: examining, setting and deleting.
-   Copyright (C) 1985, 1997-1998, 2001-2013 Free Software Foundation,
+   Copyright (C) 1985, 1997-1998, 2001-2016 Free Software Foundation,
    Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -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
@@ -406,8 +412,7 @@ Returns nil if MARKER points into a dead buffer.  */)
 }
 
 DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0,
-       doc: /* Return the position MARKER points at, as a character number.
-Returns nil if MARKER points nowhere.  */)
+       doc: /* Return the position of MARKER, or nil if it points nowhere.  */)
   (Lisp_Object marker)
 {
   CHECK_MARKER (marker);
@@ -449,21 +454,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 +491,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)
 {