aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog14
-rw-r--r--src/marker.c111
2 files changed, 52 insertions, 73 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 72355fc682f..5e28882e6b3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,7 +1,19 @@
12012-07-06 Dmitry Antipov <dmantipov@yandex.ru> 12012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
2 2
3 Avoid code repetition in marker-related functions.
4 * marker.c (attach_marker): New function.
5 (Fset_marker, set_marker_restricted, set_marker_both)
6 (set_marker_restricted_both): Use it.
7 (Fset_marker, set_marker_restricted, Fbuffer_has_markers_at):
8 Consistently rename charno to charpos.
9 (marker_position): Add eassert.
10 (marker_byte_position): Convert to eassert.
11
122012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
13
14 Simplify list operations in unchain_overlay and unchain_marker.
3 * buffer.c (unchain_overlay): Simplify. Add comment. 15 * buffer.c (unchain_overlay): Simplify. Add comment.
4 * marker.c (unchain_marker): Simplify. Fix comments. 16 * marker.c (unchain_marker): Simplify. Fix comments.
5 17
62012-07-06 Dmitry Antipov <dmantipov@yandex.ru> 182012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
7 19
diff --git a/src/marker.c b/src/marker.c
index 0a1dd41b498..47a3e85e582 100644
--- a/src/marker.c
+++ b/src/marker.c
@@ -432,7 +432,28 @@ Returns nil if MARKER points nowhere. */)
432 432
433 return Qnil; 433 return Qnil;
434} 434}
435 435
436/* Change M so it points to B at CHARPOS and BYTEPOS. */
437
438static inline void
439attach_marker (struct Lisp_Marker *m, struct buffer *b,
440 ptrdiff_t charpos, ptrdiff_t bytepos)
441{
442 /* Every character is at least one byte. */
443 eassert (charpos <= bytepos);
444
445 m->charpos = charpos;
446 m->bytepos = bytepos;
447
448 if (m->buffer != b)
449 {
450 unchain_marker (m);
451 m->buffer = b;
452 m->next = BUF_MARKERS (b);
453 BUF_MARKERS (b) = m;
454 }
455}
456
436DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0, 457DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0,
437 doc: /* Position MARKER before character number POSITION in BUFFER. 458 doc: /* Position MARKER before character number POSITION in BUFFER.
438BUFFER defaults to the current buffer. 459BUFFER defaults to the current buffer.
@@ -441,7 +462,7 @@ Then it no longer slows down editing in any buffer.
441Returns MARKER. */) 462Returns MARKER. */)
442 (Lisp_Object marker, Lisp_Object position, Lisp_Object buffer) 463 (Lisp_Object marker, Lisp_Object position, Lisp_Object buffer)
443{ 464{
444 register ptrdiff_t charno; 465 register ptrdiff_t charpos;
445 register ptrdiff_t bytepos; 466 register ptrdiff_t bytepos;
446 register struct buffer *b; 467 register struct buffer *b;
447 register struct Lisp_Marker *m; 468 register struct Lisp_Marker *m;
@@ -483,24 +504,10 @@ Returns MARKER. */)
483 } 504 }
484 505
485 CHECK_NUMBER_COERCE_MARKER (position); 506 CHECK_NUMBER_COERCE_MARKER (position);
486 charno = clip_to_bounds (BUF_BEG (b), XINT (position), BUF_Z (b)); 507 charpos = clip_to_bounds (BUF_BEG (b), XINT (position), BUF_Z (b));
487 bytepos = buf_charpos_to_bytepos (b, charno); 508 bytepos = buf_charpos_to_bytepos (b, charpos);
488
489 /* Every character is at least one byte. */
490 if (charno > bytepos)
491 abort ();
492
493 m->bytepos = bytepos;
494 m->charpos = charno;
495
496 if (m->buffer != b)
497 {
498 unchain_marker (m);
499 m->buffer = b;
500 m->next = BUF_MARKERS (b);
501 BUF_MARKERS (b) = m;
502 }
503 509
510 attach_marker (m, b, charpos, bytepos);
504 return marker; 511 return marker;
505} 512}
506 513
@@ -510,7 +517,7 @@ Returns MARKER. */)
510Lisp_Object 517Lisp_Object
511set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer) 518set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer)
512{ 519{
513 register ptrdiff_t charno; 520 register ptrdiff_t charpos;
514 register ptrdiff_t bytepos; 521 register ptrdiff_t bytepos;
515 register struct buffer *b; 522 register struct buffer *b;
516 register struct Lisp_Marker *m; 523 register struct Lisp_Marker *m;
@@ -552,24 +559,10 @@ set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer)
552 } 559 }
553 560
554 CHECK_NUMBER_COERCE_MARKER (pos); 561 CHECK_NUMBER_COERCE_MARKER (pos);
555 charno = clip_to_bounds (BUF_BEGV (b), XINT (pos), BUF_ZV (b)); 562 charpos = clip_to_bounds (BUF_BEGV (b), XINT (pos), BUF_ZV (b));
556 bytepos = buf_charpos_to_bytepos (b, charno); 563 bytepos = buf_charpos_to_bytepos (b, charpos);
557
558 /* Every character is at least one byte. */
559 if (charno > bytepos)
560 abort ();
561
562 m->bytepos = bytepos;
563 m->charpos = charno;
564
565 if (m->buffer != b)
566 {
567 unchain_marker (m);
568 m->buffer = b;
569 m->next = BUF_MARKERS (b);
570 BUF_MARKERS (b) = m;
571 }
572 564
565 attach_marker (m, b, charpos, bytepos);
573 return marker; 566 return marker;
574} 567}
575 568
@@ -603,21 +596,8 @@ set_marker_both (Lisp_Object marker, Lisp_Object buffer, ptrdiff_t charpos, ptrd
603 if (BUF_Z (b) == BUF_Z_BYTE (b) 596 if (BUF_Z (b) == BUF_Z_BYTE (b)
604 && charpos != bytepos) 597 && charpos != bytepos)
605 abort (); 598 abort ();
606 /* Every character is at least one byte. */
607 if (charpos > bytepos)
608 abort ();
609
610 m->bytepos = bytepos;
611 m->charpos = charpos;
612
613 if (m->buffer != b)
614 {
615 unchain_marker (m);
616 m->buffer = b;
617 m->next = BUF_MARKERS (b);
618 BUF_MARKERS (b) = m;
619 }
620 599
600 attach_marker (m, b, charpos, bytepos);
621 return marker; 601 return marker;
622} 602}
623 603
@@ -654,21 +634,8 @@ set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer, ptrdiff_t ch
654 if (BUF_Z (b) == BUF_Z_BYTE (b) 634 if (BUF_Z (b) == BUF_Z_BYTE (b)
655 && charpos != bytepos) 635 && charpos != bytepos)
656 abort (); 636 abort ();
657 /* Every character is at least one byte. */
658 if (charpos > bytepos)
659 abort ();
660
661 m->bytepos = bytepos;
662 m->charpos = charpos;
663
664 if (m->buffer != b)
665 {
666 unchain_marker (m);
667 m->buffer = b;
668 m->next = BUF_MARKERS (b);
669 BUF_MARKERS (b) = m;
670 }
671 637
638 attach_marker (m, b, charpos, bytepos);
672 return marker; 639 return marker;
673} 640}
674 641
@@ -726,6 +693,8 @@ marker_position (Lisp_Object marker)
726 if (!buf) 693 if (!buf)
727 error ("Marker does not point anywhere"); 694 error ("Marker does not point anywhere");
728 695
696 eassert (BUF_BEG (buf) <= m->charpos && m->charpos <= BUF_Z (buf));
697
729 return m->charpos; 698 return m->charpos;
730} 699}
731 700
@@ -736,15 +705,13 @@ marker_byte_position (Lisp_Object marker)
736{ 705{
737 register struct Lisp_Marker *m = XMARKER (marker); 706 register struct Lisp_Marker *m = XMARKER (marker);
738 register struct buffer *buf = m->buffer; 707 register struct buffer *buf = m->buffer;
739 register ptrdiff_t i = m->bytepos;
740 708
741 if (!buf) 709 if (!buf)
742 error ("Marker does not point anywhere"); 710 error ("Marker does not point anywhere");
743 711
744 if (i < BUF_BEG_BYTE (buf) || i > BUF_Z_BYTE (buf)) 712 eassert (BUF_BEG_BYTE (buf) <= m->bytepos && m->bytepos <= BUF_Z_BYTE (buf));
745 abort ();
746 713
747 return i; 714 return m->bytepos;
748} 715}
749 716
750DEFUN ("copy-marker", Fcopy_marker, Scopy_marker, 0, 2, 0, 717DEFUN ("copy-marker", Fcopy_marker, Scopy_marker, 0, 2, 0,
@@ -797,12 +764,12 @@ DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, Sbuffer_has_markers_at,
797 (Lisp_Object position) 764 (Lisp_Object position)
798{ 765{
799 register struct Lisp_Marker *tail; 766 register struct Lisp_Marker *tail;
800 register ptrdiff_t charno; 767 register ptrdiff_t charpos;
801 768
802 charno = clip_to_bounds (BEG, XINT (position), Z); 769 charpos = clip_to_bounds (BEG, XINT (position), Z);
803 770
804 for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next) 771 for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next)
805 if (tail->charpos == charno) 772 if (tail->charpos == charpos)
806 return Qt; 773 return Qt;
807 774
808 return Qnil; 775 return Qnil;