XEmacs 21.4.17 "Jumbo Shrimp".
[chise/xemacs-chise.git.1] / src / marker.c
index 59a81aa..c8b8663 100644 (file)
@@ -36,9 +36,9 @@ Boston, MA 02111-1307, USA.  */
 #include "buffer.h"
 
 static Lisp_Object
-mark_marker (Lisp_Object obj, void (*markobj) (Lisp_Object))
+mark_marker (Lisp_Object obj)
 {
-  struct Lisp_Marker *marker = XMARKER (obj);
+  Lisp_Marker *marker = XMARKER (obj);
   Lisp_Object buf;
   /* DO NOT mark through the marker's chain.
      The buffer's markers chain does not preserve markers from gc;
@@ -55,7 +55,7 @@ mark_marker (Lisp_Object obj, void (*markobj) (Lisp_Object))
 static void
 print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
 {
-  struct Lisp_Marker *marker = XMARKER (obj);
+  Lisp_Marker *marker = XMARKER (obj);
   char buf[200];
 
   if (print_readably)
@@ -66,7 +66,7 @@ print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
     write_c_string (GETTEXT ("in no buffer"), printcharfun);
   else
     {
-      sprintf (buf, "at %d in ", marker_position (obj));
+      sprintf (buf, "at %ld in ", (long) marker_position (obj));
       write_c_string (buf, printcharfun);
       print_internal (marker->buffer->name, printcharfun, 0);
     }
@@ -77,8 +77,8 @@ print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
 static int
 marker_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
 {
-  struct Lisp_Marker *marker1 = XMARKER (obj1);
-  struct Lisp_Marker *marker2 = XMARKER (obj2);
+  Lisp_Marker *marker1 = XMARKER (obj1);
+  Lisp_Marker *marker2 = XMARKER (obj2);
 
   return ((marker1->buffer == marker2->buffer) &&
          (marker1->memind == marker2->memind ||
@@ -95,10 +95,17 @@ marker_hash (Lisp_Object obj, int depth)
   return hash;
 }
 
+static const struct lrecord_description marker_description[] = {
+  { XD_LISP_OBJECT, offsetof (Lisp_Marker, next) },
+  { XD_LISP_OBJECT, offsetof (Lisp_Marker, prev) },
+  { XD_LISP_OBJECT, offsetof (Lisp_Marker, buffer) },
+  { XD_END }
+};
+
 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("marker", marker,
                                     mark_marker, print_marker, 0,
-                                    marker_equal, marker_hash,
-                                    struct Lisp_Marker);
+                                    marker_equal, marker_hash, marker_description,
+                                    Lisp_Marker);
 \f
 /* Operations on markers. */
 
@@ -135,7 +142,7 @@ Return `nil' if marker doesn't point anywhere.
 static void
 check_marker_circularities (struct buffer *buf)
 {
-  struct Lisp_Marker *tortoise, *hare;
+  Lisp_Marker *tortoise, *hare;
 
   tortoise = BUF_MARKERS (buf);
   hare = tortoise;
@@ -161,12 +168,12 @@ check_marker_circularities (struct buffer *buf)
 #endif
 
 static Lisp_Object
-set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
-                    int restricted_p)
+set_marker_internal (Lisp_Object marker, Lisp_Object position,
+                    Lisp_Object buffer, int restricted_p)
 {
   Bufpos charno;
   struct buffer *b;
-  struct Lisp_Marker *m;
+  Lisp_Marker *m;
   int point_p;
 
   CHECK_MARKER (marker);
@@ -175,8 +182,8 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
 
   /* If position is nil or a marker that points nowhere,
      make this marker point nowhere.  */
-  if (NILP (pos) ||
-      (MARKERP (pos) && !XMARKER (pos)->buffer))
+  if (NILP (position) ||
+      (MARKERP (position) && !XMARKER (position)->buffer))
     {
       if (point_p)
        signal_simple_error ("Can't make point-marker point nowhere",
@@ -186,7 +193,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
       return marker;
     }
 
-  CHECK_INT_COERCE_MARKER (pos);
+  CHECK_INT_COERCE_MARKER (position);
   if (NILP (buffer))
     b = current_buffer;
   else
@@ -205,7 +212,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
        }
     }
 
-  charno = XINT (pos);
+  charno = XINT (position);
   m = XMARKER (marker);
 
   if (restricted_p)
@@ -252,26 +259,32 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
 
 
 DEFUN ("set-marker", Fset_marker, 2, 3, 0, /*
-Position MARKER before character number NUMBER in BUFFER.
+Move MARKER to position POSITION in BUFFER.
+POSITION can be a marker, an integer or nil.  If POSITION is an
+integer, make MARKER point before the POSITIONth character in BUFFER.
+If POSITION is nil, makes MARKER point nowhere.  Then it no longer
+slows down editing in any buffer.  If POSITION is less than 1, move
+MARKER to the beginning of BUFFER.  If POSITION is greater than the
+size of BUFFER, move MARKER to the end of BUFFER.
 BUFFER defaults to the current buffer.
-If NUMBER is nil, makes marker point nowhere.
-Then it no longer slows down editing in any buffer.
-If this marker was returned by (point-marker t), then changing its position
-moves point.  You cannot change its buffer or make it point nowhere.
-Returns MARKER.
+If this marker was returned by (point-marker t), then changing its
+position moves point.  You cannot change its buffer or make it point
+nowhere.
+The return value is MARKER.
 */
-       (marker, number, buffer))
+       (marker, position, buffer))
 {
-  return set_marker_internal (marker, number, buffer, 0);
+  return set_marker_internal (marker, position, buffer, 0);
 }
 
 
 /* This version of Fset_marker won't let the position
    be outside the visible part.  */
 Lisp_Object
-set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer)
+set_marker_restricted (Lisp_Object marker, Lisp_Object position,
+                      Lisp_Object buffer)
 {
-  return set_marker_internal (marker, pos, buffer, 1);
+  return set_marker_internal (marker, position, buffer, 1);
 }
 
 
@@ -282,7 +295,7 @@ set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer)
 void
 unchain_marker (Lisp_Object m)
 {
-  struct Lisp_Marker *marker = XMARKER (m);
+  Lisp_Marker *marker = XMARKER (m);
   struct buffer *b = marker->buffer;
 
   if (b == 0)
@@ -309,7 +322,7 @@ unchain_marker (Lisp_Object m)
 Bytind
 bi_marker_position (Lisp_Object marker)
 {
-  struct Lisp_Marker *m = XMARKER (marker);
+  Lisp_Marker *m = XMARKER (marker);
   struct buffer *buf = m->buffer;
   Bytind pos;
 
@@ -326,7 +339,7 @@ bi_marker_position (Lisp_Object marker)
 
 #ifdef ERROR_CHECK_BUFPOS
   if (pos < BI_BUF_BEG (buf) || pos > BI_BUF_Z (buf))
-    abort ();
+    ABORT ();
 #endif
 
   return pos;
@@ -346,7 +359,7 @@ marker_position (Lisp_Object marker)
 void
 set_bi_marker_position (Lisp_Object marker, Bytind pos)
 {
-  struct Lisp_Marker *m = XMARKER (marker);
+  Lisp_Marker *m = XMARKER (marker);
   struct buffer *buf = m->buffer;
 
   if (!buf)
@@ -354,7 +367,7 @@ set_bi_marker_position (Lisp_Object marker, Bytind pos)
 
 #ifdef ERROR_CHECK_BUFPOS
   if (pos < BI_BUF_BEG (buf) || pos > BI_BUF_Z (buf))
-    abort ();
+    ABORT ();
 #endif
 
   m->memind = bytind_to_memind (buf, pos);
@@ -397,21 +410,21 @@ copy_marker_1 (Lisp_Object marker, Lisp_Object type, int noseeum)
 }
 
 DEFUN ("copy-marker", Fcopy_marker, 1, 2, 0, /*
-Return a new marker pointing at the same place as MARKER.
-If argument is a number, makes a new marker pointing
+Return a new marker pointing at the same place as MARKER-OR-INTEGER.
+If MARKER-OR-INTEGER is an integer, return a new marker pointing
 at that position in the current buffer.
-The optional argument TYPE specifies the insertion type of the new marker;
-see `marker-insertion-type'.
+Optional argument MARKER-TYPE specifies the insertion type of the new
+marker; see `marker-insertion-type'.
 */
-       (marker, type))
+       (marker_or_integer, marker_type))
 {
-  return copy_marker_1 (marker, type, 0);
+  return copy_marker_1 (marker_or_integer, marker_type, 0);
 }
 
 Lisp_Object
-noseeum_copy_marker (Lisp_Object marker, Lisp_Object type)
+noseeum_copy_marker (Lisp_Object marker, Lisp_Object marker_type)
 {
-  return copy_marker_1 (marker, type, 1);
+  return copy_marker_1 (marker, marker_type, 1);
 }
 
 DEFUN ("marker-insertion-type", Fmarker_insertion_type, 1, 1, 0, /*
@@ -453,7 +466,7 @@ Return t if there are markers pointing at POSITION in the current buffer.
 */
        (position))
 {
-  struct Lisp_Marker *marker;
+  Lisp_Marker *marker;
   Memind pos;
 
   /* A small optimization trick: convert POS to memind now, rather
@@ -482,12 +495,12 @@ Return t if there are markers pointing at POSITION in the current buffer.
 int
 compute_buffer_marker_usage (struct buffer *b, struct overhead_stats *ovstats)
 {
-  struct Lisp_Marker *m;
+  Lisp_Marker *m;
   int total = 0;
   int overhead;
 
   for (m = BUF_MARKERS (b); m; m = m->next)
-    total += sizeof (struct Lisp_Marker);
+    total += sizeof (Lisp_Marker);
   ovstats->was_requested += total;
   overhead = fixed_type_block_overhead (total);
   /* #### claiming this is all malloc overhead is not really right,
@@ -502,6 +515,8 @@ compute_buffer_marker_usage (struct buffer *b, struct overhead_stats *ovstats)
 void
 syms_of_marker (void)
 {
+  INIT_LRECORD_IMPLEMENTATION (marker);
+
   DEFSUBR (Fmarker_position);
   DEFSUBR (Fmarker_buffer);
   DEFSUBR (Fset_marker);
@@ -533,7 +548,7 @@ uninit_buffer_markers (struct buffer *b)
 {
   /* Unchain all markers of this buffer
      and leave them pointing nowhere.  */
-  REGISTER struct Lisp_Marker *m, *next;
+  REGISTER Lisp_Marker *m, *next;
   for (m = BUF_MARKERS (b); m; m = next)
     {
       m->buffer = 0;