aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorKenichi Handa1998-03-04 07:41:41 +0000
committerKenichi Handa1998-03-04 07:41:41 +0000
commit673c57d22a2d87b1d5fcca0065c82d8bcaf7cc1b (patch)
tree5a032d2c02507a9683a86f02f5d66f59bd0bd19d /src/buffer.c
parentf49a2d745257638152d17a75320c61c5109cab6f (diff)
downloademacs-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.c26
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);