/* Markers: examining, setting and deleting.
- Copyright (C) 1985, 1997, 1998, 2001, 2002, 2003, 2004,
- 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1997, 1998, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GNU Emacs.
-GNU Emacs is free software; you can redistribute it and/or modify
+GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA. */
+along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
+#include <setjmp.h>
#include "lisp.h"
#include "buffer.h"
-#include "charset.h"
+#include "character.h"
/* Record one cached position found recently by
buf_charpos_to_bytepos or buf_bytepos_to_charpos. */
static struct buffer *cached_buffer;
static int cached_modiff;
-static void byte_char_debug_check P_ ((struct buffer *, int, int));
+static void byte_char_debug_check (struct buffer *, int, int);
/* Nonzero means enable debugging checks on byte/char correspondences. */
static int byte_debug_flag;
void
-clear_charpos_cache (b)
- struct buffer *b;
+clear_charpos_cache (struct buffer *b)
{
if (cached_buffer == b)
cached_buffer = 0;
}
static void
-byte_char_debug_check (b, charpos, bytepos)
- struct buffer *b;
- int charpos, bytepos;
+byte_char_debug_check (struct buffer *b, int charpos, int bytepos)
{
int nchars = 0;
}
int
-charpos_to_bytepos (charpos)
- int charpos;
+charpos_to_bytepos (int charpos)
{
return buf_charpos_to_bytepos (current_buffer, charpos);
}
int
-buf_charpos_to_bytepos (b, charpos)
- struct buffer *b;
- int charpos;
+buf_charpos_to_bytepos (struct buffer *b, int charpos)
{
struct Lisp_Marker *tail;
int best_above, best_above_byte;
in the simplest, most reliable way. */
int
-verify_bytepos (charpos)
- int charpos;
+verify_bytepos (int charpos)
{
int below = 1;
int below_byte = 1;
}
int
-bytepos_to_charpos (bytepos)
- int bytepos;
+bytepos_to_charpos (int bytepos)
{
return buf_bytepos_to_charpos (current_buffer, bytepos);
}
int
-buf_bytepos_to_charpos (b, bytepos)
- struct buffer *b;
- int bytepos;
+buf_bytepos_to_charpos (struct buffer *b, int bytepos)
{
struct Lisp_Marker *tail;
int best_above, best_above_byte;
if (XMARKER (marker)->buffer)
{
XSETBUFFER (buf, XMARKER (marker)->buffer);
- /* Return marker's buffer only if it is not dead. */
- if (!NILP (XBUFFER (buf)->name))
- return buf;
+ /* If the buffer is dead, we're in trouble: the buffer pointer here
+ does not preserve the buffer from being GC'd (it's weak), so
+ markers have to be unlinked from their buffer as soon as the buffer
+ is killed. */
+ eassert (!NILP (XBUFFER (buf)->name));
+ return buf;
}
return Qnil;
}
be outside the visible part. */
Lisp_Object
-set_marker_restricted (marker, pos, buffer)
- Lisp_Object marker, pos, buffer;
+set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer)
{
register int charno, bytepos;
register struct buffer *b;
character position and the corresponding byte position. */
Lisp_Object
-set_marker_both (marker, buffer, charpos, bytepos)
- Lisp_Object marker, buffer;
- int charpos, bytepos;
+set_marker_both (Lisp_Object marker, Lisp_Object buffer, int charpos, int bytepos)
{
register struct buffer *b;
register struct Lisp_Marker *m;
be outside the visible part. */
Lisp_Object
-set_marker_restricted_both (marker, buffer, charpos, bytepos)
- Lisp_Object marker, buffer;
- int charpos, bytepos;
+set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer, int charpos, int bytepos)
{
register struct buffer *b;
register struct Lisp_Marker *m;
including those in chain fields of markers. */
void
-unchain_marker (marker)
- register struct Lisp_Marker *marker;
+unchain_marker (register struct Lisp_Marker *marker)
{
register struct Lisp_Marker *tail, *prev, *next;
register struct buffer *b;
/* Return the char position of marker MARKER, as a C integer. */
int
-marker_position (marker)
- Lisp_Object marker;
+marker_position (Lisp_Object marker)
{
register struct Lisp_Marker *m = XMARKER (marker);
register struct buffer *buf = m->buffer;
/* Return the byte position of marker MARKER, as a C integer. */
int
-marker_byte_position (marker)
- Lisp_Object marker;
+marker_byte_position (Lisp_Object marker)
{
register struct Lisp_Marker *m = XMARKER (marker);
register struct buffer *buf = m->buffer;
/* For debugging -- count the markers in buffer BUF. */
int
-count_markers (buf)
- struct buffer *buf;
+count_markers (struct buffer *buf)
{
int total = 0;
struct Lisp_Marker *tail;
}
\f
void
-syms_of_marker ()
+syms_of_marker (void)
{
defsubr (&Smarker_position);
defsubr (&Smarker_buffer);