# HG changeset patch # User Kenichi Handa # Date 958780767 0 # Node ID 85822da9ece95981dccc492724d3e5bfe6237dfa # Parent 939760ef7379ad23f8ae8705f3ea83fc961db637 (Finsert_file_contents): Setup src_multibyte and dst_multibyte members of coding. On handling REPLACE on unibyte buffer, convert the result of decode_coding to unibyte. On inserting into a mutibyte buffer, always call code_convert_region. (e_write): Setup cdoing->src_multibyte according to the multibyteness of the source (buffer or string). diff -r 939760ef7379 -r 85822da9ece9 src/fileio.c --- a/src/fileio.c Fri May 19 23:59:04 2000 +0000 +++ b/src/fileio.c Fri May 19 23:59:27 2000 +0000 @@ -3650,6 +3650,9 @@ end-of-line conversion. */ setup_raw_text_coding_system (&coding); + coding.src_multibyte = 0; + coding.dst_multibyte + = !NILP (current_buffer->enable_multibyte_characters); coding_system_decided = 1; } @@ -3672,9 +3675,7 @@ and let the following if-statement handle the replace job. */ if (!NILP (replace) && BEGV < ZV - && ! CODING_REQUIRE_DECODING (&coding) - && (coding.eol_type == CODING_EOL_UNDECIDED - || coding.eol_type == CODING_EOL_LF)) + && !(coding.common_flags & CODING_REQUIRE_DECODING_MASK)) { /* same_at_start and same_at_end count bytes, because file access counts bytes @@ -3711,7 +3712,7 @@ if (coding.type == coding_type_undecided) detect_coding (&coding, buffer, nread); - if (CODING_REQUIRE_DECODING (&coding)) + if (coding.common_flags & CODING_REQUIRE_DECODING_MASK) /* We found that the file should be decoded somehow. Let's give up here. */ { @@ -3929,7 +3930,11 @@ /* Save for next iteration whatever we didn't convert. */ unprocessed = this - coding.consumed; bcopy (read_buf + coding.consumed, read_buf, unprocessed); - this = coding.produced; + if (!NILP (current_buffer->enable_multibyte_characters)) + this = coding.produced; + else + this = str_as_unibyte (conversion_buffer + inserted, + coding.produced); } inserted += this; @@ -4198,34 +4203,27 @@ setup_raw_text_coding_system (&coding); } + if (!NILP (visit) + && (coding.type == coding_type_no_conversion + || coding.type == coding_type_raw_text)) + { + /* Visiting a file with these coding system always make the buffer + unibyte. */ + current_buffer->enable_multibyte_characters = Qnil; + coding.dst_multibyte = 0; + } + if (inserted > 0 || coding.type == coding_type_ccl) { if (CODING_MAY_REQUIRE_DECODING (&coding)) { - /* Here, we don't have to consider byte combining (see the - comment below) because code_convert_region takes care of - it. */ code_convert_region (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted, &coding, 0, 0); - inserted = (NILP (current_buffer->enable_multibyte_characters) - ? coding.produced : coding.produced_char); - } - else if (!NILP (current_buffer->enable_multibyte_characters)) - { - int inserted_byte = inserted; - - /* There's a possibility that we must combine bytes at the - head (resp. the tail) of the just inserted text with the - bytes before (resp. after) the gap to form a single - character. */ - inserted = multibyte_chars_in_text (GPT_ADDR - inserted, inserted); - adjust_after_insert (PT, PT_BYTE, - PT + inserted_byte, PT_BYTE + inserted_byte, - inserted); + inserted = coding.produced_char; } else adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted, - inserted); + inserted); } #ifdef DOS_NT @@ -5020,6 +5018,7 @@ register int nbytes; char buf[WRITE_BUF_SIZE]; int return_val = 0; + int require_encoding_p; if (start >= end) coding->composing = COMPOSITION_DISABLED; @@ -5030,17 +5029,21 @@ { addr = XSTRING (string)->data; nbytes = STRING_BYTES (XSTRING (string)); + coding->src_multibyte = STRING_MULTIBYTE (string); } else if (start < end) { /* It is assured that the gap is not in the range START and END-1. */ addr = CHAR_POS_ADDR (start); nbytes = CHAR_TO_BYTE (end) - CHAR_TO_BYTE (start); + coding->src_multibyte + = !NILP (current_buffer->enable_multibyte_characters); } else { addr = ""; nbytes = 0; + coding->src_multibyte = 1; } /* We used to have a code for handling selective display here. But,