]> code.delx.au - gnu-emacs/blobdiff - src/marker.c
*** empty log message ***
[gnu-emacs] / src / marker.c
index 2ba164d2dc429104778c5642ed433a37d7219e40..b91609ca084fbede024222b1ed333a99139a89e6 100644 (file)
@@ -49,7 +49,7 @@ clear_charpos_cache (b)
 /* Converting between character positions and byte positions.  */
 
 /* There are several places in the buffer where we know
-   the corrspondence: BEG, BEGV, PT, GPT, ZV and Z,
+   the correspondence: BEG, BEGV, PT, GPT, ZV and Z,
    and everywhere there is a marker.  So we find the one of these places
    that is closest to the specified position, and scan from there.  */
 
@@ -149,8 +149,8 @@ buf_charpos_to_bytepos (b, charpos)
   if (best_above == best_above_byte)
     return charpos;
 
-  best_below = 1;
-  best_below_byte = 1;
+  best_below = BEG;
+  best_below_byte = BEG_BYTE;
 
   /* We find in best_above and best_above_byte
      the closest known point above CHARPOS,
@@ -252,6 +252,24 @@ buf_charpos_to_bytepos (b, charpos)
 }
 
 #undef CONSIDER
+
+/* Used for debugging: recompute the bytepos corresponding to CHARPOS
+   in the simplest, most reliable way.  */
+
+int
+verify_bytepos (charpos)
+{
+  int below = 1;
+  int below_byte = 1;
+
+  while (below != charpos)
+    {
+      below++;
+      BUF_INC_POS (current_buffer, below_byte);
+    }
+
+  return below_byte;
+}
 \f
 /* bytepos_to_charpos returns the char position corresponding to BYTEPOS.  */
 
@@ -326,8 +344,8 @@ buf_bytepos_to_charpos (b, bytepos)
   if (best_above == best_above_byte)
     return bytepos;
 
-  best_below = 1;
-  best_below_byte = 1;
+  best_below = BEG;
+  best_below_byte = BEG_BYTE;
 
   CONSIDER (BUF_PT_BYTE (b), BUF_PT (b));
   CONSIDER (BUF_GPT_BYTE (b), BUF_GPT (b));
@@ -434,7 +452,7 @@ Returns nil if MARKER points into a dead buffer.  */)
      register Lisp_Object marker;
 {
   register Lisp_Object buf;
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
   if (XMARKER (marker)->buffer)
     {
       XSETBUFFER (buf, XMARKER (marker)->buffer);
@@ -450,7 +468,7 @@ DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0,
      (marker)
      Lisp_Object marker;
 {
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
   if (XMARKER (marker)->buffer)
     return make_number (XMARKER (marker)->charpos);
 
@@ -470,7 +488,7 @@ Returns MARKER.  */)
   register struct buffer *b;
   register struct Lisp_Marker *m;
 
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
   /* If position is nil or a marker that points nowhere,
      make this marker point nowhere.  */
   if (NILP (position)
@@ -484,7 +502,7 @@ Returns MARKER.  */)
     b = current_buffer;
   else
     {
-      CHECK_BUFFER (buffer, 1);
+      CHECK_BUFFER (buffer);
       b = XBUFFER (buffer);
       /* If buffer is dead, set marker to point nowhere.  */
       if (EQ (b->name, Qnil))
@@ -506,7 +524,7 @@ Returns MARKER.  */)
       return marker;
     }
 
-  CHECK_NUMBER_COERCE_MARKER (position, 1);
+  CHECK_NUMBER_COERCE_MARKER (position);
 
   charno = XINT (position);
 
@@ -531,14 +549,14 @@ Returns MARKER.  */)
       m->chain = BUF_MARKERS (b);
       BUF_MARKERS (b) = marker;
     }
-  
+
   return marker;
 }
 
 /* This version of Fset_marker won't let the position
    be outside the visible part.  */
 
