From 4347441b23fcb6b6b4058d9dad30e24dee89fc7f Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Fri, 7 Apr 2006 05:26:46 +0000 Subject: (decode_eol): Pay attention to buffer relocation in del_range_2. (decode_coding): Call decode_eol before restoring undo_list. --- src/coding.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'src/coding.c') 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) if (NILP (coding->dst_object)) { + /* Start deleting '\r' from the tail to minimize the memory + movement. */ for (p = pend - 2; p >= pbeg; p--) if (*p == '\r') { @@ -5632,15 +5634,22 @@ decode_eol (coding) } else { - for (p = pend - 2; p >= pbeg; p--) - if (*p == '\r') - { - int pos_byte = coding->dst_pos_byte + (p - pbeg); - int pos = BYTE_TO_CHAR (pos_byte); - - del_range_2 (pos, pos_byte, pos + 1, pos_byte + 1, 0); - n++; - } + int pos_byte = coding->dst_pos_byte; + int pos = coding->dst_pos; + int pos_end = pos + coding->produced_char - 1; + + while (pos < pos_end) + { + p = BYTE_POS_ADDR (pos_byte); + if (*p == '\r' && p[1] == '\n') + { + del_range_2 (pos, pos_byte, pos + 1, pos_byte + 1, 0); + n++; + pos_end--; + } + pos++; + pos_byte += BYTES_BY_CHAR_HEAD (*p); + } } coding->produced -= n; coding->produced_char -= n; @@ -6258,13 +6267,13 @@ decode_coding (coding) coding->consumed = coding->src_bytes; } + if (! EQ (CODING_ID_EOL_TYPE (coding->id), Qunix)) + decode_eol (coding); if (BUFFERP (coding->dst_object)) { current_buffer->undo_list = undo_list; record_insert (coding->dst_pos, coding->produced_char); } - if (! EQ (CODING_ID_EOL_TYPE (coding->id), Qunix)) - decode_eol (coding); return coding->result; } -- cgit v1.2.1