diff options
| author | Kenichi Handa | 2006-04-07 05:26:46 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-04-07 05:26:46 +0000 |
| commit | 4347441b23fcb6b6b4058d9dad30e24dee89fc7f (patch) | |
| tree | 247ca87d21303e90ecee7064aa84dd3afa77e6a2 /src | |
| parent | e6335dc16c9c8fad7dc630e9a8261e4178d8e2fa (diff) | |
| download | emacs-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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/coding.c | 31 |
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 | ||