diff options
| author | Chong Yidong | 2011-03-19 12:42:53 -0400 |
|---|---|---|
| committer | Chong Yidong | 2011-03-19 12:42:53 -0400 |
| commit | 20f5695598d3137257e24802479d003ea82eb5f9 (patch) | |
| tree | dbd65b250aa1d524b0a0864bfda2e99465a0c9a4 /src | |
| parent | 576bce32675146e772183647c4750c1f5f9b7de7 (diff) | |
| download | emacs-20f5695598d3137257e24802479d003ea82eb5f9.tar.gz emacs-20f5695598d3137257e24802479d003ea82eb5f9.zip | |
Backport fix for Bug#8219 from trunk.
* buffer.h (BUF_BEGV, BUF_BEGV_BYTE, BUF_ZV, BUF_ZV_BYTE, BUF_PT)
(BUF_PT_BYTE): Rewrite to handle indirect buffers (Bug#8219).
These macros can no longer be used for assignment.
* buffer.c (Fget_buffer_create, Fmake_indirect_buffer): Assign
struct members directly, instead of using BUF_BEGV etc.
(record_buffer_markers, fetch_buffer_markers): New functions for
recording and fetching special buffer markers.
(set_buffer_internal_1, set_buffer_temp): Use them.
* lread.c (unreadchar): Use SET_BUF_PT_BOTH.
* insdel.c (adjust_point): Use SET_BUF_PT_BOTH.
* intervals.c (temp_set_point_both): Use SET_BUF_PT_BOTH.
(get_local_map): Use SET_BUF_BEGV_BOTH and SET_BUF_ZV_BOTH.
* xdisp.c (hscroll_window_tree):
(reconsider_clip_changes): Use PT instead of BUF_PT.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 22 | ||||
| -rw-r--r-- | src/buffer.c | 187 | ||||
| -rw-r--r-- | src/buffer.h | 42 | ||||
| -rw-r--r-- | src/insdel.c | 4 | ||||
| -rw-r--r-- | src/intervals.c | 16 | ||||
| -rw-r--r-- | src/lread.c | 6 | ||||
| -rw-r--r-- | src/xdisp.c | 4 |
7 files changed, 148 insertions, 133 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 49b37a843b6..be81dd27584 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,25 @@ | |||
| 1 | 2011-03-19 Chong Yidong <cyd@stupidchicken.com> | ||
| 2 | |||
| 3 | * buffer.h (BUF_BEGV, BUF_BEGV_BYTE, BUF_ZV, BUF_ZV_BYTE, BUF_PT) | ||
| 4 | (BUF_PT_BYTE): Rewrite to handle indirect buffers (Bug#8219). | ||
| 5 | These macros can no longer be used for assignment. | ||
| 6 | |||
| 7 | * buffer.c (Fget_buffer_create, Fmake_indirect_buffer): Assign | ||
| 8 | struct members directly, instead of using BUF_BEGV etc. | ||
| 9 | (record_buffer_markers, fetch_buffer_markers): New functions for | ||
| 10 | recording and fetching special buffer markers. | ||
| 11 | (set_buffer_internal_1, set_buffer_temp): Use them. | ||
| 12 | |||
| 13 | * lread.c (unreadchar): Use SET_BUF_PT_BOTH. | ||
| 14 | |||
| 15 | * insdel.c (adjust_point): Use SET_BUF_PT_BOTH. | ||
| 16 | |||
| 17 | * intervals.c (temp_set_point_both): Use SET_BUF_PT_BOTH. | ||
| 18 | (get_local_map): Use SET_BUF_BEGV_BOTH and SET_BUF_ZV_BOTH. | ||
| 19 | |||
| 20 | * xdisp.c (hscroll_window_tree): | ||
| 21 | (reconsider_clip_changes): Use PT instead of BUF_PT. | ||
| 22 | |||
| 1 | 2011-03-17 Juanma Barranquero <lekktu@gmail.com> | 23 | 2011-03-17 Juanma Barranquero <lekktu@gmail.com> |
| 2 | 24 | ||
| 3 | * xfaces.c (Fx_load_color_file): | 25 | * xfaces.c (Fx_load_color_file): |
diff --git a/src/buffer.c b/src/buffer.c index 9220527313d..e7759cb5255 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -371,15 +371,17 @@ even if it is dead. The return value is never nil. */) | |||
| 371 | if (! BUF_BEG_ADDR (b)) | 371 | if (! BUF_BEG_ADDR (b)) |
| 372 | buffer_memory_full (); | 372 | buffer_memory_full (); |
| 373 | 373 | ||
| 374 | BUF_PT (b) = BEG; | 374 | b->pt = BEG; |
| 375 | b->begv = BEG; | ||
| 376 | b->zv = BEG; | ||
| 377 | b->pt_byte = BEG_BYTE; | ||
| 378 | b->begv_byte = BEG_BYTE; | ||
| 379 | b->zv_byte = BEG_BYTE; | ||
| 380 | |||
| 375 | BUF_GPT (b) = BEG; | 381 | BUF_GPT (b) = BEG; |
| 376 | BUF_BEGV (b) = BEG; | ||
| 377 | BUF_ZV (b) = BEG; | ||
| 378 | BUF_Z (b) = BEG; | ||
| 379 | BUF_PT_BYTE (b) = BEG_BYTE; | ||
| 380 | BUF_GPT_BYTE (b) = BEG_BYTE; | 382 | BUF_GPT_BYTE (b) = BEG_BYTE; |
| 381 | BUF_BEGV_BYTE (b) = BEG_BYTE; | 383 | |
| 382 | BUF_ZV_BYTE (b) = BEG_BYTE; | 384 | BUF_Z (b) = BEG; |
| 383 | BUF_Z_BYTE (b) = BEG_BYTE; | 385 | BUF_Z_BYTE (b) = BEG_BYTE; |
| 384 | BUF_MODIFF (b) = 1; | 386 | BUF_MODIFF (b) = 1; |
| 385 | BUF_CHARS_MODIFF (b) = 1; | 387 | BUF_CHARS_MODIFF (b) = 1; |
| @@ -533,6 +535,53 @@ clone_per_buffer_values (from, to) | |||
| 533 | to->local_var_alist = buffer_lisp_local_variables (from); | 535 | to->local_var_alist = buffer_lisp_local_variables (from); |
| 534 | } | 536 | } |
| 535 | 537 | ||
| 538 | |||
| 539 | /* If buffer B has markers to record PT, BEGV and ZV when it is not | ||
| 540 | current, update these markers. */ | ||
| 541 | |||
| 542 | static void | ||
| 543 | record_buffer_markers (struct buffer *b) | ||
| 544 | { | ||
| 545 | if (! NILP (b->pt_marker)) | ||
| 546 | { | ||
| 547 | Lisp_Object buffer; | ||
| 548 | |||
| 549 | eassert (!NILP (b->begv_marker)); | ||
| 550 | eassert (!NILP (b->zv_marker)); | ||
| 551 | |||
| 552 | XSETBUFFER (buffer, b); | ||
| 553 | set_marker_both (b->pt_marker, buffer, b->pt, b->pt_byte); | ||
| 554 | set_marker_both (b->begv_marker, buffer, b->begv, b->begv_byte); | ||
| 555 | set_marker_both (b->zv_marker, buffer, b->zv, b->zv_byte); | ||
| 556 | } | ||
| 557 | } | ||
| 558 | |||
| 559 | |||
| 560 | /* If buffer B has markers to record PT, BEGV and ZV when it is not | ||
| 561 | current, fetch these values into B->begv etc. */ | ||
| 562 | |||
| 563 | static void | ||
| 564 | fetch_buffer_markers (struct buffer *b) | ||
| 565 | { | ||
| 566 | if (! NILP (b->pt_marker)) | ||
| 567 | { | ||
| 568 | Lisp_Object m; | ||
| 569 | |||
| 570 | eassert (!NILP (b->begv_marker)); | ||
| 571 | eassert (!NILP (b->zv_marker)); | ||
| 572 | |||
| 573 | m = b->pt_marker; | ||
| 574 | SET_BUF_PT_BOTH (b, marker_position (m), marker_byte_position (m)); | ||
| 575 | |||
| 576 | m = b->begv_marker; | ||
| 577 | SET_BUF_BEGV_BOTH (b, marker_position (m), marker_byte_position (m)); | ||
| 578 | |||
| 579 | m = b->zv_marker; | ||
| 580 | SET_BUF_ZV_BOTH (b, marker_position (m), marker_byte_position (m)); | ||
| 581 | } | ||
| 582 | } | ||
| 583 | |||
| 584 | |||
| 536 | DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, | 585 | DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, |
| 537 | 2, 3, | 586 | 2, 3, |
| 538 | "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", | 587 | "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", |
| @@ -572,12 +621,12 @@ CLONE nil means the indirect buffer's state is reset to default values. */) | |||
| 572 | /* Use the base buffer's text object. */ | 621 | /* Use the base buffer's text object. */ |
| 573 | b->text = b->base_buffer->text; | 622 | b->text = b->base_buffer->text; |
| 574 | 623 | ||
| 575 | BUF_BEGV (b) = BUF_BEGV (b->base_buffer); | 624 | b->pt = b->base_buffer->pt; |
| 576 | BUF_ZV (b) = BUF_ZV (b->base_buffer); | 625 | b->begv = b->base_buffer->begv; |
| 577 | BUF_PT (b) = BUF_PT (b->base_buffer); | 626 | b->zv = b->base_buffer->zv; |
| 578 | BUF_BEGV_BYTE (b) = BUF_BEGV_BYTE (b->base_buffer); | 627 | b->pt_byte = b->base_buffer->pt_byte; |
| 579 | BUF_ZV_BYTE (b) = BUF_ZV_BYTE (b->base_buffer); | 628 | b->begv_byte = b->base_buffer->begv_byte; |
| 580 | BUF_PT_BYTE (b) = BUF_PT_BYTE (b->base_buffer); | 629 | b->zv_byte = b->base_buffer->zv_byte; |
| 581 | 630 | ||
| 582 | b->newline_cache = 0; | 631 | b->newline_cache = 0; |
| 583 | b->width_run_cache = 0; | 632 | b->width_run_cache = 0; |
| @@ -607,24 +656,23 @@ CLONE nil means the indirect buffer's state is reset to default values. */) | |||
| 607 | /* Make sure the base buffer has markers for its narrowing. */ | 656 | /* Make sure the base buffer has markers for its narrowing. */ |
| 608 | if (NILP (b->base_buffer->pt_marker)) | 657 | if (NILP (b->base_buffer->pt_marker)) |
| 609 | { | 658 | { |
| 659 | eassert (NILP (b->base_buffer->begv_marker)); | ||
| 660 | eassert (NILP (b->base_buffer->zv_marker)); | ||
| 661 | |||
| 610 | b->base_buffer->pt_marker = Fmake_marker (); | 662 | b->base_buffer->pt_marker = Fmake_marker (); |
| 611 | set_marker_both (b->base_buffer->pt_marker, base_buffer, | 663 | set_marker_both (b->base_buffer->pt_marker, base_buffer, |
| 612 | BUF_PT (b->base_buffer), | 664 | b->base_buffer->pt, |
| 613 | BUF_PT_BYTE (b->base_buffer)); | 665 | b->base_buffer->pt_byte); |
| 614 | } | 666 | |
| 615 | if (NILP (b->base_buffer->begv_marker)) | ||
| 616 | { | ||
| 617 | b->base_buffer->begv_marker = Fmake_marker (); | 667 | b->base_buffer->begv_marker = Fmake_marker (); |
| 618 | set_marker_both (b->base_buffer->begv_marker, base_buffer, | 668 | set_marker_both (b->base_buffer->begv_marker, base_buffer, |
| 619 | BUF_BEGV (b->base_buffer), | 669 | b->base_buffer->begv, |
| 620 | BUF_BEGV_BYTE (b->base_buffer)); | 670 | b->base_buffer->begv_byte); |
| 621 | } | 671 | |
| 622 | if (NILP (b->base_buffer->zv_marker)) | ||
| 623 | { | ||
| 624 | b->base_buffer->zv_marker = Fmake_marker (); | 672 | b->base_buffer->zv_marker = Fmake_marker (); |
| 625 | set_marker_both (b->base_buffer->zv_marker, base_buffer, | 673 | set_marker_both (b->base_buffer->zv_marker, base_buffer, |
| 626 | BUF_ZV (b->base_buffer), | 674 | b->base_buffer->zv, |
| 627 | BUF_ZV_BYTE (b->base_buffer)); | 675 | b->base_buffer->zv_byte); |
| 628 | XMARKER (b->base_buffer->zv_marker)->insertion_type = 1; | 676 | XMARKER (b->base_buffer->zv_marker)->insertion_type = 1; |
| 629 | } | 677 | } |
| 630 | 678 | ||
| @@ -632,11 +680,11 @@ CLONE nil means the indirect buffer's state is reset to default values. */) | |||
| 632 | { | 680 | { |
| 633 | /* Give the indirect buffer markers for its narrowing. */ | 681 | /* Give the indirect buffer markers for its narrowing. */ |
| 634 | b->pt_marker = Fmake_marker (); | 682 | b->pt_marker = Fmake_marker (); |
| 635 | set_marker_both (b->pt_marker, buf, BUF_PT (b), BUF_PT_BYTE (b)); | 683 | set_marker_both (b->pt_marker, buf, b->pt, b->pt_byte); |
| 636 | b->begv_marker = Fmake_marker (); | 684 | b->begv_marker = Fmake_marker (); |
| 637 | set_marker_both (b->begv_marker, buf, BUF_BEGV (b), BUF_BEGV_BYTE (b)); | 685 | set_marker_both (b->begv_marker, buf, b->begv, b->begv_byte); |
| 638 | b->zv_marker = Fmake_marker (); | 686 | b->zv_marker = Fmake_marker (); |
| 639 | set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b)); | 687 | set_marker_both (b->zv_marker, buf, b->zv, b->zv_byte); |
| 640 | XMARKER (b->zv_marker)->insertion_type = 1; | 688 | XMARKER (b->zv_marker)->insertion_type = 1; |
| 641 | } | 689 | } |
| 642 | else | 690 | else |
| @@ -1890,27 +1938,7 @@ set_buffer_internal_1 (b) | |||
| 1890 | 1938 | ||
| 1891 | /* If the old current buffer has markers to record PT, BEGV and ZV | 1939 | /* If the old current buffer has markers to record PT, BEGV and ZV |
| 1892 | when it is not current, update them now. */ | 1940 | when it is not current, update them now. */ |
| 1893 | if (! NILP (old_buf->pt_marker)) | 1941 | record_buffer_markers (old_buf); |
| 1894 | { | ||
| 1895 | Lisp_Object obuf; | ||
| 1896 | XSETBUFFER (obuf, old_buf); | ||
| 1897 | set_marker_both (old_buf->pt_marker, obuf, | ||
| 1898 | BUF_PT (old_buf), BUF_PT_BYTE (old_buf)); | ||
| 1899 | } | ||
| 1900 | if (! NILP (old_buf->begv_marker)) | ||
| 1901 | { | ||
| 1902 | Lisp_Object obuf; | ||
| 1903 | XSETBUFFER (obuf, old_buf); | ||
| 1904 | set_marker_both (old_buf->begv_marker, obuf, | ||
| 1905 | BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf)); | ||
| 1906 | } | ||
| 1907 | if (! NILP (old_buf->zv_marker)) | ||
| 1908 | { | ||
| 1909 | Lisp_Object obuf; | ||
| 1910 | XSETBUFFER (obuf, old_buf); | ||
| 1911 | set_marker_both (old_buf->zv_marker, obuf, | ||
| 1912 | BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf)); | ||
| 1913 | } | ||
| 1914 | } | 1942 | } |
| 1915 | 1943 | ||
| 1916 | /* Get the undo list from the base buffer, so that it appears | 1944 | /* Get the undo list from the base buffer, so that it appears |
| @@ -1920,21 +1948,7 @@ set_buffer_internal_1 (b) | |||
| 1920 | 1948 | ||
| 1921 | /* If the new current buffer has markers to record PT, BEGV and ZV | 1949 | /* If the new current buffer has markers to record PT, BEGV and ZV |
| 1922 | when it is not current, fetch them now. */ | 1950 | when it is not current, fetch them now. */ |
| 1923 | if (! NILP (b->pt_marker)) | 1951 | fetch_buffer_markers (b); |
| 1924 | { | ||
| 1925 | BUF_PT (b) = marker_position (b->pt_marker); | ||
| 1926 | BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker); | ||
| 1927 | } | ||
| 1928 | if (! NILP (b->begv_marker)) | ||
| 1929 | { | ||
| 1930 | BUF_BEGV (b) = marker_position (b->begv_marker); | ||
| 1931 | BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker); | ||
| 1932 | } | ||
| 1933 | if (! NILP (b->zv_marker)) | ||
| 1934 | { | ||
| 1935 | BUF_ZV (b) = marker_position (b->zv_marker); | ||
| 1936 | BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker); | ||
| 1937 | } | ||
| 1938 | 1952 | ||
| 1939 | /* Look down buffer's list of local Lisp variables | 1953 | /* Look down buffer's list of local Lisp variables |
| 1940 | to find and update any that forward into C variables. */ | 1954 | to find and update any that forward into C variables. */ |
| @@ -1984,50 +1998,13 @@ set_buffer_temp (b) | |||
| 1984 | old_buf = current_buffer; | 1998 | old_buf = current_buffer; |
| 1985 | current_buffer = b; | 1999 | current_buffer = b; |
| 1986 | 2000 | ||
| 1987 | if (old_buf) | 2001 | /* If the old current buffer has markers to record PT, BEGV and ZV |
| 1988 | { | 2002 | when it is not current, update them now. */ |
| 1989 | /* If the old current buffer has markers to record PT, BEGV and ZV | 2003 | record_buffer_markers (old_buf); |
| 1990 | when it is not current, update them now. */ | ||
| 1991 | if (! NILP (old_buf->pt_marker)) | ||
| 1992 | { | ||
| 1993 | Lisp_Object obuf; | ||
| 1994 | XSETBUFFER (obuf, old_buf); | ||
| 1995 | set_marker_both (old_buf->pt_marker, obuf, | ||
| 1996 | BUF_PT (old_buf), BUF_PT_BYTE (old_buf)); | ||
| 1997 | } | ||
| 1998 | if (! NILP (old_buf->begv_marker)) | ||
| 1999 | { | ||
| 2000 | Lisp_Object obuf; | ||
| 2001 | XSETBUFFER (obuf, old_buf); | ||
| 2002 | set_marker_both (old_buf->begv_marker, obuf, | ||
| 2003 | BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf)); | ||
| 2004 | } | ||
| 2005 | if (! NILP (old_buf->zv_marker)) | ||
| 2006 | { | ||
| 2007 | Lisp_Object obuf; | ||
| 2008 | XSETBUFFER (obuf, old_buf); | ||
| 2009 | set_marker_both (old_buf->zv_marker, obuf, | ||
| 2010 | BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf)); | ||
| 2011 | } | ||
| 2012 | } | ||
| 2013 | 2004 | ||
| 2014 | /* If the new current buffer has markers to record PT, BEGV and ZV | 2005 | /* If the new current buffer has markers to record PT, BEGV and ZV |
| 2015 | when it is not current, fetch them now. */ | 2006 | when it is not current, fetch them now. */ |
| 2016 | if (! NILP (b->pt_marker)) | 2007 | fetch_buffer_markers (b); |
| 2017 | { | ||
| 2018 | BUF_PT (b) = marker_position (b->pt_marker); | ||
| 2019 | BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker); | ||
| 2020 | } | ||
| 2021 | if (! NILP (b->begv_marker)) | ||
| 2022 | { | ||
| 2023 | BUF_BEGV (b) = marker_position (b->begv_marker); | ||
| 2024 | BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker); | ||
| 2025 | } | ||
| 2026 | if (! NILP (b->zv_marker)) | ||
| 2027 | { | ||
| 2028 | BUF_ZV (b) = marker_position (b->zv_marker); | ||
| 2029 | BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker); | ||
| 2030 | } | ||
| 2031 | } | 2008 | } |
| 2032 | 2009 | ||
| 2033 | DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, | 2010 | DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, |
diff --git a/src/buffer.h b/src/buffer.h index 21854571670..56d0422b7e3 100644 --- a/src/buffer.h +++ b/src/buffer.h | |||
| @@ -107,22 +107,46 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 107 | #define BUF_BEG(buf) (BEG) | 107 | #define BUF_BEG(buf) (BEG) |
| 108 | #define BUF_BEG_BYTE(buf) (BEG_BYTE) | 108 | #define BUF_BEG_BYTE(buf) (BEG_BYTE) |
| 109 | 109 | ||
| 110 | /* The BUF_BEGV[_BYTE], BUF_ZV[_BYTE], and BUF_PT[_BYTE] macros cannot | ||
| 111 | be used for assignment; use SET_BUF_* macros below for that. */ | ||
| 112 | |||
| 110 | /* Position of beginning of accessible range of buffer. */ | 113 | /* Position of beginning of accessible range of buffer. */ |
| 111 | #define BUF_BEGV(buf) ((buf)->begv) | 114 | #define BUF_BEGV(buf) \ |
| 112 | #define BUF_BEGV_BYTE(buf) ((buf)->begv_byte) | 115 | (buf == current_buffer ? BEGV \ |
| 116 | : NILP (buf->begv_marker) ? buf->begv \ | ||
| 117 | : marker_position (buf->begv_marker)) | ||
| 118 | |||
| 119 | #define BUF_BEGV_BYTE(buf) \ | ||
| 120 | (buf == current_buffer ? BEGV_BYTE \ | ||
| 121 | : NILP (buf->begv_marker) ? buf->begv_byte \ | ||
| 122 | : marker_byte_position (buf->begv_marker)) | ||
| 113 | 123 | ||
| 114 | /* Position of point in buffer. */ | 124 | /* Position of point in buffer. */ |
| 115 | #define BUF_PT(buf) ((buf)->pt) | 125 | #define BUF_PT(buf) \ |
| 116 | #define BUF_PT_BYTE(buf) ((buf)->pt_byte) | 126 | (buf == current_buffer ? PT \ |
| 127 | : NILP (buf->pt_marker) ? buf->pt \ | ||
| 128 | : marker_position (buf->pt_marker)) | ||
| 129 | |||
| 130 | #define BUF_PT_BYTE(buf) \ | ||
| 131 | (buf == current_buffer ? PT_BYTE \ | ||
| 132 | : NILP (buf->pt_marker) ? buf->pt_byte \ | ||
| 133 | : marker_byte_position (buf->pt_marker)) | ||
| 134 | |||
| 135 | /* Position of end of accessible range of buffer. */ | ||
| 136 | #define BUF_ZV(buf) \ | ||
| 137 | (buf == current_buffer ? ZV \ | ||
| 138 | : NILP (buf->zv_marker) ? buf->zv \ | ||
| 139 | : marker_position (buf->zv_marker)) | ||
| 140 | |||
| 141 | #define BUF_ZV_BYTE(buf) \ | ||
| 142 | (buf == current_buffer ? ZV_BYTE \ | ||
| 143 | : NILP (buf->zv_marker) ? buf->zv_byte \ | ||
| 144 | : marker_byte_position (buf->zv_marker)) | ||
| 117 | 145 | ||
| 118 | /* Position of gap in buffer. */ | 146 | /* Position of gap in buffer. */ |
| 119 | #define BUF_GPT(buf) ((buf)->text->gpt) | 147 | #define BUF_GPT(buf) ((buf)->text->gpt) |
| 120 | #define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte) | 148 | #define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte) |
| 121 | 149 | ||
| 122 | /* Position of end of accessible range of buffer. */ | ||
| 123 | #define BUF_ZV(buf) ((buf)->zv) | ||
| 124 | #define BUF_ZV_BYTE(buf) ((buf)->zv_byte) | ||
| 125 | |||
| 126 | /* Position of end of buffer. */ | 150 | /* Position of end of buffer. */ |
| 127 | #define BUF_Z(buf) ((buf)->text->z) | 151 | #define BUF_Z(buf) ((buf)->text->z) |
| 128 | #define BUF_Z_BYTE(buf) ((buf)->text->z_byte) | 152 | #define BUF_Z_BYTE(buf) ((buf)->text->z_byte) |
| @@ -230,8 +254,6 @@ extern void enlarge_buffer_text P_ ((struct buffer *, EMACS_INT)); | |||
| 230 | 254 | ||
| 231 | /* Macros for setting the BEGV, ZV or PT of a given buffer. | 255 | /* Macros for setting the BEGV, ZV or PT of a given buffer. |
| 232 | 256 | ||
| 233 | SET_BUF_PT* seet to be redundant. Get rid of them? | ||
| 234 | |||
| 235 | The ..._BOTH macros take both a charpos and a bytepos, | 257 | The ..._BOTH macros take both a charpos and a bytepos, |
| 236 | which must correspond to each other. | 258 | which must correspond to each other. |
| 237 | 259 | ||
diff --git a/src/insdel.c b/src/insdel.c index 7e0ba797fa8..b76a2d2271a 100644 --- a/src/insdel.c +++ b/src/insdel.c | |||
| @@ -459,9 +459,7 @@ adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte, | |||
| 459 | static void | 459 | static void |
| 460 | adjust_point (EMACS_INT nchars, EMACS_INT nbytes) | 460 | adjust_point (EMACS_INT nchars, EMACS_INT nbytes) |
| 461 | { | 461 | { |
| 462 | BUF_PT (current_buffer) += nchars; | 462 | SET_BUF_PT_BOTH (current_buffer, PT + nchars, PT_BYTE + nbytes); |
| 463 | BUF_PT_BYTE (current_buffer) += nbytes; | ||
| 464 | |||
| 465 | /* In a single-byte buffer, the two positions must be equal. */ | 463 | /* In a single-byte buffer, the two positions must be equal. */ |
| 466 | eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV); | 464 | eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV); |
| 467 | } | 465 | } |
diff --git a/src/intervals.c b/src/intervals.c index d47888b237c..fd8f3f55479 100644 --- a/src/intervals.c +++ b/src/intervals.c | |||
| @@ -1949,8 +1949,7 @@ temp_set_point_both (struct buffer *buffer, | |||
| 1949 | if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer)) | 1949 | if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer)) |
| 1950 | abort (); | 1950 | abort (); |
| 1951 | 1951 | ||
| 1952 | BUF_PT_BYTE (buffer) = bytepos; | 1952 | SET_BUF_PT_BOTH (buffer, charpos, bytepos); |
| 1953 | BUF_PT (buffer) = charpos; | ||
| 1954 | } | 1953 | } |
| 1955 | 1954 | ||
| 1956 | /* Set point in BUFFER to CHARPOS. If the target position is | 1955 | /* Set point in BUFFER to CHARPOS. If the target position is |
| @@ -2366,10 +2365,9 @@ get_local_map (position, buffer, type) | |||
| 2366 | old_zv = BUF_ZV (buffer); | 2365 | old_zv = BUF_ZV (buffer); |
| 2367 | old_begv_byte = BUF_BEGV_BYTE (buffer); | 2366 | old_begv_byte = BUF_BEGV_BYTE (buffer); |
| 2368 | old_zv_byte = BUF_ZV_BYTE (buffer); | 2367 | old_zv_byte = BUF_ZV_BYTE (buffer); |
| 2369 | BUF_BEGV (buffer) = BUF_BEG (buffer); | 2368 | |
| 2370 | BUF_ZV (buffer) = BUF_Z (buffer); | 2369 | SET_BUF_BEGV_BOTH (buffer, BUF_BEG (buffer), BUF_BEG_BYTE (buffer)); |
| 2371 | BUF_BEGV_BYTE (buffer) = BUF_BEG_BYTE (buffer); | 2370 | SET_BUF_ZV_BOTH (buffer, BUF_Z (buffer), BUF_Z_BYTE (buffer)); |
| 2372 | BUF_ZV_BYTE (buffer) = BUF_Z_BYTE (buffer); | ||
| 2373 | 2371 | ||
| 2374 | XSETFASTINT (lispy_position, position); | 2372 | XSETFASTINT (lispy_position, position); |
| 2375 | XSETBUFFER (lispy_buffer, buffer); | 2373 | XSETBUFFER (lispy_buffer, buffer); |
| @@ -2383,10 +2381,8 @@ get_local_map (position, buffer, type) | |||
| 2383 | if (NILP (prop)) | 2381 | if (NILP (prop)) |
| 2384 | prop = get_pos_property (lispy_position, type, lispy_buffer); | 2382 | prop = get_pos_property (lispy_position, type, lispy_buffer); |
| 2385 | 2383 | ||
| 2386 | BUF_BEGV (buffer) = old_begv; | 2384 | SET_BUF_BEGV_BOTH (buffer, old_begv, old_begv_byte); |
| 2387 | BUF_ZV (buffer) = old_zv; | 2385 | SET_BUF_ZV_BOTH (buffer, old_zv, old_zv_byte); |
| 2388 | BUF_BEGV_BYTE (buffer) = old_begv_byte; | ||
| 2389 | BUF_ZV_BYTE (buffer) = old_zv_byte; | ||
| 2390 | 2386 | ||
| 2391 | /* Use the local map only if it is valid. */ | 2387 | /* Use the local map only if it is valid. */ |
| 2392 | prop = get_keymap (prop, 0, 0); | 2388 | prop = get_keymap (prop, 0, 0); |
diff --git a/src/lread.c b/src/lread.c index 8f1d4af8f36..2da64632417 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -458,15 +458,15 @@ unreadchar (readcharfun, c) | |||
| 458 | else if (BUFFERP (readcharfun)) | 458 | else if (BUFFERP (readcharfun)) |
| 459 | { | 459 | { |
| 460 | struct buffer *b = XBUFFER (readcharfun); | 460 | struct buffer *b = XBUFFER (readcharfun); |
| 461 | int bytepos = BUF_PT_BYTE (b); | 461 | EMACS_INT charpos = BUF_PT (b); |
| 462 | EMACS_INT bytepos = BUF_PT_BYTE (b); | ||
| 462 | 463 | ||
| 463 | BUF_PT (b)--; | ||
| 464 | if (! NILP (b->enable_multibyte_characters)) | 464 | if (! NILP (b->enable_multibyte_characters)) |
| 465 | BUF_DEC_POS (b, bytepos); | 465 | BUF_DEC_POS (b, bytepos); |
| 466 | else | 466 | else |
| 467 | bytepos--; | 467 | bytepos--; |
| 468 | 468 | ||
| 469 | BUF_PT_BYTE (b) = bytepos; | 469 | SET_BUF_PT_BOTH (b, charpos - 1, bytepos); |
| 470 | } | 470 | } |
| 471 | else if (MARKERP (readcharfun)) | 471 | else if (MARKERP (readcharfun)) |
| 472 | { | 472 | { |
diff --git a/src/xdisp.c b/src/xdisp.c index c2af4d68b6e..ade95cf3d62 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -10760,7 +10760,7 @@ hscroll_window_tree (window) | |||
| 10760 | current_buffer = XBUFFER (w->buffer); | 10760 | current_buffer = XBUFFER (w->buffer); |
| 10761 | 10761 | ||
| 10762 | if (w == XWINDOW (selected_window)) | 10762 | if (w == XWINDOW (selected_window)) |
| 10763 | pt = BUF_PT (current_buffer); | 10763 | pt = PT; |
| 10764 | else | 10764 | else |
| 10765 | { | 10765 | { |
| 10766 | pt = marker_position (w->pointm); | 10766 | pt = marker_position (w->pointm); |
| @@ -11194,7 +11194,7 @@ reconsider_clip_changes (w, b) | |||
| 11194 | int pt; | 11194 | int pt; |
| 11195 | 11195 | ||
| 11196 | if (w == XWINDOW (selected_window)) | 11196 | if (w == XWINDOW (selected_window)) |
| 11197 | pt = BUF_PT (current_buffer); | 11197 | pt = PT; |
| 11198 | else | 11198 | else |
| 11199 | pt = marker_position (w->pointm); | 11199 | pt = marker_position (w->pointm); |
| 11200 | 11200 | ||