Contents in latest XEmacs 21.2 at 1999-06-24-19.
[chise/xemacs-chise.git.1] / src / marker.c
index 507e314..0a68b44 100644 (file)
@@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA.  */
 
 #include <config.h>
 #include "lisp.h"
+#include <stddef.h>
 
 #include "buffer.h"
 
@@ -75,16 +76,15 @@ print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
 }
 
 static int
-marker_equal (Lisp_Object o1, Lisp_Object o2, int depth)
+marker_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
 {
-  struct buffer *b1 = XMARKER (o1)->buffer;
-  if (b1 != XMARKER (o2)->buffer)
-    return (0);
-  else if (!b1)
-    /* All markers pointing nowhere are equal */
-    return (1);
-  else
-    return ((XMARKER (o1)->memind == XMARKER (o2)->memind));
+  struct Lisp_Marker *marker1 = XMARKER (obj1);
+  struct Lisp_Marker *marker2 = XMARKER (obj2);
+
+  return ((marker1->buffer == marker2->buffer) &&
+         (marker1->memind == marker2->memind ||
+         /* All markers pointing nowhere are equal */
+          !marker1->buffer));
 }
 
 static unsigned long
@@ -96,9 +96,14 @@ marker_hash (Lisp_Object obj, int depth)
   return hash;
 }
 
+static const struct lrecord_description marker_description[] = {
+  { XD_LISP_OBJECT, offsetof(struct Lisp_Marker, next), 3 },
+  { XD_END }
+};
+
 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("marker", marker,
                                     mark_marker, print_marker, 0,
-                                    marker_equal, marker_hash,
+                                    marker_equal, marker_hash, marker_description,
                                     struct Lisp_Marker);
 \f
 /* Operations on markers. */
@@ -180,7 +185,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
       (MARKERP (pos) && !XMARKER (pos)->buffer))
     {
       if (point_p)
-       signal_simple_error ("can't make point-marker point nowhere",
+       signal_simple_error ("Can't make point-marker point nowhere",
                             marker);
       if (XMARKER (marker)->buffer)
        unchain_marker (marker);
@@ -199,7 +204,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
        {
          if (point_p)
            signal_simple_error
-             ("can't move point-marker in a killed buffer", marker);
+             ("Can't move point-marker in a killed buffer", marker);
          if (XMARKER (marker)->buffer)
            unchain_marker (marker);
          return marker;
@@ -237,7 +242,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
   if (m->buffer != b)
     {
       if (point_p)
-       signal_simple_error ("can't change buffer of point-marker", marker);
+       signal_simple_error ("Can't change buffer of point-marker", marker);
       if (m->buffer != 0)
        unchain_marker (marker);
       m->buffer = b;
@@ -523,7 +528,10 @@ init_buffer_markers (struct buffer *b)
   b->mark = Fmake_marker ();
   BUF_MARKERS (b) = 0;
   b->point_marker = Fmake_marker ();
-  Fset_marker (b->point_marker, make_int (1), buf);
+  Fset_marker (b->point_marker,
+              /* For indirect buffers, point is already set.  */
+              b->base_buffer ? make_int (BUF_PT (b)) : make_int (1),
+              buf);
 }
 
 void