X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/16ddec7e9e6adcf615db097d9627d490ca29208c..d34f67dae3caa277bfebe0aa9f60e83a22bce0eb:/src/marker.c
diff --git a/src/marker.c b/src/marker.c
index e01647bdb2..91fcea5f25 100644
--- a/src/marker.c
+++ b/src/marker.c
@@ -1,5 +1,6 @@
/* Markers: examining, setting and deleting.
- Copyright (C) 1985, 1997-1998, 2001-2012 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1997-1998, 2001-2014 Free Software Foundation,
+ Inc.
This file is part of GNU Emacs.
@@ -29,7 +30,7 @@ along with GNU Emacs. If not, see . */
static ptrdiff_t cached_charpos;
static ptrdiff_t cached_bytepos;
static struct buffer *cached_buffer;
-static int cached_modiff;
+static EMACS_INT cached_modiff;
/* Juanma Barranquero reported ~3x increased
bootstrap time when byte_char_debug_check is enabled; so this
@@ -82,16 +83,14 @@ clear_charpos_cache (struct buffer *b)
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. */
-/* charpos_to_bytepos returns the byte position corresponding to CHARPOS. */
-
-/* This macro is a subroutine of charpos_to_bytepos.
+/* This macro is a subroutine of buf_charpos_to_bytepos.
Note that it is desirable that BYTEPOS is not evaluated
except when we really want its value. */
#define CONSIDER(CHARPOS, BYTEPOS) \
{ \
ptrdiff_t this_charpos = (CHARPOS); \
- int changed = 0; \
+ bool changed = 0; \
\
if (this_charpos == charpos) \
{ \
@@ -128,12 +127,14 @@ clear_charpos_cache (struct buffer *b)
} \
}
-ptrdiff_t
-charpos_to_bytepos (ptrdiff_t charpos)
+static void
+CHECK_MARKER (Lisp_Object x)
{
- return buf_charpos_to_bytepos (current_buffer, charpos);
+ CHECK_TYPE (MARKERP (x), Qmarkerp, x);
}
+/* Return the byte position corresponding to CHARPOS in B. */
+
ptrdiff_t
buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
{
@@ -141,8 +142,7 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
ptrdiff_t best_above, best_above_byte;
ptrdiff_t best_below, best_below_byte;
- if (charpos < BUF_BEG (b) || charpos > BUF_Z (b))
- emacs_abort ();
+ eassert (BUF_BEG (b) <= charpos && charpos <= BUF_Z (b));
best_above = BUF_Z (b);
best_above_byte = BUF_Z_BYTE (b);
@@ -190,7 +190,7 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
if (charpos - best_below < best_above - charpos)
{
- int record = charpos - best_below > 5000;
+ bool record = charpos - best_below > 5000;
while (best_below != charpos)
{
@@ -215,7 +215,7 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
}
else
{
- int record = best_above - charpos > 5000;
+ bool record = best_above - charpos > 5000;
while (best_above != charpos)
{
@@ -242,9 +242,6 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
#undef CONSIDER
-/* buf_bytepos_to_charpos returns the char position corresponding to
- BYTEPOS. */
-
/* This macro is a subroutine of buf_bytepos_to_charpos.
It is used when BYTEPOS is actually the byte position. */
@@ -288,6 +285,8 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
} \
}
+/* Return the character position corresponding to BYTEPOS in B. */
+
ptrdiff_t
buf_bytepos_to_charpos (struct buffer *b, ptrdiff_t bytepos)
{
@@ -295,8 +294,7 @@ buf_bytepos_to_charpos (struct buffer *b, ptrdiff_t bytepos)
ptrdiff_t best_above, best_above_byte;
ptrdiff_t best_below, best_below_byte;
- if (bytepos < BUF_BEG_BYTE (b) || bytepos > BUF_Z_BYTE (b))
- emacs_abort ();
+ eassert (BUF_BEG_BYTE (b) <= bytepos && bytepos <= BUF_Z_BYTE (b));
best_above = BUF_Z (b);
best_above_byte = BUF_Z_BYTE (b);
@@ -335,7 +333,7 @@ buf_bytepos_to_charpos (struct buffer *b, ptrdiff_t bytepos)
if (bytepos - best_below_byte < best_above_byte - bytepos)
{
- int record = bytepos - best_below_byte > 5000;
+ bool record = bytepos - best_below_byte > 5000;
while (best_below_byte < bytepos)
{
@@ -362,7 +360,7 @@ buf_bytepos_to_charpos (struct buffer *b, ptrdiff_t bytepos)
}
else
{
- int record = best_above_byte - bytepos > 5000;
+ bool record = best_above_byte - bytepos > 5000;
while (best_above_byte > bytepos)
{
@@ -479,10 +477,10 @@ live_buffer (Lisp_Object buffer)
static Lisp_Object
set_marker_internal (Lisp_Object marker, Lisp_Object position,
- Lisp_Object buffer, int restricted)
+ Lisp_Object buffer, bool restricted)
{
- register struct Lisp_Marker *m;
- register struct buffer *b = live_buffer (buffer);
+ struct Lisp_Marker *m;
+ struct buffer *b = live_buffer (buffer);
CHECK_MARKER (marker);
m = XMARKER (marker);
@@ -507,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)
{