* lisp/comint.el: Use with-silent-modifications.
[emacs.git] / src / marker.c
blob63027d3be5ed304d95392c77b5b183b8c64dccf4
1 /* Markers: examining, setting and deleting.
2 Copyright (C) 1985, 1997-1998, 2001-2013 Free Software Foundation,
3 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 3 of the License, or
10 (at your option) any later version.
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. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
23 #include "lisp.h"
24 #include "character.h"
25 #include "buffer.h"
27 /* Record one cached position found recently by
28 buf_charpos_to_bytepos or buf_bytepos_to_charpos. */
30 static ptrdiff_t cached_charpos;
31 static ptrdiff_t cached_bytepos;
32 static struct buffer *cached_buffer;
33 static EMACS_INT cached_modiff;
35 /* Juanma Barranquero <lekktu@gmail.com> reported ~3x increased
36 bootstrap time when byte_char_debug_check is enabled; so this
37 is never turned on by --enable-checking configure option. */
39 #ifdef MARKER_DEBUG
41 extern int count_markers (struct buffer *) EXTERNALLY_VISIBLE;
42 extern ptrdiff_t verify_bytepos (ptrdiff_t charpos) EXTERNALLY_VISIBLE;
44 static void
45 byte_char_debug_check (struct buffer *b, ptrdiff_t charpos, ptrdiff_t bytepos)
47 ptrdiff_t nchars;
49 if (NILP (BVAR (b, enable_multibyte_characters)))
50 return;
52 if (bytepos > BUF_GPT_BYTE (b))
53 nchars
54 = multibyte_chars_in_text (BUF_BEG_ADDR (b),
55 BUF_GPT_BYTE (b) - BUF_BEG_BYTE (b))
56 + multibyte_chars_in_text (BUF_GAP_END_ADDR (b),
57 bytepos - BUF_GPT_BYTE (b));
58 else
59 nchars = multibyte_chars_in_text (BUF_BEG_ADDR (b),
60 bytepos - BUF_BEG_BYTE (b));
62 if (charpos - 1 != nchars)
63 emacs_abort ();
66 #else /* not MARKER_DEBUG */
68 #define byte_char_debug_check(b, charpos, bytepos) do { } while (0)
70 #endif /* MARKER_DEBUG */
72 void
73 clear_charpos_cache (struct buffer *b)
75 if (cached_buffer == b)
76 cached_buffer = 0;
79 /* Converting between character positions and byte positions. */
81 /* There are several places in the buffer where we know
82 the correspondence: BEG, BEGV, PT, GPT, ZV and Z,
83 and everywhere there is a marker. So we find the one of these places
84 that is closest to the specified position, and scan from there. */
86 /* This macro is a subroutine of buf_charpos_to_bytepos.
87 Note that it is desirable that BYTEPOS is not evaluated
88 except when we really want its value. */
90 #define CONSIDER(CHARPOS, BYTEPOS) \
91 { \
92 ptrdiff_t this_charpos = (CHARPOS); \
93 bool changed = 0; \
95 if (this_charpos == charpos) \
96 { \
97 ptrdiff_t value = (BYTEPOS); \
99 byte_char_debug_check (b, charpos, value); \
100 return value; \
102 else if (this_charpos > charpos) \
104 if (this_charpos < best_above) \
106 best_above = this_charpos; \
107 best_above_byte = (BYTEPOS); \
108 changed = 1; \
111 else if (this_charpos > best_below) \
113 best_below = this_charpos; \
114 best_below_byte = (BYTEPOS); \
115 changed = 1; \
118 if (changed) \
120 if (best_above - best_below == best_above_byte - best_below_byte) \
122 ptrdiff_t value = best_below_byte + (charpos - best_below); \
124 byte_char_debug_check (b, charpos, value); \
125 return value; \
130 /* Return the byte position corresponding to CHARPOS in B. */
132 ptrdiff_t
133 buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
135 struct Lisp_Marker *tail;
136 ptrdiff_t best_above, best_above_byte;
137 ptrdiff_t best_below, best_below_byte;
139 eassert (BUF_BEG (b) <= charpos && charpos <= BUF_Z (b));
141 best_above = BUF_Z (b);
142 best_above_byte = BUF_Z_BYTE (b);
144 /* If this buffer has as many characters as bytes,
145 each character must be one byte.
146 This takes care of the case where enable-multibyte-characters is nil. */
147 if (best_above == best_above_byte)
148 return charpos;
150 best_below = BEG;
151 best_below_byte = BEG_BYTE;
153 /* We find in best_above and best_above_byte
154 the closest known point above CHARPOS,
155 and in best_below and best_below_byte
156 the closest known point below CHARPOS,
158 If at any point we can tell that the space between those
159 two best approximations is all single-byte,
160 we interpolate the result immediately. */
162 CONSIDER (BUF_PT (b), BUF_PT_BYTE (b));
163 CONSIDER (BUF_GPT (b), BUF_GPT_BYTE (b));
164 CONSIDER (BUF_BEGV (b), BUF_BEGV_BYTE (b));
165 CONSIDER (BUF_ZV (b), BUF_ZV_BYTE (b));
167 if (b == cached_buffer && BUF_MODIFF (b) == cached_modiff)
168 CONSIDER (cached_charpos, cached_bytepos);
170 for (tail = BUF_MARKERS (b); tail; tail = tail->next)
172 CONSIDER (tail->charpos, tail->bytepos);
174 /* If we are down to a range of 50 chars,
175 don't bother checking any other markers;
176 scan the intervening chars directly now. */
177 if (best_above - best_below < 50)
178 break;
181 /* We get here if we did not exactly hit one of the known places.
182 We have one known above and one known below.
183 Scan, counting characters, from whichever one is closer. */
185 if (charpos - best_below < best_above - charpos)
187 bool record = charpos - best_below > 5000;
189 while (best_below != charpos)
191 best_below++;
192 BUF_INC_POS (b, best_below_byte);
195 /* If this position is quite far from the nearest known position,
196 cache the correspondence by creating a marker here.
197 It will last until the next GC. */
198 if (record)
199 build_marker (b, best_below, best_below_byte);
201 byte_char_debug_check (b, best_below, best_below_byte);
203 cached_buffer = b;
204 cached_modiff = BUF_MODIFF (b);
205 cached_charpos = best_below;
206 cached_bytepos = best_below_byte;
208 return best_below_byte;
210 else
212 bool record = best_above - charpos > 5000;
214 while (best_above != charpos)
216 best_above--;
217 BUF_DEC_POS (b, best_above_byte);
220 /* If this position is quite far from the nearest known position,
221 cache the correspondence by creating a marker here.
222 It will last until the next GC. */
223 if (record)
224 build_marker (b, best_above, best_above_byte);
226 byte_char_debug_check (b, best_above, best_above_byte);
228 cached_buffer = b;
229 cached_modiff = BUF_MODIFF (b);
230 cached_charpos = best_above;
231 cached_bytepos = best_above_byte;
233 return best_above_byte;
237 #undef CONSIDER
239 /* This macro is a subroutine of buf_bytepos_to_charpos.
240 It is used when BYTEPOS is actually the byte position. */
242 #define CONSIDER(BYTEPOS, CHARPOS) \
244 ptrdiff_t this_bytepos = (BYTEPOS); \
245 int changed = 0; \
247 if (this_bytepos == bytepos) \
249 ptrdiff_t value = (CHARPOS); \
251 byte_char_debug_check (b, value, bytepos); \
252 return value; \
254 else if (this_bytepos > bytepos) \
256 if (this_bytepos < best_above_byte) \
258 best_above = (CHARPOS); \
259 best_above_byte = this_bytepos; \
260 changed = 1; \
263 else if (this_bytepos > best_below_byte) \
265 best_below = (CHARPOS); \
266 best_below_byte = this_bytepos; \
267 changed = 1; \
270 if (changed) \
272 if (best_above - best_below == best_above_byte - best_below_byte) \
274 ptrdiff_t value = best_below + (bytepos - best_below_byte); \
276 byte_char_debug_check (b, value, bytepos); \
277 return value; \
282 /* Return the character position corresponding to BYTEPOS in B. */
284 ptrdiff_t
285 buf_bytepos_to_charpos (struct buffer *b, ptrdiff_t bytepos)
287 struct Lisp_Marker *tail;
288 ptrdiff_t best_above, best_above_byte;
289 ptrdiff_t best_below, best_below_byte;
291 eassert (BUF_BEG_BYTE (b) <= bytepos && bytepos <= BUF_Z_BYTE (b));
293 best_above = BUF_Z (b);
294 best_above_byte = BUF_Z_BYTE (b);
296 /* If this buffer has as many characters as bytes,
297 each character must be one byte.
298 This takes care of the case where enable-multibyte-characters is nil. */
299 if (best_above == best_above_byte)
300 return bytepos;
302 best_below = BEG;
303 best_below_byte = BEG_BYTE;
305 CONSIDER (BUF_PT_BYTE (b), BUF_PT (b));
306 CONSIDER (BUF_GPT_BYTE (b), BUF_GPT (b));
307 CONSIDER (BUF_BEGV_BYTE (b), BUF_BEGV (b));
308 CONSIDER (BUF_ZV_BYTE (b), BUF_ZV (b));
310 if (b == cached_buffer && BUF_MODIFF (b) == cached_modiff)
311 CONSIDER (cached_bytepos, cached_charpos);
313 for (tail = BUF_MARKERS (b); tail; tail = tail->next)
315 CONSIDER (tail->bytepos, tail->charpos);
317 /* If we are down to a range of 50 chars,
318 don't bother checking any other markers;
319 scan the intervening chars directly now. */
320 if (best_above - best_below < 50)
321 break;
324 /* We get here if we did not exactly hit one of the known places.
325 We have one known above and one known below.
326 Scan, counting characters, from whichever one is closer. */
328 if (bytepos - best_below_byte < best_above_byte - bytepos)
330 bool record = bytepos - best_below_byte > 5000;
332 while (best_below_byte < bytepos)
334 best_below++;
335 BUF_INC_POS (b, best_below_byte);
338 /* If this position is quite far from the nearest known position,
339 cache the correspondence by creating a marker here.
340 It will last until the next GC.
341 But don't do it if BUF_MARKERS is nil;
342 that is a signal from Fset_buffer_multibyte. */
343 if (record && BUF_MARKERS (b))
344 build_marker (b, best_below, best_below_byte);
346 byte_char_debug_check (b, best_below, best_below_byte);
348 cached_buffer = b;
349 cached_modiff = BUF_MODIFF (b);
350 cached_charpos = best_below;
351 cached_bytepos = best_below_byte;
353 return best_below;
355 else
357 bool record = best_above_byte - bytepos > 5000;
359 while (best_above_byte > bytepos)
361 best_above--;
362 BUF_DEC_POS (b, best_above_byte);
365 /* If this position is quite far from the nearest known position,
366 cache the correspondence by creating a marker here.
367 It will last until the next GC.
368 But don't do it if BUF_MARKERS is nil;
369 that is a signal from Fset_buffer_multibyte. */
370 if (record && BUF_MARKERS (b))
371 build_marker (b, best_above, best_above_byte);
373 byte_char_debug_check (b, best_above, best_above_byte);
375 cached_buffer = b;
376 cached_modiff = BUF_MODIFF (b);
377 cached_charpos = best_above;
378 cached_bytepos = best_above_byte;
380 return best_above;
384 #undef CONSIDER
386 /* Operations on markers. */
388 DEFUN ("marker-buffer", Fmarker_buffer, Smarker_buffer, 1, 1, 0,
389 doc: /* Return the buffer that MARKER points into, or nil if none.
390 Returns nil if MARKER points into a dead buffer. */)
391 (register Lisp_Object marker)
393 register Lisp_Object buf;
394 CHECK_MARKER (marker);
395 if (XMARKER (marker)->buffer)
397 XSETBUFFER (buf, XMARKER (marker)->buffer);
398 /* If the buffer is dead, we're in trouble: the buffer pointer here
399 does not preserve the buffer from being GC'd (it's weak), so
400 markers have to be unlinked from their buffer as soon as the buffer
401 is killed. */
402 eassert (BUFFER_LIVE_P (XBUFFER (buf)));
403 return buf;
405 return Qnil;
408 DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0,
409 doc: /* Return the position MARKER points at, as a character number.
410 Returns nil if MARKER points nowhere. */)
411 (Lisp_Object marker)
413 CHECK_MARKER (marker);
414 if (XMARKER (marker)->buffer)
415 return make_number (XMARKER (marker)->charpos);
417 return Qnil;
420 /* Change M so it points to B at CHARPOS and BYTEPOS. */
422 static void
423 attach_marker (struct Lisp_Marker *m, struct buffer *b,
424 ptrdiff_t charpos, ptrdiff_t bytepos)
426 /* In a single-byte buffer, two positions must be equal.
427 Otherwise, every character is at least one byte. */
428 if (BUF_Z (b) == BUF_Z_BYTE (b))
429 eassert (charpos == bytepos);
430 else
431 eassert (charpos <= bytepos);
433 m->charpos = charpos;
434 m->bytepos = bytepos;
436 if (m->buffer != b)
438 unchain_marker (m);
439 m->buffer = b;
440 m->next = BUF_MARKERS (b);
441 BUF_MARKERS (b) = m;
445 /* If BUFFER is nil, return current buffer pointer. Next, check
446 whether BUFFER is a buffer object and return buffer pointer
447 corresponding to BUFFER if BUFFER is live, or NULL otherwise. */
449 static struct buffer *
450 live_buffer (Lisp_Object buffer)
452 struct buffer *b;
454 if (NILP (buffer))
456 b = current_buffer;
457 eassert (BUFFER_LIVE_P (b));
459 else
461 CHECK_BUFFER (buffer);
462 b = XBUFFER (buffer);
463 if (!BUFFER_LIVE_P (b))
464 b = NULL;
466 return b;
469 /* Internal function to set MARKER in BUFFER at POSITION. Non-zero
470 RESTRICTED means limit the POSITION by the visible part of BUFFER. */
472 static Lisp_Object
473 set_marker_internal (Lisp_Object marker, Lisp_Object position,
474 Lisp_Object buffer, bool restricted)
476 struct Lisp_Marker *m;
477 struct buffer *b = live_buffer (buffer);
479 CHECK_MARKER (marker);
480 m = XMARKER (marker);
482 /* Set MARKER to point nowhere if BUFFER is dead, or
483 POSITION is nil or a marker points to nowhere. */
484 if (NILP (position)
485 || (MARKERP (position) && !XMARKER (position)->buffer)
486 || !b)
487 unchain_marker (m);
489 /* Optimize the special case where we are copying the position of
490 an existing marker, and MARKER is already in the same buffer. */
491 else if (MARKERP (position) && b == XMARKER (position)->buffer
492 && b == m->buffer)
494 m->bytepos = XMARKER (position)->bytepos;
495 m->charpos = XMARKER (position)->charpos;
498 else
500 register ptrdiff_t charpos, bytepos;
502 /* Do not use CHECK_NUMBER_COERCE_MARKER because we
503 don't want to call buf_charpos_to_bytepos if POSITION
504 is a marker and so we know the bytepos already. */
505 if (INTEGERP (position))
506 charpos = XINT (position), bytepos = -1;
507 else if (MARKERP (position))
509 charpos = XMARKER (position)->charpos;
510 bytepos = XMARKER (position)->bytepos;
512 else
513 wrong_type_argument (Qinteger_or_marker_p, position);
515 charpos = clip_to_bounds
516 (restricted ? BUF_BEGV (b) : BUF_BEG (b), charpos,
517 restricted ? BUF_ZV (b) : BUF_Z (b));
518 if (bytepos == -1)
519 bytepos = buf_charpos_to_bytepos (b, charpos);
520 else
521 bytepos = clip_to_bounds
522 (restricted ? BUF_BEGV_BYTE (b) : BUF_BEG_BYTE (b),
523 bytepos, restricted ? BUF_ZV_BYTE (b) : BUF_Z_BYTE (b));
525 attach_marker (m, b, charpos, bytepos);
527 return marker;
530 DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0,
531 doc: /* Position MARKER before character number POSITION in BUFFER,
532 which defaults to the current buffer. If POSITION is nil,
533 makes marker point nowhere so it no longer slows down
534 editing in any buffer. Returns MARKER. */)
535 (Lisp_Object marker, Lisp_Object position, Lisp_Object buffer)
537 return set_marker_internal (marker, position, buffer, 0);
540 /* Like the above, but won't let the position be outside the visible part. */
542 Lisp_Object
543 set_marker_restricted (Lisp_Object marker, Lisp_Object position,
544 Lisp_Object buffer)
546 return set_marker_internal (marker, position, buffer, 1);
549 /* Set the position of MARKER, specifying both the
550 character position and the corresponding byte position. */
552 Lisp_Object
553 set_marker_both (Lisp_Object marker, Lisp_Object buffer,
554 ptrdiff_t charpos, ptrdiff_t bytepos)
556 register struct Lisp_Marker *m;
557 register struct buffer *b = live_buffer (buffer);
559 CHECK_MARKER (marker);
560 m = XMARKER (marker);
562 if (b)
563 attach_marker (m, b, charpos, bytepos);
564 else
565 unchain_marker (m);
566 return marker;
569 /* Like the above, but won't let the position be outside the visible part. */
571 Lisp_Object
572 set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer,
573 ptrdiff_t charpos, ptrdiff_t bytepos)
575 register struct Lisp_Marker *m;
576 register struct buffer *b = live_buffer (buffer);
578 CHECK_MARKER (marker);
579 m = XMARKER (marker);
581 if (b)
583 attach_marker
584 (m, b,
585 clip_to_bounds (BUF_BEGV (b), charpos, BUF_ZV (b)),
586 clip_to_bounds (BUF_BEGV_BYTE (b), bytepos, BUF_ZV_BYTE (b)));
588 else
589 unchain_marker (m);
590 return marker;
593 /* Remove MARKER from the chain of whatever buffer it is in,
594 leaving it points to nowhere. This is called during garbage
595 collection, so we must be careful to ignore and preserve
596 mark bits, including those in chain fields of markers. */
598 void
599 unchain_marker (register struct Lisp_Marker *marker)
601 register struct buffer *b = marker->buffer;
603 if (b)
605 register struct Lisp_Marker *tail, **prev;
607 /* No dead buffers here. */
608 eassert (BUFFER_LIVE_P (b));
610 marker->buffer = NULL;
611 prev = &BUF_MARKERS (b);
613 for (tail = BUF_MARKERS (b); tail; prev = &tail->next, tail = *prev)
614 if (marker == tail)
616 if (*prev == BUF_MARKERS (b))
618 /* Deleting first marker from the buffer's chain. Crash
619 if new first marker in chain does not say it belongs
620 to the same buffer, or at least that they have the same
621 base buffer. */
622 if (tail->next && b->text != tail->next->buffer->text)
623 emacs_abort ();
625 *prev = tail->next;
626 /* We have removed the marker from the chain;
627 no need to scan the rest of the chain. */
628 break;
631 /* Error if marker was not in it's chain. */
632 eassert (tail != NULL);
636 /* Return the char position of marker MARKER, as a C integer. */
638 ptrdiff_t
639 marker_position (Lisp_Object marker)
641 register struct Lisp_Marker *m = XMARKER (marker);
642 register struct buffer *buf = m->buffer;
644 if (!buf)
645 error ("Marker does not point anywhere");
647 eassert (BUF_BEG (buf) <= m->charpos && m->charpos <= BUF_Z (buf));
649 return m->charpos;
652 /* Return the byte position of marker MARKER, as a C integer. */
654 ptrdiff_t
655 marker_byte_position (Lisp_Object marker)
657 register struct Lisp_Marker *m = XMARKER (marker);
658 register struct buffer *buf = m->buffer;
660 if (!buf)
661 error ("Marker does not point anywhere");
663 eassert (BUF_BEG_BYTE (buf) <= m->bytepos && m->bytepos <= BUF_Z_BYTE (buf));
665 return m->bytepos;
668 DEFUN ("copy-marker", Fcopy_marker, Scopy_marker, 0, 2, 0,
669 doc: /* Return a new marker pointing at the same place as MARKER.
670 If argument is a number, makes a new marker pointing
671 at that position in the current buffer.
672 If MARKER is not specified, the new marker does not point anywhere.
673 The optional argument TYPE specifies the insertion type of the new marker;
674 see `marker-insertion-type'. */)
675 (register Lisp_Object marker, Lisp_Object type)
677 register Lisp_Object new;
679 if (!NILP (marker))
680 CHECK_TYPE (INTEGERP (marker) || MARKERP (marker), Qinteger_or_marker_p, marker);
682 new = Fmake_marker ();
683 Fset_marker (new, marker,
684 (MARKERP (marker) ? Fmarker_buffer (marker) : Qnil));
685 XMARKER (new)->insertion_type = !NILP (type);
686 return new;
689 DEFUN ("marker-insertion-type", Fmarker_insertion_type,
690 Smarker_insertion_type, 1, 1, 0,
691 doc: /* Return insertion type of MARKER: t if it stays after inserted text.
692 The value nil means the marker stays before text inserted there. */)
693 (register Lisp_Object marker)
695 CHECK_MARKER (marker);
696 return XMARKER (marker)->insertion_type ? Qt : Qnil;
699 DEFUN ("set-marker-insertion-type", Fset_marker_insertion_type,
700 Sset_marker_insertion_type, 2, 2, 0,
701 doc: /* Set the insertion-type of MARKER to TYPE.
702 If TYPE is t, it means the marker advances when you insert text at it.
703 If TYPE is nil, it means the marker stays behind when you insert text at it. */)
704 (Lisp_Object marker, Lisp_Object type)
706 CHECK_MARKER (marker);
708 XMARKER (marker)->insertion_type = ! NILP (type);
709 return type;
712 DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, Sbuffer_has_markers_at,
713 1, 1, 0,
714 doc: /* Return t if there are markers pointing at POSITION in the current buffer. */)
715 (Lisp_Object position)
717 register struct Lisp_Marker *tail;
718 register ptrdiff_t charpos;
720 charpos = clip_to_bounds (BEG, XINT (position), Z);
722 for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next)
723 if (tail->charpos == charpos)
724 return Qt;
726 return Qnil;
729 #ifdef MARKER_DEBUG
731 /* For debugging -- count the markers in buffer BUF. */
734 count_markers (struct buffer *buf)
736 int total = 0;
737 struct Lisp_Marker *tail;
739 for (tail = BUF_MARKERS (buf); tail; tail = tail->next)
740 total++;
742 return total;
745 /* For debugging -- recompute the bytepos corresponding
746 to CHARPOS in the simplest, most reliable way. */
748 ptrdiff_t
749 verify_bytepos (ptrdiff_t charpos)
751 ptrdiff_t below = 1;
752 ptrdiff_t below_byte = 1;
754 while (below != charpos)
756 below++;
757 BUF_INC_POS (current_buffer, below_byte);
760 return below_byte;
763 #endif /* MARKER_DEBUG */
765 void
766 syms_of_marker (void)
768 defsubr (&Smarker_position);
769 defsubr (&Smarker_buffer);
770 defsubr (&Sset_marker);
771 defsubr (&Scopy_marker);
772 defsubr (&Smarker_insertion_type);
773 defsubr (&Sset_marker_insertion_type);
774 defsubr (&Sbuffer_has_markers_at);