diff options
| author | Kenichi Handa | 1998-03-04 07:41:41 +0000 |
|---|---|---|
| committer | Kenichi Handa | 1998-03-04 07:41:41 +0000 |
| commit | 673c57d22a2d87b1d5fcca0065c82d8bcaf7cc1b (patch) | |
| tree | 5a032d2c02507a9683a86f02f5d66f59bd0bd19d /src/buffer.c | |
| parent | f49a2d745257638152d17a75320c61c5109cab6f (diff) | |
| download | emacs-673c57d22a2d87b1d5fcca0065c82d8bcaf7cc1b.tar.gz emacs-673c57d22a2d87b1d5fcca0065c82d8bcaf7cc1b.zip | |
(Fset_buffer_multibyte): Fix arg for chars_in_text.
Be sure not to have a multibyte sequence striding over the GAP
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/buffer.c b/src/buffer.c index fa01de36a67..9879e8520bf 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -1737,6 +1737,24 @@ but the contents viewed as characters do change.") | |||
| 1737 | } | 1737 | } |
| 1738 | else | 1738 | else |
| 1739 | { | 1739 | { |
| 1740 | /* Be sure not to have a multibyte sequence striding over the GAP. | ||
| 1741 | Ex: We change this: "...abc\201\241\241 _GAP_ \241\241\241..." | ||
| 1742 | to: "...abc _GAP_ \201\241\241\241\241\241..." */ | ||
| 1743 | |||
| 1744 | if (GPT_BYTE > 1 && GPT_BYTE < Z_BYTE | ||
| 1745 | && ! CHAR_HEAD_P (*(GAP_END_ADDR))) | ||
| 1746 | { | ||
| 1747 | unsigned char *p = GPT_ADDR - 1; | ||
| 1748 | |||
| 1749 | while (! CHAR_HEAD_P (*p) && p > BEG_ADDR) p--; | ||
| 1750 | if (BASE_LEADING_CODE_P (*p)) | ||
| 1751 | { | ||
| 1752 | int new_gpt = GPT_BYTE - (GPT_ADDR - p); | ||
| 1753 | |||
| 1754 | move_gap_both (new_gpt, new_gpt); | ||
| 1755 | } | ||
| 1756 | } | ||
| 1757 | |||
| 1740 | /* Do this first, so that chars_in_text asks the right question. | 1758 | /* Do this first, so that chars_in_text asks the right question. |
| 1741 | set_intervals_multibyte needs it too. */ | 1759 | set_intervals_multibyte needs it too. */ |
| 1742 | current_buffer->enable_multibyte_characters = Qt; | 1760 | current_buffer->enable_multibyte_characters = Qt; |
| @@ -1744,17 +1762,17 @@ but the contents viewed as characters do change.") | |||
| 1744 | GPT_BYTE = advance_to_char_boundary (GPT_BYTE); | 1762 | GPT_BYTE = advance_to_char_boundary (GPT_BYTE); |
| 1745 | GPT = chars_in_text (BEG_ADDR, GPT_BYTE - BEG_BYTE) + BEG; | 1763 | GPT = chars_in_text (BEG_ADDR, GPT_BYTE - BEG_BYTE) + BEG; |
| 1746 | 1764 | ||
| 1747 | Z = chars_in_text (GPT_ADDR, Z_BYTE - GPT_BYTE) + GPT; | 1765 | Z = chars_in_text (GAP_END_ADDR, Z_BYTE - GPT_BYTE) + GPT; |
| 1748 | 1766 | ||
| 1749 | BEGV_BYTE = advance_to_char_boundary (BEGV_BYTE); | 1767 | BEGV_BYTE = advance_to_char_boundary (BEGV_BYTE); |
| 1750 | if (BEGV_BYTE > GPT_BYTE) | 1768 | if (BEGV_BYTE > GPT_BYTE) |
| 1751 | BEGV = chars_in_text (GPT_ADDR, BEGV_BYTE - GPT_BYTE) + GPT; | 1769 | BEGV = chars_in_text (GAP_END_ADDR, BEGV_BYTE - GPT_BYTE) + GPT; |
| 1752 | else | 1770 | else |
| 1753 | BEGV = chars_in_text (BEG_ADDR, BEGV_BYTE - BEG_BYTE) + BEG; | 1771 | BEGV = chars_in_text (BEG_ADDR, BEGV_BYTE - BEG_BYTE) + BEG; |
| 1754 | 1772 | ||
| 1755 | ZV_BYTE = advance_to_char_boundary (ZV_BYTE); | 1773 | ZV_BYTE = advance_to_char_boundary (ZV_BYTE); |
| 1756 | if (ZV_BYTE > GPT_BYTE) | 1774 | if (ZV_BYTE > GPT_BYTE) |
| 1757 | ZV = chars_in_text (GPT_ADDR, ZV_BYTE - GPT_BYTE) + GPT; | 1775 | ZV = chars_in_text (GAP_END_ADDR, ZV_BYTE - GPT_BYTE) + GPT; |
| 1758 | else | 1776 | else |
| 1759 | ZV = chars_in_text (BEG_ADDR, ZV_BYTE - BEG_BYTE) + BEG; | 1777 | ZV = chars_in_text (BEG_ADDR, ZV_BYTE - BEG_BYTE) + BEG; |
| 1760 | 1778 | ||
| @@ -1763,7 +1781,7 @@ but the contents viewed as characters do change.") | |||
| 1763 | int pt; | 1781 | int pt; |
| 1764 | 1782 | ||
| 1765 | if (pt_byte > GPT_BYTE) | 1783 | if (pt_byte > GPT_BYTE) |
| 1766 | pt = chars_in_text (GPT_ADDR, pt_byte - GPT_BYTE) + GPT; | 1784 | pt = chars_in_text (GAP_END_ADDR, pt_byte - GPT_BYTE) + GPT; |
| 1767 | else | 1785 | else |
| 1768 | pt = chars_in_text (BEG_ADDR, pt_byte - BEG_BYTE) + BEG; | 1786 | pt = chars_in_text (BEG_ADDR, pt_byte - BEG_BYTE) + BEG; |
| 1769 | TEMP_SET_PT_BOTH (pt, pt_byte); | 1787 | TEMP_SET_PT_BOTH (pt, pt_byte); |