Mercurial > emacs
changeset 91344:56f3473b139e
(decode_coding_object): Adjuste marker positions after
conversion.
(encode_coding_object): Likewise.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 18 Jan 2008 07:08:52 +0000 |
parents | 347746964570 |
children | f8775578c21a |
files | src/coding.c |
diffstat | 1 files changed, 68 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/coding.c Fri Jan 18 07:07:37 2008 +0000 +++ b/src/coding.c Fri Jan 18 07:08:52 2008 +0000 @@ -6851,6 +6851,7 @@ Lisp_Object attrs; Lisp_Object buffer; int saved_pt = -1, saved_pt_byte; + int need_marker_adjustment = 0; buffer = Fcurrent_buffer (); @@ -6877,6 +6878,14 @@ move_gap_both (from, from_byte); if (EQ (src_object, dst_object)) { + struct Lisp_Marker *tail; + + for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next) + { + tail->need_adjustment + = tail->charpos == (tail->insertion_type ? from : to); + need_marker_adjustment |= tail->need_adjustment; + } saved_pt = PT, saved_pt_byte = PT_BYTE; TEMP_SET_PT_BOTH (from, from_byte); del_range_both (from, from_byte, to, to_byte, 1); @@ -6982,6 +6991,29 @@ else TEMP_SET_PT_BOTH (saved_pt + (coding->produced - bytes), saved_pt_byte + (coding->produced - bytes)); + + if (need_marker_adjustment) + { + struct Lisp_Marker *tail; + + for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next) + if (tail->need_adjustment) + { + tail->need_adjustment = 0; + if (tail->insertion_type) + { + tail->bytepos = from_byte; + tail->charpos = from; + } + else + { + tail->bytepos = from_byte + coding->produced; + tail->charpos + = (NILP (current_buffer->enable_multibyte_characters) + ? tail->bytepos : from + coding->produced_char); + } + } + } } unbind_to (count, coding->dst_object); @@ -7002,6 +7034,7 @@ Lisp_Object attrs; Lisp_Object buffer; int saved_pt = -1, saved_pt_byte; + int need_marker_adjustment = 0; int kill_src_buffer = 0; buffer = Fcurrent_buffer (); @@ -7013,6 +7046,18 @@ attrs = CODING_ID_ATTRS (coding->id); + if (EQ (src_object, dst_object)) + { + struct Lisp_Marker *tail; + + for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next) + { + tail->need_adjustment + = tail->charpos == (tail->insertion_type ? from : to); + need_marker_adjustment |= tail->need_adjustment; + } + } + if (! NILP (CODING_ATTR_PRE_WRITE (attrs))) { coding->src_object = code_conversion_save (1, coding->src_multibyte); @@ -7142,6 +7187,29 @@ else TEMP_SET_PT_BOTH (saved_pt + (coding->produced - bytes), saved_pt_byte + (coding->produced - bytes)); + + if (need_marker_adjustment) + { + struct Lisp_Marker *tail; + + for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next) + if (tail->need_adjustment) + { + tail->need_adjustment = 0; + if (tail->insertion_type) + { + tail->bytepos = from_byte; + tail->charpos = from; + } + else + { + tail->bytepos = from_byte + coding->produced; + tail->charpos + = (NILP (current_buffer->enable_multibyte_characters) + ? tail->bytepos : from + coding->produced_char); + } + } + } } if (kill_src_buffer)