use guile-snarf for subr definition
[bpt/emacs.git] / src / marker.c
index a03a0b1..0b1df6d 100644 (file)
@@ -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
@@ -499,20 +505,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)
 {
@@ -747,11 +771,5 @@ verify_bytepos (ptrdiff_t charpos)
 void
 syms_of_marker (void)
 {
-  defsubr (&Smarker_position);
-  defsubr (&Smarker_buffer);
-  defsubr (&Sset_marker);
-  defsubr (&Scopy_marker);
-  defsubr (&Smarker_insertion_type);
-  defsubr (&Sset_marker_insertion_type);
-  defsubr (&Sbuffer_has_markers_at);
+#include "marker.x"
 }