aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenichi Handa2006-04-07 05:26:46 +0000
committerKenichi Handa2006-04-07 05:26:46 +0000
commit4347441b23fcb6b6b4058d9dad30e24dee89fc7f (patch)
tree247ca87d21303e90ecee7064aa84dd3afa77e6a2
parente6335dc16c9c8fad7dc630e9a8261e4178d8e2fa (diff)
downloademacs-4347441b23fcb6b6b4058d9dad30e24dee89fc7f.tar.gz
emacs-4347441b23fcb6b6b4058d9dad30e24dee89fc7f.zip
(decode_eol): Pay attention to buffer relocation in
del_range_2. (decode_coding): Call decode_eol before restoring undo_list.
-rw-r--r--src/coding.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/coding.c b/src/coding.c
index 648b6675053..af729775f92 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -5623,6 +5623,8 @@ decode_eol (coding)
5623 5623
5624 if (NILP (coding->dst_object)) 5624 if (NILP (coding->dst_object))
5625 { 5625 {
5626 /* Start deleting '\r' from the tail to minimize the memory
5627 movement. */
5626 for (p = pend - 2; p >= pbeg; p--) 5628 for (p = pend - 2; p >= pbeg; p--)
5627 if (*p == '\r') 5629 if (*p == '\r')
5628 { 5630 {
@@ -5632,15 +5634,22 @@ decode_eol (coding)
5632 } 5634 }
5633 else 5635 else
5634 { 5636 {
5635 for (p = pend - 2; p >= pbeg; p--) 5637 int pos_byte = coding->dst_pos_byte;
5636 if (*p == '\r') 5638 int pos = coding->dst_pos;
5637 { 5639 int pos_end = pos + coding->produced_char - 1;
5638 int pos_byte = coding->dst_pos_byte + (p - pbeg); 5640
5639 int pos = BYTE_TO_CHAR (pos_byte); 5641 while (pos < pos_end)
5640 5642 {
5641 del_range_2 (pos, pos_byte, pos + 1, pos_byte + 1, 0); 5643 p = BYTE_POS_ADDR (pos_byte);
5642 n++; 5644 if (*p == '\r' && p[1] == '\n')
5643 } 5645 {
5646 del_range_2 (pos, pos_byte, pos + 1, pos_byte + 1, 0);
5647 n++;
5648 pos_end--;
5649 }
5650 pos++;
5651 pos_byte += BYTES_BY_CHAR_HEAD (*p);
5652 }
5644 } 5653 }
5645 coding->produced -= n; 5654 coding->produced -= n;
5646 coding->produced_char -= n; 5655 coding->produced_char -= n;
@@ -6258,13 +6267,13 @@ decode_coding (coding)
6258 coding->consumed = coding->src_bytes; 6267 coding->consumed = coding->src_bytes;
6259 } 6268 }
6260 6269
6270 if (! EQ (CODING_ID_EOL_TYPE (coding->id), Qunix))
6271 decode_eol (coding);
6261 if (BUFFERP (coding->dst_object)) 6272 if (BUFFERP (coding->dst_object))
6262 { 6273 {
6263 current_buffer->undo_list = undo_list; 6274 current_buffer->undo_list = undo_list;
6264 record_insert (coding->dst_pos, coding->produced_char); 6275 record_insert (coding->dst_pos, coding->produced_char);
6265 } 6276 }
6266 if (! EQ (CODING_ID_EOL_TYPE (coding->id), Qunix))
6267 decode_eol (coding);
6268 return coding->result; 6277 return coding->result;
6269} 6278}
6270 6279