diff options
| author | Dmitry Antipov | 2012-07-06 12:53:15 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2012-07-06 12:53:15 +0400 |
| commit | 4e57b342c5713d900b93ffde70cf7bb9150ca8fd (patch) | |
| tree | 329eb7416b283832e020da1735c5e03fb9c9a5c3 /src/marker.c | |
| parent | 5acf95603cccae8c1b91860d741a24e7a1387ef3 (diff) | |
| download | emacs-4e57b342c5713d900b93ffde70cf7bb9150ca8fd.tar.gz emacs-4e57b342c5713d900b93ffde70cf7bb9150ca8fd.zip | |
Avoid code repetition in marker-related functions.
* marker.c (attach_marker): New function.
(Fset_marker, set_marker_restricted, set_marker_both)
(set_marker_restricted_both): Use it.
(Fset_marker, set_marker_restricted, Fbuffer_has_markers_at):
Consistently rename charno to charpos.
(marker_position): Add eassert.
(marker_byte_position): Convert to eassert.
Diffstat (limited to 'src/marker.c')
| -rw-r--r-- | src/marker.c | 111 |
1 files changed, 39 insertions, 72 deletions
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 | |||
| 438 | static inline void | ||
| 439 | attach_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 | |||
| 436 | DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0, | 457 | DEFUN ("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. |
| 438 | BUFFER defaults to the current buffer. | 459 | BUFFER defaults to the current buffer. |
| @@ -441,7 +462,7 @@ Then it no longer slows down editing in any buffer. | |||
| 441 | Returns MARKER. */) | 462 | Returns 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. */) | |||
| 510 | Lisp_Object | 517 | Lisp_Object |
| 511 | set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer) | 518 | set_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 | ||
| 750 | DEFUN ("copy-marker", Fcopy_marker, Scopy_marker, 0, 2, 0, | 717 | DEFUN ("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; |