-Lisp_Object 
+Lisp_Object
 set_marker_restricted (marker, pos, buffer)
      Lisp_Object marker, pos, buffer;
 {
@@ -546,7 +564,7 @@ set_marker_restricted (marker, pos, buffer)
   register struct buffer *b;
   register struct Lisp_Marker *m;
 
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
   /* If position is nil or a marker that points nowhere,
      make this marker point nowhere.  */
   if (NILP (pos)
@@ -560,7 +578,7 @@ set_marker_restricted (marker, pos, buffer)
     b = current_buffer;
   else
     {
-      CHECK_BUFFER (buffer, 1);
+      CHECK_BUFFER (buffer);
       b = XBUFFER (buffer);
       /* If buffer is dead, set marker to point nowhere.  */
       if (EQ (b->name, Qnil))
@@ -582,7 +600,7 @@ set_marker_restricted (marker, pos, buffer)
       return marker;
     }
 
-  CHECK_NUMBER_COERCE_MARKER (pos, 1);
+  CHECK_NUMBER_COERCE_MARKER (pos);
 
   charno = XINT (pos);
 
@@ -607,14 +625,14 @@ set_marker_restricted (marker, pos, buffer)
       m->chain = BUF_MARKERS (b);
       BUF_MARKERS (b) = marker;
     }
-  
+
   return marker;
 }
 \f
 /* Set the position of MARKER, specifying both the
    character position and the corresponding byte position.  */
 
-Lisp_Object 
+Lisp_Object
 set_marker_both (marker, buffer, charpos, bytepos)
      Lisp_Object marker, buffer;
      int charpos, bytepos;
@@ -622,13 +640,13 @@ set_marker_both (marker, buffer, charpos, bytepos)
   register struct buffer *b;
   register struct Lisp_Marker *m;
 
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
 
   if (NILP (buffer))
     b = current_buffer;
   else
     {
-      CHECK_BUFFER (buffer, 1);
+      CHECK_BUFFER (buffer);
       b = XBUFFER (buffer);
       /* If buffer is dead, set marker to point nowhere.  */
       if (EQ (b->name, Qnil))
@@ -658,14 +676,14 @@ set_marker_both (marker, buffer, charpos, bytepos)
       m->chain = BUF_MARKERS (b);
       BUF_MARKERS (b) = marker;
     }
-  
+
   return marker;
 }
 
 /* This version of set_marker_both won't let the position
    be outside the visible part.  */
 
-Lisp_Object 
+Lisp_Object
 set_marker_restricted_both (marker, buffer, charpos, bytepos)
      Lisp_Object marker, buffer;
      int charpos, bytepos;
@@ -673,13 +691,13 @@ set_marker_restricted_both (marker, buffer, charpos, bytepos)
   register struct buffer *b;
   register struct Lisp_Marker *m;
 
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
 
   if (NILP (buffer))
     b = current_buffer;
   else
     {
-      CHECK_BUFFER (buffer, 1);
+      CHECK_BUFFER (buffer);
       b = XBUFFER (buffer);
       /* If buffer is dead, set marker to point nowhere.  */
       if (EQ (b->name, Qnil))
@@ -718,11 +736,14 @@ set_marker_restricted_both (marker, buffer, charpos, bytepos)
       m->chain = BUF_MARKERS (b);
       BUF_MARKERS (b) = marker;
     }
-  
+
   return marker;
 }
 \f
-/* This is called during garbage collection,
+/* Remove MARKER from the chain of whatever buffer it is in.
+   Leave it "in no buffer".
+
+   This is called during garbage collection,
    so we must be careful to ignore and preserve mark bits,
    including those in chain fields of markers.  */
 
@@ -843,7 +864,7 @@ nil means the marker stays before text inserted there.  */)
      (marker)
      register Lisp_Object marker;
 {
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
   return XMARKER (marker)->insertion_type ? Qt : Qnil;
 }
 
@@ -855,7 +876,7 @@ If TYPE is nil, it means the marker stays behind when you insert text at it.  */
      (marker, type)
      Lisp_Object marker, type;
 {
-  CHECK_MARKER (marker, 0);
+  CHECK_MARKER (marker);
 
   XMARKER (marker)->insertion_type = ! NILP (type);
   return type;
@@ -885,6 +906,23 @@ DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, Sbuffer_has_markers_at,
 
   return Qnil;
 }
+
+/* For debugging -- count the markers in buffer BUF.  */
+
+int
+count_markers (buf)
+     struct buffer *buf;
+{
+  int total = 0;
+  Lisp_Object tail;
+
+  for (tail = BUF_MARKERS (buf);
+       !NILP (tail);
+       tail = XMARKER (tail)->chain)
+    total++;
+
+  return total;
+}
 \f
 void
 syms_of_marker ()