1 /* Markers: examining, setting and deleting.
2 Copyright (C) 1985, 1997-1998, 2001-2011 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
24 #include "character.h"
26 /* Record one cached position found recently by
27 buf_charpos_to_bytepos or buf_bytepos_to_charpos. */
29 static EMACS_INT cached_charpos
;
30 static EMACS_INT cached_bytepos
;
31 static struct buffer
*cached_buffer
;
32 static int cached_modiff
;
34 static void byte_char_debug_check (struct buffer
*, EMACS_INT
, EMACS_INT
);
37 clear_charpos_cache (struct buffer
*b
)
39 if (cached_buffer
== b
)
43 /* Converting between character positions and byte positions. */
45 /* There are several places in the buffer where we know
46 the correspondence: BEG, BEGV, PT, GPT, ZV and Z,
47 and everywhere there is a marker. So we find the one of these places
48 that is closest to the specified position, and scan from there. */
50 /* charpos_to_bytepos returns the byte position corresponding to CHARPOS. */
52 /* This macro is a subroutine of charpos_to_bytepos.
53 Note that it is desirable that BYTEPOS is not evaluated
54 except when we really want its value. */
56 #define CONSIDER(CHARPOS, BYTEPOS) \
58 EMACS_INT this_charpos = (CHARPOS); \
61 if (this_charpos == charpos) \
63 EMACS_INT value = (BYTEPOS); \
64 if (byte_debug_flag) \
65 byte_char_debug_check (b, charpos, value); \
68 else if (this_charpos > charpos) \
70 if (this_charpos < best_above) \
72 best_above = this_charpos; \
73 best_above_byte = (BYTEPOS); \
77 else if (this_charpos > best_below) \
79 best_below = this_charpos; \
80 best_below_byte = (BYTEPOS); \
86 if (best_above - best_below == best_above_byte - best_below_byte) \
88 EMACS_INT value = best_below_byte + (charpos - best_below); \
89 if (byte_debug_flag) \
90 byte_char_debug_check (b, charpos, value); \
97 byte_char_debug_check (struct buffer
*b
, EMACS_INT charpos
, EMACS_INT bytepos
)
101 if (bytepos
> BUF_GPT_BYTE (b
))
103 nchars
= multibyte_chars_in_text (BUF_BEG_ADDR (b
),
104 BUF_GPT_BYTE (b
) - BUF_BEG_BYTE (b
));
105 nchars
+= multibyte_chars_in_text (BUF_GAP_END_ADDR (b
),
106 bytepos
- BUF_GPT_BYTE (b
));
109 nchars
= multibyte_chars_in_text (BUF_BEG_ADDR (b
),
110 bytepos
- BUF_BEG_BYTE (b
));
112 if (charpos
- 1 != nchars
)
117 charpos_to_bytepos (EMACS_INT charpos
)
119 return buf_charpos_to_bytepos (current_buffer
, charpos
);
123 buf_charpos_to_bytepos (struct buffer
*b
, EMACS_INT charpos
)
125 struct Lisp_Marker
*tail
;
126 EMACS_INT best_above
, best_above_byte
;
127 EMACS_INT best_below
, best_below_byte
;
129 if (charpos
< BUF_BEG (b
) || charpos
> BUF_Z (b
))
132 best_above
= BUF_Z (b
);
133 best_above_byte
= BUF_Z_BYTE (b
);
135 /* If this buffer has as many characters as bytes,
136 each character must be one byte.
137 This takes care of the case where enable-multibyte-characters is nil. */
138 if (best_above
== best_above_byte
)
142 best_below_byte
= BEG_BYTE
;
144 /* We find in best_above and best_above_byte
145 the closest known point above CHARPOS,
146 and in best_below and best_below_byte
147 the closest known point below CHARPOS,
149 If at any point we can tell that the space between those
150 two best approximations is all single-byte,
151 we interpolate the result immediately. */
153 CONSIDER (BUF_PT (b
), BUF_PT_BYTE (b
));
154 CONSIDER (BUF_GPT (b
), BUF_GPT_BYTE (b
));
155 CONSIDER (BUF_BEGV (b
), BUF_BEGV_BYTE (b
));
156 CONSIDER (BUF_ZV (b
), BUF_ZV_BYTE (b
));
158 if (b
== cached_buffer
&& BUF_MODIFF (b
) == cached_modiff
)
159 CONSIDER (cached_charpos
, cached_bytepos
);
161 for (tail
= BUF_MARKERS (b
); tail
; tail
= tail
->next
)
163 CONSIDER (tail
->charpos
, tail
->bytepos
);
165 /* If we are down to a range of 50 chars,
166 don't bother checking any other markers;
167 scan the intervening chars directly now. */
168 if (best_above
- best_below
< 50)
172 /* We get here if we did not exactly hit one of the known places.
173 We have one known above and one known below.
174 Scan, counting characters, from whichever one is closer. */
176 if (charpos
- best_below
< best_above
- charpos
)
178 int record
= charpos
- best_below
> 5000;
180 while (best_below
!= charpos
)
183 BUF_INC_POS (b
, best_below_byte
);
186 /* If this position is quite far from the nearest known position,
187 cache the correspondence by creating a marker here.
188 It will last until the next GC. */
191 Lisp_Object marker
, buffer
;
192 marker
= Fmake_marker ();
193 XSETBUFFER (buffer
, b
);
194 set_marker_both (marker
, buffer
, best_below
, best_below_byte
);
198 byte_char_debug_check (b
, charpos
, best_below_byte
);
201 cached_modiff
= BUF_MODIFF (b
);
202 cached_charpos
= best_below
;
203 cached_bytepos
= best_below_byte
;
205 return best_below_byte
;
209 int record
= best_above
- charpos
> 5000;
211 while (best_above
!= charpos
)
214 BUF_DEC_POS (b
, best_above_byte
);
217 /* If this position is quite far from the nearest known position,
218 cache the correspondence by creating a marker here.
219 It will last until the next GC. */
222 Lisp_Object marker
, buffer
;
223 marker
= Fmake_marker ();
224 XSETBUFFER (buffer
, b
);
225 set_marker_both (marker
, buffer
, best_above
, best_above_byte
);
229 byte_char_debug_check (b
, charpos
, best_above_byte
);
232 cached_modiff
= BUF_MODIFF (b
);
233 cached_charpos
= best_above
;
234 cached_bytepos
= best_above_byte
;
236 return best_above_byte
;
242 /* Used for debugging: recompute the bytepos corresponding to CHARPOS
243 in the simplest, most reliable way. */
246 verify_bytepos (EMACS_INT charpos
)
249 EMACS_INT below_byte
= 1;
251 while (below
!= charpos
)
254 BUF_INC_POS (current_buffer
, below_byte
);
260 /* buf_bytepos_to_charpos returns the char position corresponding to
263 /* This macro is a subroutine of buf_bytepos_to_charpos.
264 It is used when BYTEPOS is actually the byte position. */
266 #define CONSIDER(BYTEPOS, CHARPOS) \
268 EMACS_INT this_bytepos = (BYTEPOS); \
271 if (this_bytepos == bytepos) \
273 EMACS_INT value = (CHARPOS); \
274 if (byte_debug_flag) \
275 byte_char_debug_check (b, value, bytepos); \
278 else if (this_bytepos > bytepos) \
280 if (this_bytepos < best_above_byte) \
282 best_above = (CHARPOS); \
283 best_above_byte = this_bytepos; \
287 else if (this_bytepos > best_below_byte) \
289 best_below = (CHARPOS); \
290 best_below_byte = this_bytepos; \
296 if (best_above - best_below == best_above_byte - best_below_byte) \
298 EMACS_INT value = best_below + (bytepos - best_below_byte); \
299 if (byte_debug_flag) \
300 byte_char_debug_check (b, value, bytepos); \
307 buf_bytepos_to_charpos (struct buffer
*b
, EMACS_INT bytepos
)
309 struct Lisp_Marker
*tail
;
310 EMACS_INT best_above
, best_above_byte
;
311 EMACS_INT best_below
, best_below_byte
;
313 if (bytepos
< BUF_BEG_BYTE (b
) || bytepos
> BUF_Z_BYTE (b
))
316 best_above
= BUF_Z (b
);
317 best_above_byte
= BUF_Z_BYTE (b
);
319 /* If this buffer has as many characters as bytes,
320 each character must be one byte.
321 This takes care of the case where enable-multibyte-characters is nil. */
322 if (best_above
== best_above_byte
)
326 best_below_byte
= BEG_BYTE
;
328 CONSIDER (BUF_PT_BYTE (b
), BUF_PT (b
));
329 CONSIDER (BUF_GPT_BYTE (b
), BUF_GPT (b
));
330 CONSIDER (BUF_BEGV_BYTE (b
), BUF_BEGV (b
));
331 CONSIDER (BUF_ZV_BYTE (b
), BUF_ZV (b
));
333 if (b
== cached_buffer
&& BUF_MODIFF (b
) == cached_modiff
)
334 CONSIDER (cached_bytepos
, cached_charpos
);
336 for (tail
= BUF_MARKERS (b
); tail
; tail
= tail
->next
)
338 CONSIDER (tail
->bytepos
, tail
->charpos
);
340 /* If we are down to a range of 50 chars,
341 don't bother checking any other markers;
342 scan the intervening chars directly now. */
343 if (best_above
- best_below
< 50)
347 /* We get here if we did not exactly hit one of the known places.
348 We have one known above and one known below.
349 Scan, counting characters, from whichever one is closer. */
351 if (bytepos
- best_below_byte
< best_above_byte
- bytepos
)
353 int record
= bytepos
- best_below_byte
> 5000;
355 while (best_below_byte
< bytepos
)
358 BUF_INC_POS (b
, best_below_byte
);
361 /* If this position is quite far from the nearest known position,
362 cache the correspondence by creating a marker here.
363 It will last until the next GC.
364 But don't do it if BUF_MARKERS is nil;
365 that is a signal from Fset_buffer_multibyte. */
366 if (record
&& BUF_MARKERS (b
))
368 Lisp_Object marker
, buffer
;
369 marker
= Fmake_marker ();
370 XSETBUFFER (buffer
, b
);
371 set_marker_both (marker
, buffer
, best_below
, best_below_byte
);
375 byte_char_debug_check (b
, best_below
, bytepos
);
378 cached_modiff
= BUF_MODIFF (b
);
379 cached_charpos
= best_below
;
380 cached_bytepos
= best_below_byte
;
386 int record
= best_above_byte
- bytepos
> 5000;
388 while (best_above_byte
> bytepos
)
391 BUF_DEC_POS (b
, best_above_byte
);
394 /* If this position is quite far from the nearest known position,
395 cache the correspondence by creating a marker here.
396 It will last until the next GC.
397 But don't do it if BUF_MARKERS is nil;
398 that is a signal from Fset_buffer_multibyte. */
399 if (record
&& BUF_MARKERS (b
))
401 Lisp_Object marker
, buffer
;
402 marker
= Fmake_marker ();
403 XSETBUFFER (buffer
, b
);
404 set_marker_both (marker
, buffer
, best_above
, best_above_byte
);
408 byte_char_debug_check (b
, best_above
, bytepos
);
411 cached_modiff
= BUF_MODIFF (b
);
412 cached_charpos
= best_above
;
413 cached_bytepos
= best_above_byte
;
421 /* Operations on markers. */
423 DEFUN ("marker-buffer", Fmarker_buffer
, Smarker_buffer
, 1, 1, 0,
424 doc
: /* Return the buffer that MARKER points into, or nil if none.
425 Returns nil if MARKER points into a dead buffer. */)
426 (register Lisp_Object marker
)
428 register Lisp_Object buf
;
429 CHECK_MARKER (marker
);
430 if (XMARKER (marker
)->buffer
)
432 XSETBUFFER (buf
, XMARKER (marker
)->buffer
);
433 /* If the buffer is dead, we're in trouble: the buffer pointer here
434 does not preserve the buffer from being GC'd (it's weak), so
435 markers have to be unlinked from their buffer as soon as the buffer
437 eassert (!NILP (BVAR (XBUFFER (buf
), name
)));
443 DEFUN ("marker-position", Fmarker_position
, Smarker_position
, 1, 1, 0,
444 doc
: /* Return the position MARKER points at, as a character number.
445 Returns nil if MARKER points nowhere. */)
448 CHECK_MARKER (marker
);
449 if (XMARKER (marker
)->buffer
)
450 return make_number (XMARKER (marker
)->charpos
);
455 DEFUN ("set-marker", Fset_marker
, Sset_marker
, 2, 3, 0,
456 doc
: /* Position MARKER before character number POSITION in BUFFER.
457 BUFFER defaults to the current buffer.
458 If POSITION is nil, makes marker point nowhere.
459 Then it no longer slows down editing in any buffer.
461 (Lisp_Object marker
, Lisp_Object position
, Lisp_Object buffer
)
463 register EMACS_INT charno
, bytepos
;
464 register struct buffer
*b
;
465 register struct Lisp_Marker
*m
;
467 CHECK_MARKER (marker
);
468 m
= XMARKER (marker
);
470 /* If position is nil or a marker that points nowhere,
471 make this marker point nowhere. */
473 || (MARKERP (position
) && !XMARKER (position
)->buffer
))
483 CHECK_BUFFER (buffer
);
484 b
= XBUFFER (buffer
);
485 /* If buffer is dead, set marker to point nowhere. */
486 if (EQ (BVAR (b
, name
), Qnil
))
493 /* Optimize the special case where we are copying the position
494 of an existing marker, and MARKER is already in the same buffer. */
495 if (MARKERP (position
) && b
== XMARKER (position
)->buffer
498 m
->bytepos
= XMARKER (position
)->bytepos
;
499 m
->charpos
= XMARKER (position
)->charpos
;
503 CHECK_NUMBER_COERCE_MARKER (position
);
505 charno
= XINT (position
);
507 if (charno
< BUF_BEG (b
))
508 charno
= BUF_BEG (b
);
509 if (charno
> BUF_Z (b
))
512 bytepos
= buf_charpos_to_bytepos (b
, charno
);
514 /* Every character is at least one byte. */
515 if (charno
> bytepos
)
518 m
->bytepos
= bytepos
;
525 m
->next
= BUF_MARKERS (b
);
532 /* This version of Fset_marker won't let the position
533 be outside the visible part. */
536 set_marker_restricted (Lisp_Object marker
, Lisp_Object pos
, Lisp_Object buffer
)
538 register EMACS_INT charno
, bytepos
;
539 register struct buffer
*b
;
540 register struct Lisp_Marker
*m
;
542 CHECK_MARKER (marker
);
543 m
= XMARKER (marker
);
545 /* If position is nil or a marker that points nowhere,
546 make this marker point nowhere. */
548 || (MARKERP (pos
) && !XMARKER (pos
)->buffer
))
558 CHECK_BUFFER (buffer
);
559 b
= XBUFFER (buffer
);
560 /* If buffer is dead, set marker to point nowhere. */
561 if (EQ (BVAR (b
, name
), Qnil
))
568 /* Optimize the special case where we are copying the position
569 of an existing marker, and MARKER is already in the same buffer. */
570 if (MARKERP (pos
) && b
== XMARKER (pos
)->buffer
573 m
->bytepos
= XMARKER (pos
)->bytepos
;
574 m
->charpos
= XMARKER (pos
)->charpos
;
578 CHECK_NUMBER_COERCE_MARKER (pos
);
582 if (charno
< BUF_BEGV (b
))
583 charno
= BUF_BEGV (b
);
584 if (charno
> BUF_ZV (b
))
587 bytepos
= buf_charpos_to_bytepos (b
, charno
);
589 /* Every character is at least one byte. */
590 if (charno
> bytepos
)
593 m
->bytepos
= bytepos
;
600 m
->next
= BUF_MARKERS (b
);
607 /* Set the position of MARKER, specifying both the
608 character position and the corresponding byte position. */
611 set_marker_both (Lisp_Object marker
, Lisp_Object buffer
, EMACS_INT charpos
, EMACS_INT bytepos
)
613 register struct buffer
*b
;
614 register struct Lisp_Marker
*m
;
616 CHECK_MARKER (marker
);
617 m
= XMARKER (marker
);
623 CHECK_BUFFER (buffer
);
624 b
= XBUFFER (buffer
);
625 /* If buffer is dead, set marker to point nowhere. */
626 if (EQ (BVAR (b
, name
), Qnil
))
633 /* In a single-byte buffer, the two positions must be equal. */
634 if (BUF_Z (b
) == BUF_Z_BYTE (b
)
635 && charpos
!= bytepos
)
637 /* Every character is at least one byte. */
638 if (charpos
> bytepos
)
641 m
->bytepos
= bytepos
;
642 m
->charpos
= charpos
;
648 m
->next
= BUF_MARKERS (b
);
655 /* This version of set_marker_both won't let the position
656 be outside the visible part. */
659 set_marker_restricted_both (Lisp_Object marker
, Lisp_Object buffer
, EMACS_INT charpos
, EMACS_INT bytepos
)
661 register struct buffer
*b
;
662 register struct Lisp_Marker
*m
;
664 CHECK_MARKER (marker
);
665 m
= XMARKER (marker
);
671 CHECK_BUFFER (buffer
);
672 b
= XBUFFER (buffer
);
673 /* If buffer is dead, set marker to point nowhere. */
674 if (EQ (BVAR (b
, name
), Qnil
))
681 if (charpos
< BUF_BEGV (b
))
682 charpos
= BUF_BEGV (b
);
683 if (charpos
> BUF_ZV (b
))
684 charpos
= BUF_ZV (b
);
685 if (bytepos
< BUF_BEGV_BYTE (b
))
686 bytepos
= BUF_BEGV_BYTE (b
);
687 if (bytepos
> BUF_ZV_BYTE (b
))
688 bytepos
= BUF_ZV_BYTE (b
);
690 /* In a single-byte buffer, the two positions must be equal. */
691 if (BUF_Z (b
) == BUF_Z_BYTE (b
)
692 && charpos
!= bytepos
)
694 /* Every character is at least one byte. */
695 if (charpos
> bytepos
)
698 m
->bytepos
= bytepos
;
699 m
->charpos
= charpos
;
705 m
->next
= BUF_MARKERS (b
);
712 /* Remove MARKER from the chain of whatever buffer it is in.
713 Leave it "in no buffer".
715 This is called during garbage collection,
716 so we must be careful to ignore and preserve mark bits,
717 including those in chain fields of markers. */
720 unchain_marker (register struct Lisp_Marker
*marker
)
722 register struct Lisp_Marker
*tail
, *prev
, *next
;
723 register struct buffer
*b
;
729 if (EQ (BVAR (b
, name
), Qnil
))
734 tail
= BUF_MARKERS (b
);
744 BUF_MARKERS (b
) = next
;
745 /* Deleting first marker from the buffer's chain. Crash
746 if new first marker in chain does not say it belongs
747 to the same buffer, or at least that they have the same
749 if (next
&& b
->text
!= next
->buffer
->text
)
754 /* We have removed the marker from the chain;
755 no need to scan the rest of the chain. */
763 /* Marker was not in its chain. */
767 /* Return the char position of marker MARKER, as a C integer. */
770 marker_position (Lisp_Object marker
)
772 register struct Lisp_Marker
*m
= XMARKER (marker
);
773 register struct buffer
*buf
= m
->buffer
;
776 error ("Marker does not point anywhere");
781 /* Return the byte position of marker MARKER, as a C integer. */
784 marker_byte_position (Lisp_Object marker
)
786 register struct Lisp_Marker
*m
= XMARKER (marker
);
787 register struct buffer
*buf
= m
->buffer
;
788 register EMACS_INT i
= m
->bytepos
;
791 error ("Marker does not point anywhere");
793 if (i
< BUF_BEG_BYTE (buf
) || i
> BUF_Z_BYTE (buf
))
799 DEFUN ("copy-marker", Fcopy_marker
, Scopy_marker
, 0, 2, 0,
800 doc
: /* Return a new marker pointing at the same place as MARKER.
801 If argument is a number, makes a new marker pointing
802 at that position in the current buffer.
803 If MARKER is not specified, the new marker does not point anywhere.
804 The optional argument TYPE specifies the insertion type of the new marker;
805 see `marker-insertion-type'. */)
806 (register Lisp_Object marker
, Lisp_Object type
)
808 register Lisp_Object
new;
811 CHECK_TYPE (INTEGERP (marker
) || MARKERP (marker
), Qinteger_or_marker_p
, marker
);
813 new = Fmake_marker ();
814 Fset_marker (new, marker
,
815 (MARKERP (marker
) ? Fmarker_buffer (marker
) : Qnil
));
816 XMARKER (new)->insertion_type
= !NILP (type
);
820 DEFUN ("marker-insertion-type", Fmarker_insertion_type
,
821 Smarker_insertion_type
, 1, 1, 0,
822 doc
: /* Return insertion type of MARKER: t if it stays after inserted text.
823 The value nil means the marker stays before text inserted there. */)
824 (register Lisp_Object marker
)
826 CHECK_MARKER (marker
);
827 return XMARKER (marker
)->insertion_type
? Qt
: Qnil
;
830 DEFUN ("set-marker-insertion-type", Fset_marker_insertion_type
,
831 Sset_marker_insertion_type
, 2, 2, 0,
832 doc
: /* Set the insertion-type of MARKER to TYPE.
833 If TYPE is t, it means the marker advances when you insert text at it.
834 If TYPE is nil, it means the marker stays behind when you insert text at it. */)
835 (Lisp_Object marker
, Lisp_Object type
)
837 CHECK_MARKER (marker
);
839 XMARKER (marker
)->insertion_type
= ! NILP (type
);
843 DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at
, Sbuffer_has_markers_at
,
845 doc
: /* Return t if there are markers pointing at POSITION in the current buffer. */)
846 (Lisp_Object position
)
848 register struct Lisp_Marker
*tail
;
849 register EMACS_INT charno
;
851 charno
= XINT (position
);
858 for (tail
= BUF_MARKERS (current_buffer
); tail
; tail
= tail
->next
)
859 if (tail
->charpos
== charno
)
865 /* For debugging -- count the markers in buffer BUF. */
868 count_markers (struct buffer
*buf
)
871 struct Lisp_Marker
*tail
;
873 for (tail
= BUF_MARKERS (buf
); tail
; tail
= tail
->next
)
880 syms_of_marker (void)
882 defsubr (&Smarker_position
);
883 defsubr (&Smarker_buffer
);
884 defsubr (&Sset_marker
);
885 defsubr (&Scopy_marker
);
886 defsubr (&Smarker_insertion_type
);
887 defsubr (&Sset_marker_insertion_type
);
888 defsubr (&Sbuffer_has_markers_at
);
890 DEFVAR_BOOL ("byte-debug-flag", byte_debug_flag
,
891 doc
: /* Non-nil enables debugging checks in byte/char position conversions. */);