/* 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. */
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,
}
#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. */
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));
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;
{
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;
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;
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. */
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 ()