diff options
author | Kenichi Handa <handa@m17n.org> | 1998-03-04 07:41:41 +0000 |
---|---|---|
committer | Kenichi Handa <handa@m17n.org> | 1998-03-04 07:41:41 +0000 |
commit | 673c57d22a2d87b1d5fcca0065c82d8bcaf7cc1b (patch) | |
tree | 5a032d2c02507a9683a86f02f5d66f59bd0bd19d | |
parent | f49a2d745257638152d17a75320c61c5109cab6f (diff) | |
download | emacs-673c57d22a2d87b1d5fcca0065c82d8bcaf7cc1b.tar.gz |
(Fset_buffer_multibyte): Fix arg for chars_in_text.
Be sure not to have a multibyte sequence striding over the GAP
-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.") } else { + /* Be sure not to have a multibyte sequence striding over the GAP. + Ex: We change this: "...abc\201\241\241 _GAP_ \241\241\241..." + to: "...abc _GAP_ \201\241\241\241\241\241..." */ + + if (GPT_BYTE > 1 && GPT_BYTE < Z_BYTE + && ! CHAR_HEAD_P (*(GAP_END_ADDR))) + { + unsigned char *p = GPT_ADDR - 1; + + while (! CHAR_HEAD_P (*p) && p > BEG_ADDR) p--; + if (BASE_LEADING_CODE_P (*p)) + { + int new_gpt = GPT_BYTE - (GPT_ADDR - p); + + move_gap_both (new_gpt, new_gpt); + } + } + /* Do this first, so that chars_in_text asks the right question. set_intervals_multibyte needs it too. */ current_buffer->enable_multibyte_characters = Qt; @@ -1744,17 +1762,17 @@ but the contents viewed as characters do change.") GPT_BYTE = advance_to_char_boundary (GPT_BYTE); GPT = chars_in_text (BEG_ADDR, GPT_BYTE - BEG_BYTE) + BEG; - Z = chars_in_text (GPT_ADDR, Z_BYTE - GPT_BYTE) + GPT; + Z = chars_in_text (GAP_END_ADDR, Z_BYTE - GPT_BYTE) + GPT; BEGV_BYTE = advance_to_char_boundary (BEGV_BYTE); if (BEGV_BYTE > GPT_BYTE) - BEGV = chars_in_text (GPT_ADDR, BEGV_BYTE - GPT_BYTE) + GPT; + BEGV = chars_in_text (GAP_END_ADDR, BEGV_BYTE - GPT_BYTE) + GPT; else BEGV = chars_in_text (BEG_ADDR, BEGV_BYTE - BEG_BYTE) + BEG; ZV_BYTE = advance_to_char_boundary (ZV_BYTE); if (ZV_BYTE > GPT_BYTE) - ZV = chars_in_text (GPT_ADDR, ZV_BYTE - GPT_BYTE) + GPT; + ZV = chars_in_text (GAP_END_ADDR, ZV_BYTE - GPT_BYTE) + GPT; else ZV = chars_in_text (BEG_ADDR, ZV_BYTE - BEG_BYTE) + BEG; @@ -1763,7 +1781,7 @@ but the contents viewed as characters do change.") int pt; if (pt_byte > GPT_BYTE) - pt = chars_in_text (GPT_ADDR, pt_byte - GPT_BYTE) + GPT; + pt = chars_in_text (GAP_END_ADDR, pt_byte - GPT_BYTE) + GPT; else pt = chars_in_text (BEG_ADDR, pt_byte - BEG_BYTE) + BEG; TEMP_SET_PT_BOTH (pt, pt_byte); |