1 /* Markers: examining, setting and deleting.
2 Copyright (C) 1985, 1997, 1998, 2002, 2003, 2004,
3 2005 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
28 /* Record one cached position found recently by
29 buf_charpos_to_bytepos or buf_bytepos_to_charpos. */
31 static int cached_charpos
;
32 static int cached_bytepos
;
33 static struct buffer
*cached_buffer
;
34 static int cached_modiff
;
36 static void byte_char_debug_check
P_ ((struct buffer
*, int, int));
38 /* Nonzero means enable debugging checks on byte/char correspondences. */
40 static int byte_debug_flag
;
43 clear_charpos_cache (b
)
46 if (cached_buffer
== b
)
50 /* Converting between character positions and byte positions. */
52 /* There are several places in the buffer where we know
53 the correspondence: BEG, BEGV, PT, GPT, ZV and Z,
54 and everywhere there is a marker. So we find the one of these places
55 that is closest to the specified position, and scan from there. */
57 /* charpos_to_bytepos returns the byte position corresponding to CHARPOS. */
59 /* This macro is a subroutine of charpos_to_bytepos.
60 Note that it is desirable that BYTEPOS is not evaluated
61 except when we really want its value. */
63 #define CONSIDER(CHARPOS, BYTEPOS) \
65 int this_charpos = (CHARPOS); \
68 if (this_charpos == charpos) \
70 int value = (BYTEPOS); \
71 if (byte_debug_flag) \
72 byte_char_debug_check (b, charpos, value); \
75 else if (this_charpos > charpos) \
77 if (this_charpos < best_above) \
79 best_above = this_charpos; \
80 best_above_byte = (BYTEPOS); \
84 else if (this_charpos > best_below) \
86 best_below = this_charpos; \
87 best_below_byte = (BYTEPOS); \
93 if (best_above - best_below == best_above_byte - best_below_byte) \
95 int value = best_below_byte + (charpos - best_below); \
96 if (byte_debug_flag) \
97 byte_char_debug_check (b, charpos, value); \
104 byte_char_debug_check (b
, charpos
, bytepos
)
106 int charpos
, bytepos
;
110 if (bytepos
> BUF_GPT_BYTE (b
))
112 nchars
= multibyte_chars_in_text (BUF_BEG_ADDR (b
),
113 BUF_GPT_BYTE (b
) - BUF_BEG_BYTE (b
));
114 nchars
+= multibyte_chars_in_text (BUF_GAP_END_ADDR (b
),
115 bytepos
- BUF_GPT_BYTE (b
));
118 nchars
= multibyte_chars_in_text (BUF_BEG_ADDR (b
),
119 bytepos
- BUF_BEG_BYTE (b
));
121 if (charpos
- 1 != nchars
)
126 charpos_to_bytepos (charpos
)
129 return buf_charpos_to_bytepos (current_buffer
, charpos
);
133 buf_charpos_to_bytepos (b
, charpos
)
137 struct Lisp_Marker
*tail
;
138 int best_above
, best_above_byte
;
139 int best_below
, best_below_byte
;
141 if (charpos
< BUF_BEG (b
) || charpos
> BUF_Z (b
))
144 best_above
= BUF_Z (b
);
145 best_above_byte
= BUF_Z_BYTE (b
);
147 /* If this buffer has as many characters as bytes,
148 each character must be one byte.
149 This takes care of the case where enable-multibyte-characters is nil. */
150 if (best_above
== best_above_byte
)
154 best_below_byte
= BEG_BYTE
;
156 /* We find in best_above and best_above_byte
157 the closest known point above CHARPOS,
158 and in best_below and best_below_byte
159 the closest known point below CHARPOS,
161 If at any point we can tell that the space between those
162 two best approximations is all single-byte,
163 we interpolate the result immediately. */
165 CONSIDER (BUF_PT (b
), BUF_PT_BYTE (b
));
166 CONSIDER (BUF_GPT (b
), BUF_GPT_BYTE (b
));
167 CONSIDER (BUF_BEGV (b
), BUF_BEGV_BYTE (b
));
168 CONSIDER (BUF_ZV (b
), BUF_ZV_BYTE (b
));
170 if (b
== cached_buffer
&& BUF_MODIFF (b
) == cached_modiff
)
171 CONSIDER (cached_charpos
, cached_bytepos
);
173 for (tail
= BUF_MARKERS (b
); tail
; tail
= tail
->next
)
175 CONSIDER (tail
->charpos
, tail
->bytepos
);
177 /* If we are down to a range of 50 chars,
178 don't bother checking any other markers;
179 scan the intervening chars directly now. */
180 if (best_above
- best_below
< 50)
184 /* We get here if we did not exactly hit one of the known places.
185 We have one known above and one known below.
186 Scan, counting characters, from whichever one is closer. */
188 if (charpos
- best_below
< best_above
- charpos
)
190 int record
= charpos
- best_below
> 5000;
192 while (best_below
!= charpos
)
195 BUF_INC_POS (b
, best_below_byte
);
198 /* If this position is quite far from the nearest known position,
199 cache the correspondence by creating a marker here.
200 It will last until the next GC. */
203 Lisp_Object marker
, buffer
;
204 marker
= Fmake_marker ();
205 XSETBUFFER (buffer
, b
);
206 set_marker_both (marker
, buffer
, best_below
, best_below_byte
);
210 byte_char_debug_check (b
, charpos
, best_below_byte
);
213 cached_modiff
= BUF_MODIFF (b
);
214 cached_charpos
= best_below
;
215 cached_bytepos
= best_below_byte
;
217 return best_below_byte
;
221 int record
= best_above
- charpos
> 5000;
223 while (best_above
!= charpos
)
226 BUF_DEC_POS (b
, best_above_byte
);
229 /* If this position is quite far from the nearest known position,
230 cache the correspondence by creating a marker here.
231 It will last until the next GC. */
234 Lisp_Object marker
, buffer
;
235 marker
= Fmake_marker ();
236 XSETBUFFER (buffer
, b
);
237 set_marker_both (marker
, buffer
, best_above
, best_above_byte
);
241 byte_char_debug_check (b
, charpos
, best_above_byte
);
244 cached_modiff
= BUF_MODIFF (b
);
245 cached_charpos
= best_above
;
246 cached_bytepos
= best_above_byte
;
248 return best_above_byte
;
254 /* Used for debugging: recompute the bytepos corresponding to CHARPOS
255 in the simplest, most reliable way. */
258 verify_bytepos (charpos
)
263 while (below
!= charpos
)
266 BUF_INC_POS (current_buffer
, below_byte
);
272 /* bytepos_to_charpos returns the char position corresponding to BYTEPOS. */
274 /* This macro is a subroutine of bytepos_to_charpos.
275 It is used when BYTEPOS is actually the byte position. */
277 #define CONSIDER(BYTEPOS, CHARPOS) \
279 int this_bytepos = (BYTEPOS); \
282 if (this_bytepos == bytepos) \
284 int value = (CHARPOS); \
285 if (byte_debug_flag) \
286 byte_char_debug_check (b, value, bytepos); \
289 else if (this_bytepos > bytepos) \
291 if (this_bytepos < best_above_byte) \
293 best_above = (CHARPOS); \
294 best_above_byte = this_bytepos; \
298 else if (this_bytepos > best_below_byte) \
300 best_below = (CHARPOS); \
301 best_below_byte = this_bytepos; \
307 if (best_above - best_below == best_above_byte - best_below_byte) \
309 int value = best_below + (bytepos - best_below_byte); \
310 if (byte_debug_flag) \
311 byte_char_debug_check (b, value, bytepos); \
318 bytepos_to_charpos (bytepos
)
321 return buf_bytepos_to_charpos (current_buffer
, bytepos
);
325 buf_bytepos_to_charpos (b
, bytepos
)
329 struct Lisp_Marker
*tail
;
330 int best_above
, best_above_byte
;
331 int best_below
, best_below_byte
;
333 if (bytepos
< BUF_BEG_BYTE (b
) || bytepos
> BUF_Z_BYTE (b
))
336 best_above
= BUF_Z (b
);
337 best_above_byte
= BUF_Z_BYTE (b
);
339 /* If this buffer has as many characters as bytes,
340 each character must be one byte.
341 This takes care of the case where enable-multibyte-characters is nil. */
342 if (best_above
== best_above_byte
)
346 best_below_byte
= BEG_BYTE
;
348 CONSIDER (BUF_PT_BYTE (b
), BUF_PT (b
));
349 CONSIDER (BUF_GPT_BYTE (b
), BUF_GPT (b
));
350 CONSIDER (BUF_BEGV_BYTE (b
), BUF_BEGV (b
));
351 CONSIDER (BUF_ZV_BYTE (b
), BUF_ZV (b
));
353 if (b
== cached_buffer
&& BUF_MODIFF (b
) == cached_modiff
)
354 CONSIDER (cached_bytepos
, cached_charpos
);
356 for (tail
= BUF_MARKERS (b
); tail
; tail
= tail
->next
)
358 CONSIDER (tail
->bytepos
, tail
->charpos
);
360 /* If we are down to a range of 50 chars,
361 don't bother checking any other markers;
362 scan the intervening chars directly now. */
363 if (best_above
- best_below
< 50)
367 /* We get here if we did not exactly hit one of the known places.
368 We have one known above and one known below.
369 Scan, counting characters, from whichever one is closer. */
371 if (bytepos
- best_below_byte
< best_above_byte
- bytepos
)
373 int record
= bytepos
- best_below_byte
> 5000;
375 while (best_below_byte
< bytepos
)
378 BUF_INC_POS (b
, best_below_byte
);
381 /* If this position is quite far from the nearest known position,
382 cache the correspondence by creating a marker here.
383 It will last until the next GC.
384 But don't do it if BUF_MARKERS is nil;
385 that is a signal from Fset_buffer_multibyte. */
386 if (record
&& BUF_MARKERS (b
))
388 Lisp_Object marker
, buffer
;
389 marker
= Fmake_marker ();
390 XSETBUFFER (buffer
, b
);
391 set_marker_both (marker
, buffer
, best_below
, best_below_byte
);
395 byte_char_debug_check (b
, best_below
, bytepos
);
398 cached_modiff
= BUF_MODIFF (b
);
399 cached_charpos
= best_below
;
400 cached_bytepos
= best_below_byte
;
406 int record
= best_above_byte
- bytepos
> 5000;
408 while (best_above_byte
> bytepos
)
411 BUF_DEC_POS (b
, best_above_byte
);
414 /* If this position is quite far from the nearest known position,
415 cache the correspondence by creating a marker here.
416 It will last until the next GC.
417 But don't do it if BUF_MARKERS is nil;
418 that is a signal from Fset_buffer_multibyte. */
419 if (record
&& BUF_MARKERS (b
))
421 Lisp_Object marker
, buffer
;
422 marker
= Fmake_marker ();
423 XSETBUFFER (buffer
, b
);
424 set_marker_both (marker
, buffer
, best_above
, best_above_byte
);
428 byte_char_debug_check (b
, best_above
, bytepos
);
431 cached_modiff
= BUF_MODIFF (b
);
432 cached_charpos
= best_above
;
433 cached_bytepos
= best_above_byte
;
441 /* Operations on markers. */
443 DEFUN ("marker-buffer", Fmarker_buffer
, Smarker_buffer
, 1, 1, 0,
444 doc
: /* Return the buffer that MARKER points into, or nil if none.
445 Returns nil if MARKER points into a dead buffer. */)
447 register Lisp_Object marker
;
449 register Lisp_Object buf
;
450 CHECK_MARKER (marker
);
451 if (XMARKER (marker
)->buffer
)
453 XSETBUFFER (buf
, XMARKER (marker
)->buffer
);
454 /* Return marker's buffer only if it is not dead. */
455 if (!NILP (XBUFFER (buf
)->name
))
461 DEFUN ("marker-position", Fmarker_position
, Smarker_position
, 1, 1, 0,
462 doc
: /* Return the position MARKER points at, as a character number. */)
466 CHECK_MARKER (marker
);
467 if (XMARKER (marker
)->buffer
)
468 return make_number (XMARKER (marker
)->charpos
);
473 DEFUN ("set-marker", Fset_marker
, Sset_marker
, 2, 3, 0,
474 doc
: /* Position MARKER before character number POSITION in BUFFER.
475 BUFFER defaults to the current buffer.
476 If POSITION is nil, makes marker point nowhere.
477 Then it no longer slows down editing in any buffer.
479 (marker
, position
, buffer
)
480 Lisp_Object marker
, position
, buffer
;
482 register int charno
, bytepos
;
483 register struct buffer
*b
;
484 register struct Lisp_Marker
*m
;
486 CHECK_MARKER (marker
);
487 m
= XMARKER (marker
);
489 /* If position is nil or a marker that points nowhere,
490 make this marker point nowhere. */
492 || (MARKERP (position
) && !XMARKER (position
)->buffer
))
502 CHECK_BUFFER (buffer
);
503 b
= XBUFFER (buffer
);
504 /* If buffer is dead, set marker to point nowhere. */
505 if (EQ (b
->name
, Qnil
))
512 /* Optimize the special case where we are copying the position
513 of an existing marker, and MARKER is already in the same buffer. */
514 if (MARKERP (position
) && b
== XMARKER (position
)->buffer
517 m
->bytepos
= XMARKER (position
)->bytepos
;
518 m
->charpos
= XMARKER (position
)->charpos
;
522 CHECK_NUMBER_COERCE_MARKER (position
);
524 charno
= XINT (position
);
526 if (charno
< BUF_BEG (b
))
527 charno
= BUF_BEG (b
);
528 if (charno
> BUF_Z (b
))
531 bytepos
= buf_charpos_to_bytepos (b
, charno
);
533 /* Every character is at least one byte. */
534 if (charno
> bytepos
)
537 m
->bytepos
= bytepos
;
544 m
->next
= BUF_MARKERS (b
);
551 /* This version of Fset_marker won't let the position
552 be outside the visible part. */
555 set_marker_restricted (marker
, pos
, buffer
)
556 Lisp_Object marker
, pos
, buffer
;
558 register int charno
, bytepos
;
559 register struct buffer
*b
;
560 register struct Lisp_Marker
*m
;
562 CHECK_MARKER (marker
);
563 m
= XMARKER (marker
);
565 /* If position is nil or a marker that points nowhere,
566 make this marker point nowhere. */
568 || (MARKERP (pos
) && !XMARKER (pos
)->buffer
))
578 CHECK_BUFFER (buffer
);
579 b
= XBUFFER (buffer
);
580 /* If buffer is dead, set marker to point nowhere. */
581 if (EQ (b
->name
, Qnil
))
588 /* Optimize the special case where we are copying the position
589 of an existing marker, and MARKER is already in the same buffer. */
590 if (MARKERP (pos
) && b
== XMARKER (pos
)->buffer
593 m
->bytepos
= XMARKER (pos
)->bytepos
;
594 m
->charpos
= XMARKER (pos
)->charpos
;
598 CHECK_NUMBER_COERCE_MARKER (pos
);
602 if (charno
< BUF_BEGV (b
))
603 charno
= BUF_BEGV (b
);
604 if (charno
> BUF_ZV (b
))
607 bytepos
= buf_charpos_to_bytepos (b
, charno
);
609 /* Every character is at least one byte. */
610 if (charno
> bytepos
)
613 m
->bytepos
= bytepos
;
620 m
->next
= BUF_MARKERS (b
);
627 /* Set the position of MARKER, specifying both the
628 character position and the corresponding byte position. */
631 set_marker_both (marker
, buffer
, charpos
, bytepos
)
632 Lisp_Object marker
, buffer
;
633 int charpos
, bytepos
;
635 register struct buffer
*b
;
636 register struct Lisp_Marker
*m
;
638 CHECK_MARKER (marker
);
639 m
= XMARKER (marker
);
645 CHECK_BUFFER (buffer
);
646 b
= XBUFFER (buffer
);
647 /* If buffer is dead, set marker to point nowhere. */
648 if (EQ (b
->name
, Qnil
))
655 /* In a single-byte buffer, the two positions must be equal. */
656 if (BUF_Z (b
) == BUF_Z_BYTE (b
)
657 && charpos
!= bytepos
)
659 /* Every character is at least one byte. */
660 if (charpos
> bytepos
)
663 m
->bytepos
= bytepos
;
664 m
->charpos
= charpos
;
670 m
->next
= BUF_MARKERS (b
);
677 /* This version of set_marker_both won't let the position
678 be outside the visible part. */
681 set_marker_restricted_both (marker
, buffer
, charpos
, bytepos
)
682 Lisp_Object marker
, buffer
;
683 int charpos
, bytepos
;
685 register struct buffer
*b
;
686 register struct Lisp_Marker
*m
;
688 CHECK_MARKER (marker
);
689 m
= XMARKER (marker
);
695 CHECK_BUFFER (buffer
);
696 b
= XBUFFER (buffer
);
697 /* If buffer is dead, set marker to point nowhere. */
698 if (EQ (b
->name
, Qnil
))
705 if (charpos
< BUF_BEGV (b
))
706 charpos
= BUF_BEGV (b
);
707 if (charpos
> BUF_ZV (b
))
708 charpos
= BUF_ZV (b
);
709 if (bytepos
< BUF_BEGV_BYTE (b
))
710 bytepos
= BUF_BEGV_BYTE (b
);
711 if (bytepos
> BUF_ZV_BYTE (b
))
712 bytepos
= BUF_ZV_BYTE (b
);
714 /* In a single-byte buffer, the two positions must be equal. */
715 if (BUF_Z (b
) == BUF_Z_BYTE (b
)
716 && charpos
!= bytepos
)
718 /* Every character is at least one byte. */
719 if (charpos
> bytepos
)
722 m
->bytepos
= bytepos
;
723 m
->charpos
= charpos
;
729 m
->next
= BUF_MARKERS (b
);
736 /* Remove MARKER from the chain of whatever buffer it is in.
737 Leave it "in no buffer".
739 This is called during garbage collection,
740 so we must be careful to ignore and preserve mark bits,
741 including those in chain fields of markers. */
744 unchain_marker (marker
)
745 register struct Lisp_Marker
*marker
;
747 register struct Lisp_Marker
*tail
, *prev
, *next
;
748 register struct buffer
*b
;
754 if (EQ (b
->name
, Qnil
))
759 tail
= BUF_MARKERS (b
);
769 BUF_MARKERS (b
) = next
;
770 /* Deleting first marker from the buffer's chain. Crash
771 if new first marker in chain does not say it belongs
772 to the same buffer, or at least that they have the same
774 if (next
&& b
->text
!= next
->buffer
->text
)
779 /* We have removed the marker from the chain;
780 no need to scan the rest of the chain. */
788 /* Marker was not in its chain. */
792 /* Return the char position of marker MARKER, as a C integer. */
795 marker_position (marker
)
798 register struct Lisp_Marker
*m
= XMARKER (marker
);
799 register struct buffer
*buf
= m
->buffer
;
802 error ("Marker does not point anywhere");
807 /* Return the byte position of marker MARKER, as a C integer. */
810 marker_byte_position (marker
)
813 register struct Lisp_Marker
*m
= XMARKER (marker
);
814 register struct buffer
*buf
= m
->buffer
;
815 register int i
= m
->bytepos
;
818 error ("Marker does not point anywhere");
820 if (i
< BUF_BEG_BYTE (buf
) || i
> BUF_Z_BYTE (buf
))
826 DEFUN ("copy-marker", Fcopy_marker
, Scopy_marker
, 1, 2, 0,
827 doc
: /* Return a new marker pointing at the same place as MARKER.
828 If argument is a number, makes a new marker pointing
829 at that position in the current buffer.
830 The optional argument TYPE specifies the insertion type of the new marker;
831 see `marker-insertion-type'. */)
833 register Lisp_Object marker
, type
;
835 register Lisp_Object
new;
837 if (! (INTEGERP (marker
) || MARKERP (marker
)))
838 marker
= wrong_type_argument (Qinteger_or_marker_p
, marker
);
840 new = Fmake_marker ();
841 Fset_marker (new, marker
,
842 (MARKERP (marker
) ? Fmarker_buffer (marker
) : Qnil
));
843 XMARKER (new)->insertion_type
= !NILP (type
);
847 DEFUN ("marker-insertion-type", Fmarker_insertion_type
,
848 Smarker_insertion_type
, 1, 1, 0,
849 doc
: /* Return insertion type of MARKER: t if it stays after inserted text.
850 nil means the marker stays before text inserted there. */)
852 register Lisp_Object marker
;
854 CHECK_MARKER (marker
);
855 return XMARKER (marker
)->insertion_type
? Qt
: Qnil
;
858 DEFUN ("set-marker-insertion-type", Fset_marker_insertion_type
,
859 Sset_marker_insertion_type
, 2, 2, 0,
860 doc
: /* Set the insertion-type of MARKER to TYPE.
861 If TYPE is t, it means the marker advances when you insert text at it.
862 If TYPE is nil, it means the marker stays behind when you insert text at it. */)
864 Lisp_Object marker
, type
;
866 CHECK_MARKER (marker
);
868 XMARKER (marker
)->insertion_type
= ! NILP (type
);
872 DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at
, Sbuffer_has_markers_at
,
874 doc
: /* Return t if there are markers pointing at POSITION in the current buffer. */)
876 Lisp_Object position
;
878 register struct Lisp_Marker
*tail
;
881 charno
= XINT (position
);
888 for (tail
= BUF_MARKERS (current_buffer
); tail
; tail
= tail
->next
)
889 if (tail
->charpos
== charno
)
895 /* For debugging -- count the markers in buffer BUF. */
902 struct Lisp_Marker
*tail
;
904 for (tail
= BUF_MARKERS (buf
); tail
; tail
= tail
->next
)
913 defsubr (&Smarker_position
);
914 defsubr (&Smarker_buffer
);
915 defsubr (&Sset_marker
);
916 defsubr (&Scopy_marker
);
917 defsubr (&Smarker_insertion_type
);
918 defsubr (&Sset_marker_insertion_type
);
919 defsubr (&Sbuffer_has_markers_at
);
921 DEFVAR_BOOL ("byte-debug-flag", &byte_debug_flag
,
922 doc
: /* Non-nil enables debugging checks in byte/char position conversions. */);
926 /* arch-tag: 50aa418f-cdd0-4838-b64b-94aa4b2a3b74
927 (do not change this comment) */