diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 22 | ||||
| -rw-r--r-- | src/buffer.c | 187 | ||||
| -rw-r--r-- | src/buffer.h | 45 | ||||
| -rw-r--r-- | src/insdel.c | 4 | ||||
| -rw-r--r-- | src/intervals.c | 16 | ||||
| -rw-r--r-- | src/lread.c | 4 | ||||
| -rw-r--r-- | src/xdisp.c | 4 |
7 files changed, 146 insertions, 136 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 3d5f3e0c387..bad9b8dd4b7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,25 @@ | |||
| 1 | 2011-03-13 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-13 Eli Zaretskii <eliz@gnu.org> | 23 | 2011-03-13 Eli Zaretskii <eliz@gnu.org> |
| 2 | 24 | ||
| 3 | * makefile.w32-in ($(BLD)/editfns.$(O)): Depend on | 25 | * makefile.w32-in ($(BLD)/editfns.$(O)): Depend on |
diff --git a/src/buffer.c b/src/buffer.c index 448c9236387..01940728275 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -330,15 +330,17 @@ even if it is dead. The return value is never nil. */) | |||
| 330 | if (! BUF_BEG_ADDR (b)) | 330 | if (! BUF_BEG_ADDR (b)) |
| 331 | buffer_memory_full (); | 331 | buffer_memory_full (); |
| 332 | 332 | ||
| 333 | BUF_PT (b) = BEG; | 333 | b->pt = BEG; |
| 334 | b->begv = BEG; | ||
| 335 | b->zv = BEG; | ||
| 336 | b->pt_byte = BEG_BYTE; | ||
| 337 | b->begv_byte = BEG_BYTE; | ||
| 338 | b->zv_byte = BEG_BYTE; | ||
| 339 | |||
| 334 | BUF_GPT (b) = BEG; | 340 | BUF_GPT (b) = BEG; |
| 335 | BUF_BEGV (b) = BEG; | ||
| 336 | BUF_ZV (b) = BEG; | ||
| 337 | BUF_Z (b) = BEG; | ||
| 338 | BUF_PT_BYTE (b) = BEG_BYTE; | ||
| 339 | BUF_GPT_BYTE (b) = BEG_BYTE; | 341 | BUF_GPT_BYTE (b) = BEG_BYTE; |
| 340 | BUF_BEGV_BYTE (b) = BEG_BYTE; | 342 | |
| 341 | BUF_ZV_BYTE (b) = BEG_BYTE; | 343 | BUF_Z (b) = BEG; |
| 342 | BUF_Z_BYTE (b) = BEG_BYTE; | 344 | BUF_Z_BYTE (b) = BEG_BYTE; |
| 343 | BUF_MODIFF (b) = 1; | 345 | BUF_MODIFF (b) = 1; |
| 344 | BUF_CHARS_MODIFF (b) = 1; | 346 | BUF_CHARS_MODIFF (b) = 1; |
| @@ -489,6 +491,53 @@ clone_per_buffer_values (struct buffer *from, struct buffer *to) | |||
| 489 | BVAR (to, local_var_alist) = buffer_lisp_local_variables (from); | 491 | BVAR (to, local_var_alist) = buffer_lisp_local_variables (from); |
| 490 | } | 492 | } |
| 491 | 493 | ||
| 494 | |||
| 495 | /* If buffer B has markers to record PT, BEGV and ZV when it is not | ||
| 496 | current, update these markers. */ | ||
| 497 | |||
| 498 | static void | ||
| 499 | record_buffer_markers (struct buffer *b) | ||
| 500 | { | ||
| 501 | if (! NILP (BVAR (b, pt_marker))) | ||
| 502 | { | ||
| 503 | Lisp_Object buffer; | ||
| 504 | |||
| 505 | eassert (!NILP (BVAR (b, begv_marker))); | ||
| 506 | eassert (!NILP (BVAR (b, zv_marker))); | ||
| 507 | |||
| 508 | XSETBUFFER (buffer, b); | ||
| 509 | set_marker_both (BVAR (b, pt_marker), buffer, b->pt, b->pt_byte); | ||
| 510 | set_marker_both (BVAR (b, begv_marker), buffer, b->begv, b->begv_byte); | ||
| 511 | set_marker_both (BVAR (b, zv_marker), buffer, b->zv, b->zv_byte); | ||
| 512 | } | ||
| 513 | } | ||
| 514 | |||
| 515 | |||
| 516 | /* If buffer B has markers to record PT, BEGV and ZV when it is not | ||
| 517 | current, fetch these values into B->begv etc. */ | ||
| 518 | |||
| 519 | static void | ||
| 520 | fetch_buffer_markers (struct buffer *b) | ||
| 521 | { | ||
| 522 | if (! NILP (BVAR (b, pt_marker))) | ||
| 523 | { | ||
| 524 | Lisp_Object m; | ||
| 525 | |||
| 526 | eassert (!NILP (BVAR (b, begv_marker))); | ||
| 527 | eassert (!NILP (BVAR (b, zv_marker))); | ||
| 528 | |||
| 529 | m = BVAR (b, pt_marker); | ||
| 530 | SET_BUF_PT_BOTH (b, marker_position (m), marker_byte_position (m)); | ||
| 531 | |||
| 532 | m = BVAR (b, begv_marker); | ||
| 533 | SET_BUF_BEGV_BOTH (b, marker_position (m), marker_byte_position (m)); | ||
| 534 | |||
| 535 | m = BVAR (b, zv_marker); | ||
| 536 | SET_BUF_ZV_BOTH (b, marker_position (m), marker_byte_position (m)); | ||
| 537 | } | ||
| 538 | } | ||
| 539 | |||
| 540 | |||
| 492 | DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, | 541 | DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, |
| 493 | 2, 3, | 542 | 2, 3, |
| 494 | "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", | 543 | "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", |
| @@ -527,12 +576,12 @@ CLONE nil means the indirect buffer's state is reset to default values. */) | |||
| 527 | /* Use the base buffer's text object. */ | 576 | /* Use the base buffer's text object. */ |
| 528 | b->text = b->base_buffer->text; | 577 | b->text = b->base_buffer->text; |
| 529 | 578 | ||
| 530 | BUF_BEGV (b) = BUF_BEGV (b->base_buffer); | 579 | b->pt = b->base_buffer->pt; |
| 531 | BUF_ZV (b) = BUF_ZV (b->base_buffer); | 580 | b->begv = b->base_buffer->begv; |
| 532 | BUF_PT (b) = BUF_PT (b->base_buffer); | 581 | b->zv = b->base_buffer->zv; |
| 533 | BUF_BEGV_BYTE (b) = BUF_BEGV_BYTE (b->base_buffer); | 582 | b->pt_byte = b->base_buffer->pt_byte; |
| 534 | BUF_ZV_BYTE (b) = BUF_ZV_BYTE (b->base_buffer); | 583 | b->begv_byte = b->base_buffer->begv_byte; |
| 535 | BUF_PT_BYTE (b) = BUF_PT_BYTE (b->base_buffer); | 584 | b->zv_byte = b->base_buffer->zv_byte; |
| 536 | 585 | ||
| 537 | b->newline_cache = 0; | 586 | b->newline_cache = 0; |
| 538 | b->width_run_cache = 0; | 587 | b->width_run_cache = 0; |
| @@ -562,24 +611,23 @@ CLONE nil means the indirect buffer's state is reset to default values. */) | |||
| 562 | /* Make sure the base buffer has markers for its narrowing. */ | 611 | /* Make sure the base buffer has markers for its narrowing. */ |
| 563 | if (NILP (BVAR (b->base_buffer, pt_marker))) | 612 | if (NILP (BVAR (b->base_buffer, pt_marker))) |
| 564 | { | 613 | { |
| 614 | eassert (NILP (BVAR (b, begv_marker))); | ||
| 615 | eassert (NILP (BVAR (b, zv_marker))); | ||
| 616 | |||
| 565 | BVAR (b->base_buffer, pt_marker) = Fmake_marker (); | 617 | BVAR (b->base_buffer, pt_marker) = Fmake_marker (); |
| 566 | set_marker_both (BVAR (b->base_buffer, pt_marker), base_buffer, | 618 | set_marker_both (BVAR (b->base_buffer, pt_marker), base_buffer, |
| 567 | BUF_PT (b->base_buffer), | 619 | b->base_buffer->pt, |
| 568 | BUF_PT_BYTE (b->base_buffer)); | 620 | b->base_buffer->pt_byte); |
| 569 | } | 621 | |
| 570 | if (NILP (BVAR (b->base_buffer, begv_marker))) | ||
| 571 | { | ||
| 572 | BVAR (b->base_buffer, begv_marker) = Fmake_marker (); | 622 | BVAR (b->base_buffer, begv_marker) = Fmake_marker (); |
| 573 | set_marker_both (BVAR (b->base_buffer, begv_marker), base_buffer, | 623 | set_marker_both (BVAR (b->base_buffer, begv_marker), base_buffer, |
| 574 | BUF_BEGV (b->base_buffer), | 624 | b->base_buffer->begv, |
| 575 | BUF_BEGV_BYTE (b->base_buffer)); | 625 | b->base_buffer->begv_byte); |
| 576 | } | 626 | |
| 577 | if (NILP (BVAR (b->base_buffer, zv_marker))) | ||
| 578 | { | ||
| 579 | BVAR (b->base_buffer, zv_marker) = Fmake_marker (); | 627 | BVAR (b->base_buffer, zv_marker) = Fmake_marker (); |
| 580 | set_marker_both (BVAR (b->base_buffer, zv_marker), base_buffer, | 628 | set_marker_both (BVAR (b->base_buffer, zv_marker), base_buffer, |
| 581 | BUF_ZV (b->base_buffer), | 629 | b->base_buffer->zv, |
| 582 | BUF_ZV_BYTE (b->base_buffer)); | 630 | b->base_buffer->zv_byte); |
| 583 | XMARKER (BVAR (b->base_buffer, zv_marker))->insertion_type = 1; | 631 | XMARKER (BVAR (b->base_buffer, zv_marker))->insertion_type = 1; |
| 584 | } | 632 | } |
| 585 | 633 | ||
| @@ -587,11 +635,11 @@ CLONE nil means the indirect buffer's state is reset to default values. */) | |||
| 587 | { | 635 | { |
| 588 | /* Give the indirect buffer markers for its narrowing. */ | 636 | /* Give the indirect buffer markers for its narrowing. */ |
| 589 | BVAR (b, pt_marker) = Fmake_marker (); | 637 | BVAR (b, pt_marker) = Fmake_marker (); |
| 590 | set_marker_both (BVAR (b, pt_marker), buf, BUF_PT (b), BUF_PT_BYTE (b)); | 638 | set_marker_both (BVAR (b, pt_marker), buf, b->pt, b->pt_byte); |
| 591 | BVAR (b, begv_marker) = Fmake_marker (); | 639 | BVAR (b, begv_marker) = Fmake_marker (); |
| 592 | set_marker_both (BVAR (b, begv_marker), buf, BUF_BEGV (b), BUF_BEGV_BYTE (b)); | 640 | set_marker_both (BVAR (b, begv_marker), buf, b->begv, b->begv_byte); |
| 593 | BVAR (b, zv_marker) = Fmake_marker (); | 641 | BVAR (b, zv_marker) = Fmake_marker (); |
| 594 | set_marker_both (BVAR (b, zv_marker), buf, BUF_ZV (b), BUF_ZV_BYTE (b)); | 642 | set_marker_both (BVAR (b, zv_marker), buf, b->zv, b->zv_byte); |
| 595 | XMARKER (BVAR (b, zv_marker))->insertion_type = 1; | 643 | XMARKER (BVAR (b, zv_marker))->insertion_type = 1; |
| 596 | } | 644 | } |
| 597 | else | 645 | else |
| @@ -1796,27 +1844,7 @@ set_buffer_internal_1 (register struct buffer *b) | |||
| 1796 | 1844 | ||
| 1797 | /* If the old current buffer has markers to record PT, BEGV and ZV | 1845 | /* If the old current buffer has markers to record PT, BEGV and ZV |
| 1798 | when it is not current, update them now. */ | 1846 | when it is not current, update them now. */ |
| 1799 | if (! NILP (BVAR (old_buf, pt_marker))) | 1847 | record_buffer_markers (old_buf); |
| 1800 | { | ||
| 1801 | Lisp_Object obuf; | ||
| 1802 | XSETBUFFER (obuf, old_buf); | ||
| 1803 | set_marker_both (BVAR (old_buf, pt_marker), obuf, | ||
| 1804 | BUF_PT (old_buf), BUF_PT_BYTE (old_buf)); | ||
| 1805 | } | ||
| 1806 | if (! NILP (BVAR (old_buf, begv_marker))) | ||
| 1807 | { | ||
| 1808 | Lisp_Object obuf; | ||
| 1809 | XSETBUFFER (obuf, old_buf); | ||
| 1810 | set_marker_both (BVAR (old_buf, begv_marker), obuf, | ||
| 1811 | BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf)); | ||
| 1812 | } | ||
| 1813 | if (! NILP (BVAR (old_buf, zv_marker))) | ||
| 1814 | { | ||
| 1815 | Lisp_Object obuf; | ||
| 1816 | XSETBUFFER (obuf, old_buf); | ||
| 1817 | set_marker_both (BVAR (old_buf, zv_marker), obuf, | ||
| 1818 | BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf)); | ||
| 1819 | } | ||
| 1820 | } | 1848 | } |
| 1821 | 1849 | ||
| 1822 | /* Get the undo list from the base buffer, so that it appears | 1850 | /* Get the undo list from the base buffer, so that it appears |
| @@ -1826,21 +1854,7 @@ set_buffer_internal_1 (register struct buffer *b) | |||
| 1826 | 1854 | ||
| 1827 | /* If the new current buffer has markers to record PT, BEGV and ZV | 1855 | /* If the new current buffer has markers to record PT, BEGV and ZV |
| 1828 | when it is not current, fetch them now. */ | 1856 | when it is not current, fetch them now. */ |
| 1829 | if (! NILP (BVAR (b, pt_marker))) | 1857 | fetch_buffer_markers (b); |
| 1830 | { | ||
| 1831 | BUF_PT (b) = marker_position (BVAR (b, pt_marker)); | ||
| 1832 | BUF_PT_BYTE (b) = marker_byte_position (BVAR (b, pt_marker)); | ||
| 1833 | } | ||
| 1834 | if (! NILP (BVAR (b, begv_marker))) | ||
| 1835 | { | ||
| 1836 | BUF_BEGV (b) = marker_position (BVAR (b, begv_marker)); | ||
| 1837 | BUF_BEGV_BYTE (b) = marker_byte_position (BVAR (b, begv_marker)); | ||
| 1838 | } | ||
| 1839 | if (! NILP (BVAR (b, zv_marker))) | ||
| 1840 | { | ||
| 1841 | BUF_ZV (b) = marker_position (BVAR (b, zv_marker)); | ||
| 1842 | BUF_ZV_BYTE (b) = marker_byte_position (BVAR (b, zv_marker)); | ||
| 1843 | } | ||
| 1844 | 1858 | ||
| 1845 | /* Look down buffer's list of local Lisp variables | 1859 | /* Look down buffer's list of local Lisp variables |
| 1846 | to find and update any that forward into C variables. */ | 1860 | to find and update any that forward into C variables. */ |
| @@ -1876,50 +1890,13 @@ set_buffer_temp (struct buffer *b) | |||
| 1876 | old_buf = current_buffer; | 1890 | old_buf = current_buffer; |
| 1877 | current_buffer = b; | 1891 | current_buffer = b; |
| 1878 | 1892 | ||
| 1879 | if (old_buf) | 1893 | /* If the old current buffer has markers to record PT, BEGV and ZV |
| 1880 | { | 1894 | when it is not current, update them now. */ |
| 1881 | /* If the old current buffer has markers to record PT, BEGV and ZV | 1895 | record_buffer_markers (old_buf); |
| 1882 | when it is not current, update them now. */ | ||
| 1883 | if (! NILP (BVAR (old_buf, pt_marker))) | ||
| 1884 | { | ||
| 1885 | Lisp_Object obuf; | ||
| 1886 | XSETBUFFER (obuf, old_buf); | ||
| 1887 | set_marker_both (BVAR (old_buf, pt_marker), obuf, | ||
| 1888 | BUF_PT (old_buf), BUF_PT_BYTE (old_buf)); | ||
| 1889 | } | ||
| 1890 | if (! NILP (BVAR (old_buf, begv_marker))) | ||
| 1891 | { | ||
| 1892 | Lisp_Object obuf; | ||
| 1893 | XSETBUFFER (obuf, old_buf); | ||
| 1894 | set_marker_both (BVAR (old_buf, begv_marker), obuf, | ||
| 1895 | BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf)); | ||
| 1896 | } | ||
| 1897 | if (! NILP (BVAR (old_buf, zv_marker))) | ||
| 1898 | { | ||
| 1899 | Lisp_Object obuf; | ||
| 1900 | XSETBUFFER (obuf, old_buf); | ||
| 1901 | set_marker_both (BVAR (old_buf, zv_marker), obuf, | ||
| 1902 | BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf)); | ||
| 1903 | } | ||
| 1904 | } | ||
| 1905 | 1896 | ||
| 1906 | /* If the new current buffer has markers to record PT, BEGV and ZV | 1897 | /* If the new current buffer has markers to record PT, BEGV and ZV |
| 1907 | when it is not current, fetch them now. */ | 1898 | when it is not current, fetch them now. */ |
| 1908 | if (! NILP (BVAR (b, pt_marker))) | 1899 | fetch_buffer_markers (b); |
| 1909 | { | ||
| 1910 | BUF_PT (b) = marker_position (BVAR (b, pt_marker)); | ||
| 1911 | BUF_PT_BYTE (b) = marker_byte_position (BVAR (b, pt_marker)); | ||
| 1912 | } | ||
| 1913 | if (! NILP (BVAR (b, begv_marker))) | ||
| 1914 | { | ||
| 1915 | BUF_BEGV (b) = marker_position (BVAR (b, begv_marker)); | ||
| 1916 | BUF_BEGV_BYTE (b) = marker_byte_position (BVAR (b, begv_marker)); | ||
| 1917 | } | ||
| 1918 | if (! NILP (BVAR (b, zv_marker))) | ||
| 1919 | { | ||
| 1920 | BUF_ZV (b) = marker_position (BVAR (b, zv_marker)); | ||
| 1921 | BUF_ZV_BYTE (b) = marker_byte_position (BVAR (b, zv_marker)); | ||
| 1922 | } | ||
| 1923 | } | 1900 | } |
| 1924 | 1901 | ||
| 1925 | DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, | 1902 | DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, |
diff --git a/src/buffer.h b/src/buffer.h index 65c7168d60a..0975d2e3adc 100644 --- a/src/buffer.h +++ b/src/buffer.h | |||
| @@ -107,27 +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 | /* !!!FIXME: all the BUF_BEGV/BUF_ZV/BUF_PT macros are flawed: | 110 | /* The BUF_BEGV[_BYTE], BUF_ZV[_BYTE], and BUF_PT[_BYTE] macros cannot |
| 111 | on indirect (or base) buffers, that value is only correct if that buffer | 111 | be used for assignment; use SET_BUF_* macros below for that. */ |
| 112 | is the current_buffer, or if the buffer's text hasn't been modified (via | ||
| 113 | an indirect buffer) since it was last current. */ | ||
| 114 | 112 | ||
| 115 | /* Position of beginning of accessible range of buffer. */ | 113 | /* Position of beginning of accessible range of buffer. */ |
| 116 | #define BUF_BEGV(buf) ((buf)->begv) | 114 | #define BUF_BEGV(buf) \ |
| 117 | #define BUF_BEGV_BYTE(buf) ((buf)->begv_byte) | 115 | (buf == current_buffer ? BEGV \ |
| 116 | : NILP (BVAR (buf, begv_marker)) ? buf->begv \ | ||
| 117 | : marker_position (BVAR (buf, begv_marker))) | ||
| 118 | |||
| 119 | #define BUF_BEGV_BYTE(buf) \ | ||
| 120 | (buf == current_buffer ? BEGV_BYTE \ | ||
| 121 | : NILP (BVAR (buf, begv_marker)) ? buf->begv_byte \ | ||
| 122 | : marker_byte_position (BVAR (buf, begv_marker))) | ||
| 118 | 123 | ||
| 119 | /* Position of point in buffer. */ | 124 | /* Position of point in buffer. */ |
| 120 | #define BUF_PT(buf) ((buf)->pt) | 125 | #define BUF_PT(buf) \ |
| 121 | #define BUF_PT_BYTE(buf) ((buf)->pt_byte) | 126 | (buf == current_buffer ? PT \ |
| 127 | : NILP (BVAR (buf, pt_marker)) ? buf->pt \ | ||
| 128 | : marker_position (BVAR (buf, pt_marker))) | ||
| 129 | |||
| 130 | #define BUF_PT_BYTE(buf) \ | ||
| 131 | (buf == current_buffer ? PT_BYTE \ | ||
| 132 | : NILP (BVAR (buf, pt_marker)) ? buf->pt_byte \ | ||
| 133 | : marker_byte_position (BVAR (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 (BVAR (buf, zv_marker)) ? buf->zv \ | ||
| 139 | : marker_position (BVAR (buf, zv_marker))) | ||
| 140 | |||
| 141 | #define BUF_ZV_BYTE(buf) \ | ||
| 142 | (buf == current_buffer ? ZV_BYTE \ | ||
| 143 | : NILP (BVAR (buf, zv_marker)) ? buf->zv_byte \ | ||
| 144 | : marker_byte_position (BVAR (buf, zv_marker))) | ||
| 122 | 145 | ||
| 123 | /* Position of gap in buffer. */ | 146 | /* Position of gap in buffer. */ |
| 124 | #define BUF_GPT(buf) ((buf)->text->gpt) | 147 | #define BUF_GPT(buf) ((buf)->text->gpt) |
| 125 | #define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte) | 148 | #define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte) |
| 126 | 149 | ||
| 127 | /* Position of end of accessible range of buffer. */ | ||
| 128 | #define BUF_ZV(buf) ((buf)->zv) | ||
| 129 | #define BUF_ZV_BYTE(buf) ((buf)->zv_byte) | ||
| 130 | |||
| 131 | /* Position of end of buffer. */ | 150 | /* Position of end of buffer. */ |
| 132 | #define BUF_Z(buf) ((buf)->text->z) | 151 | #define BUF_Z(buf) ((buf)->text->z) |
| 133 | #define BUF_Z_BYTE(buf) ((buf)->text->z_byte) | 152 | #define BUF_Z_BYTE(buf) ((buf)->text->z_byte) |
| @@ -235,8 +254,6 @@ extern void enlarge_buffer_text (struct buffer *, EMACS_INT); | |||
| 235 | 254 | ||
| 236 | /* 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. |
| 237 | 256 | ||
| 238 | SET_BUF_PT* seet to be redundant. Get rid of them? | ||
| 239 | |||
| 240 | The ..._BOTH macros take both a charpos and a bytepos, | 257 | The ..._BOTH macros take both a charpos and a bytepos, |
| 241 | which must correspond to each other. | 258 | which must correspond to each other. |
| 242 | 259 | ||
diff --git a/src/insdel.c b/src/insdel.c index 7fcf9522a33..bdf6aff1717 100644 --- a/src/insdel.c +++ b/src/insdel.c | |||
| @@ -411,9 +411,7 @@ adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte, | |||
| 411 | static void | 411 | static void |
| 412 | adjust_point (EMACS_INT nchars, EMACS_INT nbytes) | 412 | adjust_point (EMACS_INT nchars, EMACS_INT nbytes) |
| 413 | { | 413 | { |
| 414 | BUF_PT (current_buffer) += nchars; | 414 | SET_BUF_PT_BOTH (current_buffer, PT + nchars, PT_BYTE + nbytes); |
| 415 | BUF_PT_BYTE (current_buffer) += nbytes; | ||
| 416 | |||
| 417 | /* In a single-byte buffer, the two positions must be equal. */ | 415 | /* In a single-byte buffer, the two positions must be equal. */ |
| 418 | eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV); | 416 | eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV); |
| 419 | } | 417 | } |
diff --git a/src/intervals.c b/src/intervals.c index 6aee6e9d7fa..12b2789cc77 100644 --- a/src/intervals.c +++ b/src/intervals.c | |||
| @@ -1892,8 +1892,7 @@ temp_set_point_both (struct buffer *buffer, | |||
| 1892 | if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer)) | 1892 | if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer)) |
| 1893 | abort (); | 1893 | abort (); |
| 1894 | 1894 | ||
| 1895 | BUF_PT_BYTE (buffer) = bytepos; | 1895 | SET_BUF_PT_BOTH (buffer, charpos, bytepos); |
| 1896 | BUF_PT (buffer) = charpos; | ||
| 1897 | } | 1896 | } |
| 1898 | 1897 | ||
| 1899 | /* Set point "temporarily", without checking any text properties. */ | 1898 | /* Set point "temporarily", without checking any text properties. */ |
| @@ -2312,10 +2311,9 @@ get_local_map (register EMACS_INT position, register struct buffer *buffer, | |||
| 2312 | old_zv = BUF_ZV (buffer); | 2311 | old_zv = BUF_ZV (buffer); |
| 2313 | old_begv_byte = BUF_BEGV_BYTE (buffer); | 2312 | old_begv_byte = BUF_BEGV_BYTE (buffer); |
| 2314 | old_zv_byte = BUF_ZV_BYTE (buffer); | 2313 | old_zv_byte = BUF_ZV_BYTE (buffer); |
| 2315 | BUF_BEGV (buffer) = BUF_BEG (buffer); | 2314 | |
| 2316 | BUF_ZV (buffer) = BUF_Z (buffer); | 2315 | SET_BUF_BEGV_BOTH (buffer, BUF_BEG (buffer), BUF_BEG_BYTE (buffer)); |
| 2317 | BUF_BEGV_BYTE (buffer) = BUF_BEG_BYTE (buffer); | 2316 | SET_BUF_ZV_BOTH (buffer, BUF_Z (buffer), BUF_Z_BYTE (buffer)); |
| 2318 | BUF_ZV_BYTE (buffer) = BUF_Z_BYTE (buffer); | ||
| 2319 | 2317 | ||
| 2320 | XSETFASTINT (lispy_position, position); | 2318 | XSETFASTINT (lispy_position, position); |
| 2321 | XSETBUFFER (lispy_buffer, buffer); | 2319 | XSETBUFFER (lispy_buffer, buffer); |
| @@ -2329,10 +2327,8 @@ get_local_map (register EMACS_INT position, register struct buffer *buffer, | |||
| 2329 | if (NILP (prop)) | 2327 | if (NILP (prop)) |
| 2330 | prop = get_pos_property (lispy_position, type, lispy_buffer); | 2328 | prop = get_pos_property (lispy_position, type, lispy_buffer); |
| 2331 | 2329 | ||
| 2332 | BUF_BEGV (buffer) = old_begv; | 2330 | SET_BUF_BEGV_BOTH (buffer, old_begv, old_begv_byte); |
| 2333 | BUF_ZV (buffer) = old_zv; | 2331 | SET_BUF_ZV_BOTH (buffer, old_zv, old_zv_byte); |
| 2334 | BUF_BEGV_BYTE (buffer) = old_begv_byte; | ||
| 2335 | BUF_ZV_BYTE (buffer) = old_zv_byte; | ||
| 2336 | 2332 | ||
| 2337 | /* Use the local map only if it is valid. */ | 2333 | /* Use the local map only if it is valid. */ |
| 2338 | prop = get_keymap (prop, 0, 0); | 2334 | prop = get_keymap (prop, 0, 0); |
diff --git a/src/lread.c b/src/lread.c index 8a5f6ecd691..3c5b627f98c 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -368,15 +368,15 @@ unreadchar (Lisp_Object readcharfun, int c) | |||
| 368 | else if (BUFFERP (readcharfun)) | 368 | else if (BUFFERP (readcharfun)) |
| 369 | { | 369 | { |
| 370 | struct buffer *b = XBUFFER (readcharfun); | 370 | struct buffer *b = XBUFFER (readcharfun); |
| 371 | EMACS_INT charpos = BUF_PT (b); | ||
| 371 | EMACS_INT bytepos = BUF_PT_BYTE (b); | 372 | EMACS_INT bytepos = BUF_PT_BYTE (b); |
| 372 | 373 | ||
| 373 | BUF_PT (b)--; | ||
| 374 | if (! NILP (BVAR (b, enable_multibyte_characters))) | 374 | if (! NILP (BVAR (b, enable_multibyte_characters))) |
| 375 | BUF_DEC_POS (b, bytepos); | 375 | BUF_DEC_POS (b, bytepos); |
| 376 | else | 376 | else |
| 377 | bytepos--; | 377 | bytepos--; |
| 378 | 378 | ||
| 379 | BUF_PT_BYTE (b) = bytepos; | 379 | SET_BUF_PT_BOTH (b, charpos - 1, bytepos); |
| 380 | } | 380 | } |
| 381 | else if (MARKERP (readcharfun)) | 381 | else if (MARKERP (readcharfun)) |
| 382 | { | 382 | { |
diff --git a/src/xdisp.c b/src/xdisp.c index f2477a2eca5..a7955f41e0c 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -10909,7 +10909,7 @@ hscroll_window_tree (Lisp_Object window) | |||
| 10909 | current_buffer = XBUFFER (w->buffer); | 10909 | current_buffer = XBUFFER (w->buffer); |
| 10910 | 10910 | ||
| 10911 | if (w == XWINDOW (selected_window)) | 10911 | if (w == XWINDOW (selected_window)) |
| 10912 | pt = BUF_PT (current_buffer); | 10912 | pt = PT; |
| 10913 | else | 10913 | else |
| 10914 | { | 10914 | { |
| 10915 | pt = marker_position (w->pointm); | 10915 | pt = marker_position (w->pointm); |
| @@ -11347,7 +11347,7 @@ reconsider_clip_changes (struct window *w, struct buffer *b) | |||
| 11347 | EMACS_INT pt; | 11347 | EMACS_INT pt; |
| 11348 | 11348 | ||
| 11349 | if (w == XWINDOW (selected_window)) | 11349 | if (w == XWINDOW (selected_window)) |
| 11350 | pt = BUF_PT (current_buffer); | 11350 | pt = PT; |
| 11351 | else | 11351 | else |
| 11352 | pt = marker_position (w->pointm); | 11352 | pt = marker_position (w->pointm); |
| 11353 | 11353 | ||