diff options
| author | Kenichi Handa | 2002-03-01 01:38:37 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2002-03-01 01:38:37 +0000 |
| commit | db327c7e5a7faa4c5124be4ee09ebe6ef06e37c2 (patch) | |
| tree | 665a219b3c08a5d08b5da63c42810a81366b938c /src | |
| parent | e37d7195c571ff9f57210f334b552eee59be4186 (diff) | |
| download | emacs-db327c7e5a7faa4c5124be4ee09ebe6ef06e37c2.tar.gz emacs-db327c7e5a7faa4c5124be4ee09ebe6ef06e37c2.zip | |
Include "character.h" instead of "charset.h".
(Finsert_file_contents): Big change for the new code-conversion
API.
(choose_write_coding_system): Likewise.
(Fwrite_region): Likewise.
(build_annotations_2): Deleted.
(e_write): Big change for the new code-conversion API.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fileio.c | 451 |
1 files changed, 177 insertions, 274 deletions
diff --git a/src/fileio.c b/src/fileio.c index 894189008d5..529722ded82 100644 --- a/src/fileio.c +++ b/src/fileio.c | |||
| @@ -87,7 +87,7 @@ extern int errno; | |||
| 87 | #include "lisp.h" | 87 | #include "lisp.h" |
| 88 | #include "intervals.h" | 88 | #include "intervals.h" |
| 89 | #include "buffer.h" | 89 | #include "buffer.h" |
| 90 | #include "charset.h" | 90 | #include "character.h" |
| 91 | #include "coding.h" | 91 | #include "coding.h" |
| 92 | #include "window.h" | 92 | #include "window.h" |
| 93 | 93 | ||
| @@ -3576,7 +3576,7 @@ actually used. */) | |||
| 3576 | unsigned char buffer[1 << 14]; | 3576 | unsigned char buffer[1 << 14]; |
| 3577 | int replace_handled = 0; | 3577 | int replace_handled = 0; |
| 3578 | int set_coding_system = 0; | 3578 | int set_coding_system = 0; |
| 3579 | int coding_system_decided = 0; | 3579 | Lisp_Object coding_system; |
| 3580 | int read_quit = 0; | 3580 | int read_quit = 0; |
| 3581 | 3581 | ||
| 3582 | if (current_buffer->base_buffer && ! NILP (visit)) | 3582 | if (current_buffer->base_buffer && ! NILP (visit)) |
| @@ -3713,20 +3713,20 @@ actually used. */) | |||
| 3713 | } | 3713 | } |
| 3714 | } | 3714 | } |
| 3715 | 3715 | ||
| 3716 | /* The value Qnil means that the coding system is not yet | ||
| 3717 | decided. */ | ||
| 3718 | coding_system = Qnil; | ||
| 3716 | if (BEG < Z) | 3719 | if (BEG < Z) |
| 3717 | { | 3720 | { |
| 3718 | /* Decide the coding system to use for reading the file now | 3721 | /* Decide the coding system to use for reading the file now |
| 3719 | because we can't use an optimized method for handling | 3722 | because we can't use an optimized method for handling |
| 3720 | `coding:' tag if the current buffer is not empty. */ | 3723 | `coding:' tag if the current buffer is not empty. */ |
| 3721 | Lisp_Object val; | ||
| 3722 | val = Qnil; | ||
| 3723 | |||
| 3724 | if (!NILP (Vcoding_system_for_read)) | 3724 | if (!NILP (Vcoding_system_for_read)) |
| 3725 | val = Vcoding_system_for_read; | 3725 | coding_system = Vcoding_system_for_read; |
| 3726 | else if (! NILP (replace)) | 3726 | else if (! NILP (replace)) |
| 3727 | /* In REPLACE mode, we can use the same coding system | 3727 | /* In REPLACE mode, we can use the same coding system |
| 3728 | that was used to visit the file. */ | 3728 | that was used to visit the file. */ |
| 3729 | val = current_buffer->buffer_file_coding_system; | 3729 | coding_system = current_buffer->buffer_file_coding_system; |
| 3730 | else | 3730 | else |
| 3731 | { | 3731 | { |
| 3732 | /* Don't try looking inside a file for a coding system | 3732 | /* Don't try looking inside a file for a coding system |
| @@ -3773,8 +3773,8 @@ actually used. */) | |||
| 3773 | current_buffer->enable_multibyte_characters = Qnil; | 3773 | current_buffer->enable_multibyte_characters = Qnil; |
| 3774 | insert_1_both (read_buf, nread, nread, 0, 0, 0); | 3774 | insert_1_both (read_buf, nread, nread, 0, 0, 0); |
| 3775 | TEMP_SET_PT_BOTH (BEG, BEG_BYTE); | 3775 | TEMP_SET_PT_BOTH (BEG, BEG_BYTE); |
| 3776 | val = call2 (Vset_auto_coding_function, | 3776 | coding_system = call2 (Vset_auto_coding_function, |
| 3777 | filename, make_number (nread)); | 3777 | filename, make_number (nread)); |
| 3778 | set_buffer_internal (prev); | 3778 | set_buffer_internal (prev); |
| 3779 | 3779 | ||
| 3780 | /* Remove the binding for standard-output. */ | 3780 | /* Remove the binding for standard-output. */ |
| @@ -3791,7 +3791,7 @@ actually used. */) | |||
| 3791 | } | 3791 | } |
| 3792 | } | 3792 | } |
| 3793 | 3793 | ||
| 3794 | if (NILP (val)) | 3794 | if (NILP (coding_system)) |
| 3795 | { | 3795 | { |
| 3796 | /* If we have not yet decided a coding system, check | 3796 | /* If we have not yet decided a coding system, check |
| 3797 | file-coding-system-alist. */ | 3797 | file-coding-system-alist. */ |
| @@ -3805,20 +3805,19 @@ actually used. */) | |||
| 3805 | } | 3805 | } |
| 3806 | } | 3806 | } |
| 3807 | 3807 | ||
| 3808 | setup_coding_system (Fcheck_coding_system (val), &coding); | 3808 | if (NILP (coding_system)) |
| 3809 | /* Ensure we set Vlast_coding_system_used. */ | 3809 | coding_system = Qundecided; |
| 3810 | set_coding_system = 1; | 3810 | else |
| 3811 | CHECK_CODING_SYSTEM (coding_system); | ||
| 3811 | 3812 | ||
| 3812 | if (NILP (current_buffer->enable_multibyte_characters) | 3813 | if (NILP (current_buffer->enable_multibyte_characters)) |
| 3813 | && ! NILP (val)) | ||
| 3814 | /* We must suppress all character code conversion except for | 3814 | /* We must suppress all character code conversion except for |
| 3815 | end-of-line conversion. */ | 3815 | end-of-line conversion. */ |
| 3816 | setup_raw_text_coding_system (&coding); | 3816 | coding_system = raw_text_coding_system (coding_system); |
| 3817 | 3817 | ||
| 3818 | coding.src_multibyte = 0; | 3818 | setup_coding_system (coding_system, &coding); |
| 3819 | coding.dst_multibyte | 3819 | /* Ensure we set Vlast_coding_system_used. */ |
| 3820 | = !NILP (current_buffer->enable_multibyte_characters); | 3820 | set_coding_system = 1; |
| 3821 | coding_system_decided = 1; | ||
| 3822 | } | 3821 | } |
| 3823 | 3822 | ||
| 3824 | /* If requested, replace the accessible part of the buffer | 3823 | /* If requested, replace the accessible part of the buffer |
| @@ -3837,7 +3836,8 @@ actually used. */) | |||
| 3837 | and let the following if-statement handle the replace job. */ | 3836 | and let the following if-statement handle the replace job. */ |
| 3838 | if (!NILP (replace) | 3837 | if (!NILP (replace) |
| 3839 | && BEGV < ZV | 3838 | && BEGV < ZV |
| 3840 | && !(coding.common_flags & CODING_REQUIRE_DECODING_MASK)) | 3839 | && (NILP (coding_system) |
| 3840 | || ! CODING_REQUIRE_DECODING (&coding))) | ||
| 3841 | { | 3841 | { |
| 3842 | /* same_at_start and same_at_end count bytes, | 3842 | /* same_at_start and same_at_end count bytes, |
| 3843 | because file access counts bytes | 3843 | because file access counts bytes |
| @@ -3872,21 +3872,14 @@ actually used. */) | |||
| 3872 | else if (nread == 0) | 3872 | else if (nread == 0) |
| 3873 | break; | 3873 | break; |
| 3874 | 3874 | ||
| 3875 | if (coding.type == coding_type_undecided) | 3875 | if (CODING_REQUIRE_DETECTION (&coding)) |
| 3876 | detect_coding (&coding, buffer, nread); | ||
| 3877 | if (coding.common_flags & CODING_REQUIRE_DECODING_MASK) | ||
| 3878 | /* We found that the file should be decoded somehow. | ||
| 3879 | Let's give up here. */ | ||
| 3880 | { | 3876 | { |
| 3881 | giveup_match_end = 1; | 3877 | coding_system = detect_coding_system (buffer, nread, 1, 0, |
| 3882 | break; | 3878 | coding_system); |
| 3879 | setup_coding_system (coding_system, &coding); | ||
| 3883 | } | 3880 | } |
| 3884 | 3881 | if (CODING_REQUIRE_DECODING (&coding)) | |
| 3885 | if (coding.eol_type == CODING_EOL_UNDECIDED) | 3882 | /* We found that the file should be decoded somehow. |
| 3886 | detect_eol (&coding, buffer, nread); | ||
| 3887 | if (coding.eol_type != CODING_EOL_UNDECIDED | ||
| 3888 | && coding.eol_type != CODING_EOL_LF) | ||
| 3889 | /* We found that the format of eol should be decoded. | ||
| 3890 | Let's give up here. */ | 3883 | Let's give up here. */ |
| 3891 | { | 3884 | { |
| 3892 | giveup_match_end = 1; | 3885 | giveup_match_end = 1; |
| @@ -4033,17 +4026,20 @@ actually used. */) | |||
| 4033 | int same_at_end = ZV_BYTE; | 4026 | int same_at_end = ZV_BYTE; |
| 4034 | int overlap; | 4027 | int overlap; |
| 4035 | int bufpos; | 4028 | int bufpos; |
| 4036 | /* Make sure that the gap is large enough. */ | 4029 | unsigned char *decoded; |
| 4037 | int bufsize = 2 * st.st_size; | ||
| 4038 | unsigned char *conversion_buffer = (unsigned char *) xmalloc (bufsize); | ||
| 4039 | int temp; | 4030 | int temp; |
| 4031 | int this_count = BINDING_STACK_SIZE (); | ||
| 4032 | Lisp_Object conversion_buffer | ||
| 4033 | = make_conversion_work_buffer (! NILP (current_buffer | ||
| 4034 | ->enable_multibyte_characters)); | ||
| 4035 | |||
| 4036 | record_unwind_protect (code_conversion_restore, save_excursion_save ()); | ||
| 4040 | 4037 | ||
| 4041 | /* First read the whole file, performing code conversion into | 4038 | /* First read the whole file, performing code conversion into |
| 4042 | CONVERSION_BUFFER. */ | 4039 | CONVERSION_BUFFER. */ |
| 4043 | 4040 | ||
| 4044 | if (lseek (fd, XINT (beg), 0) < 0) | 4041 | if (lseek (fd, XINT (beg), 0) < 0) |
| 4045 | { | 4042 | { |
| 4046 | xfree (conversion_buffer); | ||
| 4047 | report_file_error ("Setting file position", | 4043 | report_file_error ("Setting file position", |
| 4048 | Fcons (orig_filename, Qnil)); | 4044 | Fcons (orig_filename, Qnil)); |
| 4049 | } | 4045 | } |
| @@ -4055,71 +4051,41 @@ actually used. */) | |||
| 4055 | 4051 | ||
| 4056 | while (how_much < total) | 4052 | while (how_much < total) |
| 4057 | { | 4053 | { |
| 4054 | /* We read one bunch by one (READ_BUF_SIZE bytes) to allow | ||
| 4055 | quitting while reading a huge while. */ | ||
| 4058 | /* try is reserved in some compilers (Microsoft C) */ | 4056 | /* try is reserved in some compilers (Microsoft C) */ |
| 4059 | int trytry = min (total - how_much, READ_BUF_SIZE - unprocessed); | 4057 | int trytry = min (total - how_much, READ_BUF_SIZE - unprocessed); |
| 4060 | unsigned char *destination = read_buf + unprocessed; | ||
| 4061 | int this; | 4058 | int this; |
| 4062 | 4059 | ||
| 4063 | /* Allow quitting out of the actual I/O. */ | 4060 | /* Allow quitting out of the actual I/O. */ |
| 4064 | immediate_quit = 1; | 4061 | immediate_quit = 1; |
| 4065 | QUIT; | 4062 | QUIT; |
| 4066 | this = emacs_read (fd, destination, trytry); | 4063 | this = emacs_read (fd, read_buf + unprocessed, trytry); |
| 4067 | immediate_quit = 0; | 4064 | immediate_quit = 0; |
| 4068 | 4065 | ||
| 4069 | if (this < 0 || this + unprocessed == 0) | 4066 | if (this <= 0) |
| 4070 | { | 4067 | { |
| 4071 | how_much = this; | 4068 | if (this < 0) |
| 4069 | how_much = this; | ||
| 4072 | break; | 4070 | break; |
| 4073 | } | 4071 | } |
| 4074 | 4072 | ||
| 4075 | how_much += this; | 4073 | how_much += this; |
| 4076 | 4074 | ||
| 4077 | if (CODING_MAY_REQUIRE_DECODING (&coding)) | 4075 | decode_coding_c_string (&coding, read_buf, unprocessed + this, |
| 4078 | { | 4076 | conversion_buffer); |
| 4079 | int require, result; | 4077 | unprocessed = coding.carryover_bytes; |
| 4080 | 4078 | if (coding.carryover_bytes > 0) | |
| 4081 | this += unprocessed; | 4079 | bcopy (coding.carryover, read_buf, unprocessed); |
| 4082 | 4080 | } | |
| 4083 | /* If we are using more space than estimated, | 4081 | |
| 4084 | make CONVERSION_BUFFER bigger. */ | 4082 | emacs_close (fd); |
| 4085 | require = decoding_buffer_size (&coding, this); | ||
| 4086 | if (inserted + require + 2 * (total - how_much) > bufsize) | ||
| 4087 | { | ||
| 4088 | bufsize = inserted + require + 2 * (total - how_much); | ||
| 4089 | conversion_buffer = (unsigned char *) xrealloc (conversion_buffer, bufsize); | ||
| 4090 | } | ||
| 4091 | |||
| 4092 | /* Convert this batch with results in CONVERSION_BUFFER. */ | ||
| 4093 | if (how_much >= total) /* This is the last block. */ | ||
| 4094 | coding.mode |= CODING_MODE_LAST_BLOCK; | ||
| 4095 | if (coding.composing != COMPOSITION_DISABLED) | ||
| 4096 | coding_allocate_composition_data (&coding, BEGV); | ||
| 4097 | result = decode_coding (&coding, read_buf, | ||
| 4098 | conversion_buffer + inserted, | ||
| 4099 | this, bufsize - inserted); | ||
| 4100 | |||
| 4101 | /* Save for next iteration whatever we didn't convert. */ | ||
| 4102 | unprocessed = this - coding.consumed; | ||
| 4103 | bcopy (read_buf + coding.consumed, read_buf, unprocessed); | ||
| 4104 | if (!NILP (current_buffer->enable_multibyte_characters)) | ||
| 4105 | this = coding.produced; | ||
| 4106 | else | ||
| 4107 | this = str_as_unibyte (conversion_buffer + inserted, | ||
| 4108 | coding.produced); | ||
| 4109 | } | ||
| 4110 | |||
| 4111 | inserted += this; | ||
| 4112 | } | ||
| 4113 | 4083 | ||
| 4114 | /* At this point, INSERTED is how many characters (i.e. bytes) | 4084 | /* At this point, HOW_MUCH should equal TOTAL, or should be <= 0 |
| 4115 | are present in CONVERSION_BUFFER. | 4085 | if we couldn't read the file. */ |
| 4116 | HOW_MUCH should equal TOTAL, | ||
| 4117 | or should be <= 0 if we couldn't read the file. */ | ||
| 4118 | 4086 | ||
| 4119 | if (how_much < 0) | 4087 | if (how_much < 0) |
| 4120 | { | 4088 | { |
| 4121 | xfree (conversion_buffer); | ||
| 4122 | |||
| 4123 | if (how_much == -1) | 4089 | if (how_much == -1) |
| 4124 | error ("IO error reading %s: %s", | 4090 | error ("IO error reading %s: %s", |
| 4125 | XSTRING (orig_filename)->data, emacs_strerror (errno)); | 4091 | XSTRING (orig_filename)->data, emacs_strerror (errno)); |
| @@ -4127,21 +4093,30 @@ actually used. */) | |||
| 4127 | error ("maximum buffer size exceeded"); | 4093 | error ("maximum buffer size exceeded"); |
| 4128 | } | 4094 | } |
| 4129 | 4095 | ||
| 4130 | /* Compare the beginning of the converted file | 4096 | if (unprocessed > 0) |
| 4131 | with the buffer text. */ | 4097 | { |
| 4098 | coding.mode |= CODING_MODE_LAST_BLOCK; | ||
| 4099 | decode_coding_c_string (&coding, read_buf, unprocessed, | ||
| 4100 | conversion_buffer); | ||
| 4101 | coding.mode &= ~CODING_MODE_LAST_BLOCK; | ||
| 4102 | } | ||
| 4103 | |||
| 4104 | decoded = BUF_BEG_ADDR (XBUFFER (conversion_buffer)); | ||
| 4105 | inserted = BUF_Z_BYTE (XBUFFER (conversion_buffer)); | ||
| 4106 | |||
| 4107 | /* Compare the beginning of the converted string with the buffer | ||
| 4108 | text. */ | ||
| 4132 | 4109 | ||
| 4133 | bufpos = 0; | 4110 | bufpos = 0; |
| 4134 | while (bufpos < inserted && same_at_start < same_at_end | 4111 | while (bufpos < inserted && same_at_start < same_at_end |
| 4135 | && FETCH_BYTE (same_at_start) == conversion_buffer[bufpos]) | 4112 | && FETCH_BYTE (same_at_start) == decoded[bufpos]) |
| 4136 | same_at_start++, bufpos++; | 4113 | same_at_start++, bufpos++; |
| 4137 | 4114 | ||
| 4138 | /* If the file matches the buffer completely, | 4115 | /* If the file matches the head of buffer completely, |
| 4139 | there's no need to replace anything. */ | 4116 | there's no need to replace anything. */ |
| 4140 | 4117 | ||
| 4141 | if (bufpos == inserted) | 4118 | if (bufpos == inserted) |
| 4142 | { | 4119 | { |
| 4143 | xfree (conversion_buffer); | ||
| 4144 | emacs_close (fd); | ||
| 4145 | specpdl_ptr--; | 4120 | specpdl_ptr--; |
| 4146 | /* Truncate the buffer to the size of the file. */ | 4121 | /* Truncate the buffer to the size of the file. */ |
| 4147 | del_range_byte (same_at_start, same_at_end, 0); | 4122 | del_range_byte (same_at_start, same_at_end, 0); |
| @@ -4149,8 +4124,8 @@ actually used. */) | |||
| 4149 | goto handled; | 4124 | goto handled; |
| 4150 | } | 4125 | } |
| 4151 | 4126 | ||
| 4152 | /* Extend the start of non-matching text area to multibyte | 4127 | /* Extend the start of non-matching text area to the previous |
| 4153 | character boundary. */ | 4128 | multibyte character boundary. */ |
| 4154 | if (! NILP (current_buffer->enable_multibyte_characters)) | 4129 | if (! NILP (current_buffer->enable_multibyte_characters)) |
| 4155 | while (same_at_start > BEGV_BYTE | 4130 | while (same_at_start > BEGV_BYTE |
| 4156 | && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start))) | 4131 | && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start))) |
| @@ -4163,11 +4138,11 @@ actually used. */) | |||
| 4163 | /* Compare with same_at_start to avoid counting some buffer text | 4138 | /* Compare with same_at_start to avoid counting some buffer text |
| 4164 | as matching both at the file's beginning and at the end. */ | 4139 | as matching both at the file's beginning and at the end. */ |
| 4165 | while (bufpos > 0 && same_at_end > same_at_start | 4140 | while (bufpos > 0 && same_at_end > same_at_start |
| 4166 | && FETCH_BYTE (same_at_end - 1) == conversion_buffer[bufpos - 1]) | 4141 | && FETCH_BYTE (same_at_end - 1) == decoded[bufpos - 1]) |
| 4167 | same_at_end--, bufpos--; | 4142 | same_at_end--, bufpos--; |
| 4168 | 4143 | ||
| 4169 | /* Extend the end of non-matching text area to multibyte | 4144 | /* Extend the end of non-matching text area to the next |
| 4170 | character boundary. */ | 4145 | multibyte character boundary. */ |
| 4171 | if (! NILP (current_buffer->enable_multibyte_characters)) | 4146 | if (! NILP (current_buffer->enable_multibyte_characters)) |
| 4172 | while (same_at_end < ZV_BYTE | 4147 | while (same_at_end < ZV_BYTE |
| 4173 | && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end))) | 4148 | && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end))) |
| @@ -4185,11 +4160,11 @@ actually used. */) | |||
| 4185 | 4160 | ||
| 4186 | /* Replace the chars that we need to replace, | 4161 | /* Replace the chars that we need to replace, |
| 4187 | and update INSERTED to equal the number of bytes | 4162 | and update INSERTED to equal the number of bytes |
| 4188 | we are taking from the file. */ | 4163 | we are taking from the decoded string. */ |
| 4189 | inserted -= (Z_BYTE - same_at_end) + (same_at_start - BEG_BYTE); | 4164 | inserted -= (Z_BYTE - same_at_end) + (same_at_start - BEG_BYTE); |
| 4190 | 4165 | ||
| 4191 | if (same_at_end != same_at_start) | 4166 | if (same_at_end != same_at_start) |
| 4192 | { | 4167 | { |
| 4193 | del_range_byte (same_at_start, same_at_end, 0); | 4168 | del_range_byte (same_at_start, same_at_end, 0); |
| 4194 | temp = GPT; | 4169 | temp = GPT; |
| 4195 | same_at_start = GPT_BYTE; | 4170 | same_at_start = GPT_BYTE; |
| @@ -4200,18 +4175,16 @@ actually used. */) | |||
| 4200 | } | 4175 | } |
| 4201 | /* Insert from the file at the proper position. */ | 4176 | /* Insert from the file at the proper position. */ |
| 4202 | SET_PT_BOTH (temp, same_at_start); | 4177 | SET_PT_BOTH (temp, same_at_start); |
| 4203 | insert_1 (conversion_buffer + same_at_start - BEG_BYTE, inserted, | 4178 | insert_from_buffer (XBUFFER (conversion_buffer), |
| 4204 | 0, 0, 0); | 4179 | buf_bytepos_to_charpos (XBUFFER (conversion_buffer), |
| 4205 | if (coding.cmp_data && coding.cmp_data->used) | 4180 | same_at_start), |
| 4206 | coding_restore_composition (&coding, Fcurrent_buffer ()); | 4181 | buf_bytepos_to_charpos (XBUFFER (conversion_buffer), |
| 4207 | coding_free_composition_data (&coding); | 4182 | same_at_start + inserted), |
| 4208 | 4183 | 0); | |
| 4209 | /* Set `inserted' to the number of inserted characters. */ | 4184 | /* Set `inserted' to the number of inserted characters. */ |
| 4210 | inserted = PT - temp; | 4185 | inserted = PT - temp; |
| 4211 | 4186 | ||
| 4212 | xfree (conversion_buffer); | 4187 | unbind_to (this_count, Qnil); |
| 4213 | emacs_close (fd); | ||
| 4214 | specpdl_ptr--; | ||
| 4215 | 4188 | ||
| 4216 | goto handled; | 4189 | goto handled; |
| 4217 | } | 4190 | } |
| @@ -4255,7 +4228,7 @@ actually used. */) | |||
| 4255 | inserted = 0; | 4228 | inserted = 0; |
| 4256 | 4229 | ||
| 4257 | /* Here, we don't do code conversion in the loop. It is done by | 4230 | /* Here, we don't do code conversion in the loop. It is done by |
| 4258 | code_convert_region after all data are read into the buffer. */ | 4231 | decode_coding_gap after all data are read into the buffer. */ |
| 4259 | { | 4232 | { |
| 4260 | int gap_size = GAP_SIZE; | 4233 | int gap_size = GAP_SIZE; |
| 4261 | 4234 | ||
| @@ -4346,18 +4319,16 @@ actually used. */) | |||
| 4346 | 4319 | ||
| 4347 | notfound: | 4320 | notfound: |
| 4348 | 4321 | ||
| 4349 | if (! coding_system_decided) | 4322 | if (NILP (coding_system)) |
| 4350 | { | 4323 | { |
| 4351 | /* The coding system is not yet decided. Decide it by an | 4324 | /* The coding system is not yet decided. Decide it by an |
| 4352 | optimized method for handling `coding:' tag. | 4325 | optimized method for handling `coding:' tag. |
| 4353 | 4326 | ||
| 4354 | Note that we can get here only if the buffer was empty | 4327 | Note that we can get here only if the buffer was empty |
| 4355 | before the insertion. */ | 4328 | before the insertion. */ |
| 4356 | Lisp_Object val; | ||
| 4357 | val = Qnil; | ||
| 4358 | 4329 | ||
| 4359 | if (!NILP (Vcoding_system_for_read)) | 4330 | if (!NILP (Vcoding_system_for_read)) |
| 4360 | val = Vcoding_system_for_read; | 4331 | coding_system = Vcoding_system_for_read; |
| 4361 | else | 4332 | else |
| 4362 | { | 4333 | { |
| 4363 | /* Since we are sure that the current buffer was empty | 4334 | /* Since we are sure that the current buffer was empty |
| @@ -4378,11 +4349,11 @@ actually used. */) | |||
| 4378 | 4349 | ||
| 4379 | if (inserted > 0 && ! NILP (Vset_auto_coding_function)) | 4350 | if (inserted > 0 && ! NILP (Vset_auto_coding_function)) |
| 4380 | { | 4351 | { |
| 4381 | val = call2 (Vset_auto_coding_function, | 4352 | coding_system = call2 (Vset_auto_coding_function, |
| 4382 | filename, make_number (inserted)); | 4353 | filename, make_number (inserted)); |
| 4383 | } | 4354 | } |
| 4384 | 4355 | ||
| 4385 | if (NILP (val)) | 4356 | if (NILP (coding_system)) |
| 4386 | { | 4357 | { |
| 4387 | /* If the coding system is not yet decided, check | 4358 | /* If the coding system is not yet decided, check |
| 4388 | file-coding-system-alist. */ | 4359 | file-coding-system-alist. */ |
| @@ -4392,66 +4363,70 @@ actually used. */) | |||
| 4392 | args[2] = visit, args[3] = beg, args[4] = end, args[5] = Qnil; | 4363 | args[2] = visit, args[3] = beg, args[4] = end, args[5] = Qnil; |
| 4393 | coding_systems = Ffind_operation_coding_system (6, args); | 4364 | coding_systems = Ffind_operation_coding_system (6, args); |
| 4394 | if (CONSP (coding_systems)) | 4365 | if (CONSP (coding_systems)) |
| 4395 | val = XCAR (coding_systems); | 4366 | coding_system = XCAR (coding_systems); |
| 4396 | } | 4367 | } |
| 4397 | 4368 | ||
| 4398 | unbind_to (count, Qnil); | 4369 | unbind_to (count, Qnil); |
| 4399 | inserted = Z_BYTE - BEG_BYTE; | 4370 | inserted = Z_BYTE - BEG_BYTE; |
| 4400 | } | 4371 | } |
| 4401 | 4372 | ||
| 4402 | /* The following kludgy code is to avoid some compiler bug. | 4373 | if (NILP (coding_system)) |
| 4403 | We can't simply do | 4374 | coding_system = Qundecided; |
| 4404 | setup_coding_system (val, &coding); | 4375 | else |
| 4405 | on some system. */ | 4376 | CHECK_CODING_SYSTEM (coding_system); |
| 4406 | { | ||
| 4407 | struct coding_system temp_coding; | ||
| 4408 | setup_coding_system (val, &temp_coding); | ||
| 4409 | bcopy (&temp_coding, &coding, sizeof coding); | ||
| 4410 | } | ||
| 4411 | /* Ensure we set Vlast_coding_system_used. */ | ||
| 4412 | set_coding_system = 1; | ||
| 4413 | 4377 | ||
| 4414 | if (NILP (current_buffer->enable_multibyte_characters) | 4378 | if (NILP (current_buffer->enable_multibyte_characters)) |
| 4415 | && ! NILP (val)) | ||
| 4416 | /* We must suppress all character code conversion except for | 4379 | /* We must suppress all character code conversion except for |
| 4417 | end-of-line conversion. */ | 4380 | end-of-line conversion. */ |
| 4418 | setup_raw_text_coding_system (&coding); | 4381 | coding_system = raw_text_coding_system (coding_system); |
| 4419 | coding.src_multibyte = 0; | ||
| 4420 | coding.dst_multibyte | ||
| 4421 | = !NILP (current_buffer->enable_multibyte_characters); | ||
| 4422 | } | ||
| 4423 | 4382 | ||
| 4424 | if (!NILP (visit) | 4383 | setup_coding_system (coding_system, &coding); |
| 4425 | /* Can't do this if part of the buffer might be preserved. */ | 4384 | /* Ensure we set Vlast_coding_system_used. */ |
| 4426 | && NILP (replace) | 4385 | set_coding_system = 1; |
| 4427 | && (coding.type == coding_type_no_conversion | ||
| 4428 | || coding.type == coding_type_raw_text)) | ||
| 4429 | { | ||
| 4430 | /* Visiting a file with these coding system makes the buffer | ||
| 4431 | unibyte. */ | ||
| 4432 | current_buffer->enable_multibyte_characters = Qnil; | ||
| 4433 | coding.dst_multibyte = 0; | ||
| 4434 | } | 4386 | } |
| 4435 | 4387 | ||
| 4436 | if (inserted > 0 || coding.type == coding_type_ccl) | 4388 | if (!NILP (visit)) |
| 4437 | { | 4389 | { |
| 4438 | if (CODING_MAY_REQUIRE_DECODING (&coding)) | 4390 | /* When we visit a file by raw-text, we change the buffer to |
| 4391 | unibyte. If we have not yet decided how to decode a text, | ||
| 4392 | decide it at first by detecting the file's encoding. */ | ||
| 4393 | if (CODING_REQUIRE_DETECTION (&coding)) | ||
| 4439 | { | 4394 | { |
| 4440 | code_convert_region (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted, | 4395 | coding_system = detect_coding_system (PT_ADDR, inserted, 1, 0, |
| 4441 | &coding, 0, 0); | 4396 | coding_system); |
| 4442 | inserted = coding.produced_char; | 4397 | setup_coding_system (coding_system, &coding); |
| 4443 | } | 4398 | } |
| 4444 | else | 4399 | |
| 4445 | adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted, | 4400 | if (CODING_FOR_UNIBYTE (&coding) |
| 4446 | inserted); | 4401 | /* Can't do this if part of the buffer might be preserved. */ |
| 4402 | && NILP (replace)) | ||
| 4403 | /* Visiting a file with these coding system makes the buffer | ||
| 4404 | unibyte. */ | ||
| 4405 | current_buffer->enable_multibyte_characters = Qnil; | ||
| 4406 | } | ||
| 4407 | |||
| 4408 | if (CODING_REQUIRE_DETECTION (&coding) | ||
| 4409 | || CODING_REQUIRE_DECODING (&coding)) | ||
| 4410 | { | ||
| 4411 | move_gap_both (PT, PT_BYTE); | ||
| 4412 | GAP_SIZE += inserted; | ||
| 4413 | ZV_BYTE -= inserted; | ||
| 4414 | Z_BYTE -= inserted; | ||
| 4415 | ZV -= inserted; | ||
| 4416 | Z -= inserted; | ||
| 4417 | decode_coding_gap (&coding, inserted, inserted); | ||
| 4418 | inserted = coding.produced_char; | ||
| 4447 | } | 4419 | } |
| 4420 | else if (inserted > 0) | ||
| 4421 | adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted, | ||
| 4422 | inserted); | ||
| 4448 | 4423 | ||
| 4449 | #ifdef DOS_NT | 4424 | #ifdef DOS_NT |
| 4450 | /* Use the conversion type to determine buffer-file-type | 4425 | /* Use the conversion type to determine buffer-file-type |
| 4451 | (find-buffer-file-type is now used to help determine the | 4426 | (find-buffer-file-type is now used to help determine the |
| 4452 | conversion). */ | 4427 | conversion). */ |
| 4453 | if ((coding.eol_type == CODING_EOL_UNDECIDED | 4428 | if ((coding.eol_type == eol_type_undecided |
| 4454 | || coding.eol_type == CODING_EOL_LF) | 4429 | || coding.eol_type == eol_type_lf) |
| 4455 | && ! CODING_REQUIRE_DECODING (&coding)) | 4430 | && ! CODING_REQUIRE_DECODING (&coding)) |
| 4456 | current_buffer->buffer_file_type = Qt; | 4431 | current_buffer->buffer_file_type = Qt; |
| 4457 | else | 4432 | else |
| @@ -4515,7 +4490,7 @@ actually used. */) | |||
| 4515 | } | 4490 | } |
| 4516 | 4491 | ||
| 4517 | if (set_coding_system) | 4492 | if (set_coding_system) |
| 4518 | Vlast_coding_system_used = coding.symbol; | 4493 | Vlast_coding_system_used = coding_system; |
| 4519 | 4494 | ||
| 4520 | /* Call after-change hooks for the inserted text, aside from the case | 4495 | /* Call after-change hooks for the inserted text, aside from the case |
| 4521 | of normal visiting (not with REPLACE), which is done in a new buffer | 4496 | of normal visiting (not with REPLACE), which is done in a new buffer |
| @@ -4560,8 +4535,6 @@ actually used. */) | |||
| 4560 | } | 4535 | } |
| 4561 | 4536 | ||
| 4562 | static Lisp_Object build_annotations P_ ((Lisp_Object, Lisp_Object)); | 4537 | static Lisp_Object build_annotations P_ ((Lisp_Object, Lisp_Object)); |
| 4563 | static Lisp_Object build_annotations_2 P_ ((Lisp_Object, Lisp_Object, | ||
| 4564 | Lisp_Object, Lisp_Object)); | ||
| 4565 | 4538 | ||
| 4566 | /* If build_annotations switched buffers, switch back to BUF. | 4539 | /* If build_annotations switched buffers, switch back to BUF. |
| 4567 | Kill the temporary buffer that was selected in the meantime. | 4540 | Kill the temporary buffer that was selected in the meantime. |
| @@ -4643,40 +4616,36 @@ choose_write_coding_system (start, end, filename, | |||
| 4643 | using_default_coding = 1; | 4616 | using_default_coding = 1; |
| 4644 | } | 4617 | } |
| 4645 | 4618 | ||
| 4619 | if (! NILP (val) && ! force_raw_text) | ||
| 4620 | { | ||
| 4621 | Lisp_Object spec, attrs; | ||
| 4622 | |||
| 4623 | CHECK_CODING_SYSTEM_GET_SPEC (val, spec); | ||
| 4624 | attrs = AREF (spec, 0); | ||
| 4625 | if (EQ (CODING_ATTR_TYPE (attrs), Qraw_text)) | ||
| 4626 | force_raw_text = 1; | ||
| 4627 | } | ||
| 4628 | |||
| 4646 | if (!force_raw_text | 4629 | if (!force_raw_text |
| 4647 | && !NILP (Ffboundp (Vselect_safe_coding_system_function))) | 4630 | && !NILP (Ffboundp (Vselect_safe_coding_system_function))) |
| 4648 | /* Confirm that VAL can surely encode the current region. */ | 4631 | /* Confirm that VAL can surely encode the current region. */ |
| 4649 | val = call3 (Vselect_safe_coding_system_function, start, end, val); | 4632 | val = call3 (Vselect_safe_coding_system_function, start, end, val); |
| 4650 | 4633 | ||
| 4651 | setup_coding_system (Fcheck_coding_system (val), coding); | 4634 | /* If the decided coding-system doesn't specify end-of-line |
| 4652 | if (coding->eol_type == CODING_EOL_UNDECIDED | 4635 | format, we use that of |
| 4653 | && !using_default_coding) | 4636 | `default-buffer-file-coding-system'. */ |
| 4654 | { | 4637 | if (! using_default_coding) |
| 4655 | if (! EQ (default_buffer_file_coding.symbol, | 4638 | val = (coding_inherit_eol_type |
| 4656 | buffer_defaults.buffer_file_coding_system)) | 4639 | (val, buffer_defaults.buffer_file_coding_system)); |
| 4657 | setup_coding_system (buffer_defaults.buffer_file_coding_system, | ||
| 4658 | &default_buffer_file_coding); | ||
| 4659 | if (default_buffer_file_coding.eol_type != CODING_EOL_UNDECIDED) | ||
| 4660 | { | ||
| 4661 | Lisp_Object subsidiaries; | ||
| 4662 | |||
| 4663 | coding->eol_type = default_buffer_file_coding.eol_type; | ||
| 4664 | subsidiaries = Fget (coding->symbol, Qeol_type); | ||
| 4665 | if (VECTORP (subsidiaries) | ||
| 4666 | && XVECTOR (subsidiaries)->size == 3) | ||
| 4667 | coding->symbol | ||
| 4668 | = XVECTOR (subsidiaries)->contents[coding->eol_type]; | ||
| 4669 | } | ||
| 4670 | } | ||
| 4671 | 4640 | ||
| 4641 | /* If we decide not to encode text, use `raw-text' or one of its | ||
| 4642 | subsidiaries. */ | ||
| 4672 | if (force_raw_text) | 4643 | if (force_raw_text) |
| 4673 | setup_raw_text_coding_system (coding); | 4644 | val = raw_text_coding_system (val); |
| 4674 | goto done_setup_coding; | ||
| 4675 | } | 4645 | } |
| 4676 | 4646 | ||
| 4677 | setup_coding_system (Fcheck_coding_system (val), coding); | 4647 | setup_coding_system (Fcheck_coding_system (val), coding); |
| 4678 | 4648 | ||
| 4679 | done_setup_coding: | ||
| 4680 | if (!STRINGP (start) && !NILP (current_buffer->selective_display)) | 4649 | if (!STRINGP (start) && !NILP (current_buffer->selective_display)) |
| 4681 | coding->mode |= CODING_MODE_SELECTIVE_DISPLAY; | 4650 | coding->mode |= CODING_MODE_SELECTIVE_DISPLAY; |
| 4682 | } | 4651 | } |
| @@ -4816,11 +4785,9 @@ This does code conversion according to the value of | |||
| 4816 | unsavable chars (as was the case with X-Symbol). */ | 4785 | unsavable chars (as was the case with X-Symbol). */ |
| 4817 | choose_write_coding_system (start, end, filename, | 4786 | choose_write_coding_system (start, end, filename, |
| 4818 | append, visit, lockname, &coding); | 4787 | append, visit, lockname, &coding); |
| 4819 | Vlast_coding_system_used = coding.symbol; | 4788 | Vlast_coding_system_used = CODING_ID_NAME (coding.id); |
| 4820 | 4789 | ||
| 4821 | given_buffer = current_buffer; | 4790 | given_buffer = current_buffer; |
| 4822 | annotations = build_annotations_2 (start, end, | ||
| 4823 | coding.pre_write_conversion, annotations); | ||
| 4824 | if (current_buffer != given_buffer) | 4791 | if (current_buffer != given_buffer) |
| 4825 | { | 4792 | { |
| 4826 | XSETFASTINT (start, BEGV); | 4793 | XSETFASTINT (start, BEGV); |
| @@ -4963,6 +4930,9 @@ This does code conversion according to the value of | |||
| 4963 | if (GPT > BEG && GPT_ADDR[-1] != '\n') | 4930 | if (GPT > BEG && GPT_ADDR[-1] != '\n') |
| 4964 | move_gap (find_next_newline (GPT, 1)); | 4931 | move_gap (find_next_newline (GPT, 1)); |
| 4965 | #else | 4932 | #else |
| 4933 | #if 0 | ||
| 4934 | /* The new encoding routine doesn't require the following. */ | ||
| 4935 | |||
| 4966 | /* Whether VMS or not, we must move the gap to the next of newline | 4936 | /* Whether VMS or not, we must move the gap to the next of newline |
| 4967 | when we must put designation sequences at beginning of line. */ | 4937 | when we must put designation sequences at beginning of line. */ |
| 4968 | if (INTEGERP (start) | 4938 | if (INTEGERP (start) |
| @@ -4976,6 +4946,7 @@ This does code conversion according to the value of | |||
| 4976 | SET_PT_BOTH (opoint, opoint_byte); | 4946 | SET_PT_BOTH (opoint, opoint_byte); |
| 4977 | } | 4947 | } |
| 4978 | #endif | 4948 | #endif |
| 4949 | #endif | ||
| 4979 | 4950 | ||
| 4980 | failure = 0; | 4951 | failure = 0; |
| 4981 | immediate_quit = 1; | 4952 | immediate_quit = 1; |
| @@ -4988,23 +4959,10 @@ This does code conversion according to the value of | |||
| 4988 | } | 4959 | } |
| 4989 | else if (XINT (start) != XINT (end)) | 4960 | else if (XINT (start) != XINT (end)) |
| 4990 | { | 4961 | { |
| 4991 | tem = CHAR_TO_BYTE (XINT (start)); | 4962 | failure = 0 > a_write (desc, Qnil, |
| 4992 | 4963 | XINT (start), XINT (end) - XINT (start), | |
| 4993 | if (XINT (start) < GPT) | 4964 | &annotations, &coding); |
| 4994 | { | 4965 | save_errno = errno; |
| 4995 | failure = 0 > a_write (desc, Qnil, XINT (start), | ||
| 4996 | min (GPT, XINT (end)) - XINT (start), | ||
| 4997 | &annotations, &coding); | ||
| 4998 | save_errno = errno; | ||
| 4999 | } | ||
| 5000 | |||
| 5001 | if (XINT (end) > GPT && !failure) | ||
| 5002 | { | ||
| 5003 | tem = max (XINT (start), GPT); | ||
| 5004 | failure = 0 > a_write (desc, Qnil, tem , XINT (end) - tem, | ||
| 5005 | &annotations, &coding); | ||
| 5006 | save_errno = errno; | ||
| 5007 | } | ||
| 5008 | } | 4966 | } |
| 5009 | else | 4967 | else |
| 5010 | { | 4968 | { |
| @@ -5020,7 +4978,7 @@ This does code conversion according to the value of | |||
| 5020 | { | 4978 | { |
| 5021 | /* We have to flush out a data. */ | 4979 | /* We have to flush out a data. */ |
| 5022 | coding.mode |= CODING_MODE_LAST_BLOCK; | 4980 | coding.mode |= CODING_MODE_LAST_BLOCK; |
| 5023 | failure = 0 > e_write (desc, Qnil, 0, 0, &coding); | 4981 | failure = 0 > e_write (desc, Qnil, 1, 1, &coding); |
| 5024 | save_errno = errno; | 4982 | save_errno = errno; |
| 5025 | } | 4983 | } |
| 5026 | 4984 | ||
| @@ -5196,30 +5154,6 @@ build_annotations (start, end) | |||
| 5196 | return annotations; | 5154 | return annotations; |
| 5197 | } | 5155 | } |
| 5198 | 5156 | ||
| 5199 | static Lisp_Object | ||
| 5200 | build_annotations_2 (start, end, pre_write_conversion, annotations) | ||
| 5201 | Lisp_Object start, end, pre_write_conversion, annotations; | ||
| 5202 | { | ||
| 5203 | struct gcpro gcpro1; | ||
| 5204 | Lisp_Object res; | ||
| 5205 | |||
| 5206 | GCPRO1 (annotations); | ||
| 5207 | /* At last, do the same for the function PRE_WRITE_CONVERSION | ||
| 5208 | implied by the current coding-system. */ | ||
| 5209 | if (!NILP (pre_write_conversion)) | ||
| 5210 | { | ||
| 5211 | struct buffer *given_buffer = current_buffer; | ||
| 5212 | Vwrite_region_annotations_so_far = annotations; | ||
| 5213 | res = call2 (pre_write_conversion, start, end); | ||
| 5214 | Flength (res); | ||
| 5215 | annotations = (current_buffer != given_buffer | ||
| 5216 | ? res | ||
| 5217 | : merge (annotations, res, Qcar_less_than_car)); | ||
| 5218 | } | ||
| 5219 | |||
| 5220 | UNGCPRO; | ||
| 5221 | return annotations; | ||
| 5222 | } | ||
| 5223 | 5157 | ||
| 5224 | /* Write to descriptor DESC the NCHARS chars starting at POS of STRING. | 5158 | /* Write to descriptor DESC the NCHARS chars starting at POS of STRING. |
| 5225 | If STRING is nil, POS is the character position in the current buffer. | 5159 | If STRING is nil, POS is the character position in the current buffer. |
| @@ -5291,76 +5225,45 @@ e_write (desc, string, start, end, coding) | |||
| 5291 | int start, end; | 5225 | int start, end; |
| 5292 | struct coding_system *coding; | 5226 | struct coding_system *coding; |
| 5293 | { | 5227 | { |
| 5294 | register char *addr; | ||
| 5295 | register int nbytes; | ||
| 5296 | char buf[WRITE_BUF_SIZE]; | ||
| 5297 | int return_val = 0; | 5228 | int return_val = 0; |
| 5298 | 5229 | ||
| 5299 | if (start >= end) | ||
| 5300 | coding->composing = COMPOSITION_DISABLED; | ||
| 5301 | if (coding->composing != COMPOSITION_DISABLED) | ||
| 5302 | coding_save_composition (coding, start, end, string); | ||
| 5303 | |||
| 5304 | if (STRINGP (string)) | 5230 | if (STRINGP (string)) |
| 5305 | { | 5231 | { |
| 5306 | addr = XSTRING (string)->data; | 5232 | start = 0; |
| 5307 | nbytes = STRING_BYTES (XSTRING (string)); | 5233 | end = XSTRING (string)->size; |
| 5308 | coding->src_multibyte = STRING_MULTIBYTE (string); | ||
| 5309 | } | ||
| 5310 | else if (start < end) | ||
| 5311 | { | ||
| 5312 | /* It is assured that the gap is not in the range START and END-1. */ | ||
| 5313 | addr = CHAR_POS_ADDR (start); | ||
| 5314 | nbytes = CHAR_TO_BYTE (end) - CHAR_TO_BYTE (start); | ||
| 5315 | coding->src_multibyte | ||
| 5316 | = !NILP (current_buffer->enable_multibyte_characters); | ||
| 5317 | } | ||
| 5318 | else | ||
| 5319 | { | ||
| 5320 | addr = ""; | ||
| 5321 | nbytes = 0; | ||
| 5322 | coding->src_multibyte = 1; | ||
| 5323 | } | 5234 | } |
| 5324 | 5235 | ||
| 5236 | coding->mode |= CODING_MODE_FIXED_DESTINATION; | ||
| 5237 | if (! NILP (current_buffer->selective_display)) | ||
| 5238 | coding->mode |= CODING_MODE_SELECTIVE_DISPLAY; | ||
| 5239 | |||
| 5325 | /* We used to have a code for handling selective display here. But, | 5240 | /* We used to have a code for handling selective display here. But, |
| 5326 | now it is handled within encode_coding. */ | 5241 | now it is handled within encode_coding. */ |
| 5327 | while (1) | 5242 | do |
| 5328 | { | 5243 | { |
| 5329 | int result; | 5244 | if (STRINGP (string)) |
| 5245 | encode_coding_object (coding, string, | ||
| 5246 | start, string_char_to_byte (string, start), | ||
| 5247 | end, string_char_to_byte (string, end), Qt); | ||
| 5248 | else | ||
| 5249 | encode_coding_object (coding, Fcurrent_buffer (), | ||
| 5250 | start, CHAR_TO_BYTE (start), | ||
| 5251 | end, CHAR_TO_BYTE (end), Qt); | ||
| 5330 | 5252 | ||
| 5331 | result = encode_coding (coding, addr, buf, nbytes, WRITE_BUF_SIZE); | ||
| 5332 | if (coding->produced > 0) | 5253 | if (coding->produced > 0) |
| 5333 | { | 5254 | { |
| 5334 | coding->produced -= emacs_write (desc, buf, coding->produced); | 5255 | coding->produced -= emacs_write (desc, |
| 5256 | XSTRING (coding->dst_object)->data, | ||
| 5257 | coding->produced); | ||
| 5335 | if (coding->produced) | 5258 | if (coding->produced) |
| 5336 | { | 5259 | { |
| 5337 | return_val = -1; | 5260 | return_val = -1; |
| 5338 | break; | 5261 | break; |
| 5339 | } | 5262 | } |
| 5340 | } | 5263 | } |
| 5341 | nbytes -= coding->consumed; | ||
| 5342 | addr += coding->consumed; | ||
| 5343 | if (result == CODING_FINISH_INSUFFICIENT_SRC | ||
| 5344 | && nbytes > 0) | ||
| 5345 | { | ||
| 5346 | /* The source text ends by an incomplete multibyte form. | ||
| 5347 | There's no way other than write it out as is. */ | ||
| 5348 | nbytes -= emacs_write (desc, addr, nbytes); | ||
| 5349 | if (nbytes) | ||
| 5350 | { | ||
| 5351 | return_val = -1; | ||
| 5352 | break; | ||
| 5353 | } | ||
| 5354 | } | ||
| 5355 | if (nbytes <= 0) | ||
| 5356 | break; | ||
| 5357 | start += coding->consumed_char; | 5264 | start += coding->consumed_char; |
| 5358 | if (coding->cmp_data) | ||
| 5359 | coding_adjust_composition_offset (coding, start); | ||
| 5360 | } | 5265 | } |
| 5361 | 5266 | while (start < end); | |
| 5362 | if (coding->cmp_data) | ||
| 5363 | coding_free_composition_data (coding); | ||
| 5364 | 5267 | ||
| 5365 | return return_val; | 5268 | return return_val; |
| 5366 | } | 5269 | } |