comparison src/buffer.c @ 21065:fde58556c616

(Fset_buffer_multibyte): Fix arg for chars_in_text. Be sure not to have a multibyte sequence striding over the GAP
author Kenichi Handa <handa@m17n.org>
date Wed, 04 Mar 1998 07:41:41 +0000
parents abc60038dd2b
children 6b0336de5fbe
comparison
equal deleted inserted replaced
21064:90bdbe2754c8 21065:fde58556c616
1735 tail = XMARKER (tail)->chain; 1735 tail = XMARKER (tail)->chain;
1736 } 1736 }
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;
1743 1761
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
1761 { 1779 {
1762 int pt_byte = advance_to_char_boundary (PT_BYTE); 1780 int pt_byte = advance_to_char_boundary (PT_BYTE);
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);
1770 } 1788 }
1771 1789