Mercurial > emacs
comparison src/coding.c @ 21140:179c73d91f70
(code_convert_region): Adjusted for the change of
adjust_after_replace.
| author | Kenichi Handa <handa@m17n.org> |
|---|---|
| date | Thu, 12 Mar 1998 00:44:06 +0000 |
| parents | 75c6408013e5 |
| children | d704dd953837 |
comparison
equal
deleted
inserted
replaced
| 21139:48b83e612b06 | 21140:179c73d91f70 |
|---|---|
| 3957 Lisp_Object saved_coding_symbol = Qnil; | 3957 Lisp_Object saved_coding_symbol = Qnil; |
| 3958 int multibyte = !NILP (current_buffer->enable_multibyte_characters); | 3958 int multibyte = !NILP (current_buffer->enable_multibyte_characters); |
| 3959 int first = 1; | 3959 int first = 1; |
| 3960 int fake_multibyte = 0; | 3960 int fake_multibyte = 0; |
| 3961 unsigned char *src, *dst; | 3961 unsigned char *src, *dst; |
| 3962 int combined_before_bytes = 0; | 3962 int combined_before_bytes = 0, combined_after_bytes = 0; |
| 3963 int adjusted_inserted; | |
| 3964 | 3963 |
| 3965 if (adjust) | 3964 if (adjust) |
| 3966 { | 3965 { |
| 3967 int saved_from = from; | 3966 int saved_from = from; |
| 3968 | 3967 |
| 4016 { | 4015 { |
| 4017 if (GPT < from || GPT > to) | 4016 if (GPT < from || GPT > to) |
| 4018 move_gap_both (from, from_byte); | 4017 move_gap_both (from, from_byte); |
| 4019 coding->produced_char | 4018 coding->produced_char |
| 4020 = multibyte_chars_in_text (BYTE_POS_ADDR (from_byte), len_byte); | 4019 = multibyte_chars_in_text (BYTE_POS_ADDR (from_byte), len_byte); |
| 4021 if (coding->produced_char != len) | |
| 4022 { | |
| 4023 int diff = coding->produced_char - len; | |
| 4024 | |
| 4025 if (adjust) | |
| 4026 adjust_before_replace (from, from_byte, to, to_byte); | |
| 4027 ZV += diff; Z += diff; GPT += diff; | |
| 4028 if (adjust) | |
| 4029 adjust_after_replace (from, from_byte, to, to_byte, | |
| 4030 diff, 0); | |
| 4031 } | |
| 4032 } | 4020 } |
| 4033 else | 4021 else |
| 4034 coding->produced_char = len_byte; | 4022 coding->produced_char = len_byte; |
| 4035 return 0; | 4023 return 0; |
| 4036 } | 4024 } |
| 4037 | 4025 |
| 4038 /* Now we convert the text. */ | 4026 /* Now we convert the text. */ |
| 4039 | 4027 |
| 4040 /* For encoding, we must process pre-write-conversion in advance. */ | 4028 /* For encoding, we must process pre-write-conversion in advance. */ |
| 4041 if (encodep | 4029 if (encodep |
| 4042 && adjust | |
| 4043 && ! NILP (coding->pre_write_conversion) | 4030 && ! NILP (coding->pre_write_conversion) |
| 4044 && SYMBOLP (coding->pre_write_conversion) | 4031 && SYMBOLP (coding->pre_write_conversion) |
| 4045 && ! NILP (Ffboundp (coding->pre_write_conversion))) | 4032 && ! NILP (Ffboundp (coding->pre_write_conversion))) |
| 4046 { | 4033 { |
| 4047 /* The function in pre-write-conversion put a new text in a new | 4034 /* The function in pre-write-conversion may put a new text in a |
| 4048 buffer. */ | 4035 new buffer. */ |
| 4049 struct buffer *prev = current_buffer, *new; | 4036 struct buffer *prev = current_buffer, *new; |
| 4050 | 4037 |
| 4051 call2 (coding->pre_write_conversion, from, to); | 4038 call2 (coding->pre_write_conversion, from, to); |
| 4052 if (current_buffer != prev) | 4039 if (current_buffer != prev) |
| 4053 { | 4040 { |
| 4238 dst = GPT_ADDR + inserted_byte; | 4225 dst = GPT_ADDR + inserted_byte; |
| 4239 } | 4226 } |
| 4240 } | 4227 } |
| 4241 if (src - dst > 0) *dst = 0; /* Put an anchor. */ | 4228 if (src - dst > 0) *dst = 0; /* Put an anchor. */ |
| 4242 | 4229 |
| 4243 adjusted_inserted = inserted; | 4230 if (multibyte |
| 4244 | 4231 && (fake_multibyte || !encodep && (to - from) != (to_byte - from_byte))) |
| 4245 if (multibyte) | 4232 inserted = multibyte_chars_in_text (GPT_ADDR, inserted_byte); |
| 4246 { | 4233 |
| 4247 if (fake_multibyte || !encodep && (to - from) != (to_byte - from_byte)) | 4234 adjust_after_replace (from, from_byte, to, to_byte, |
| 4248 adjusted_inserted | 4235 inserted, inserted_byte); |
| 4249 = inserted = multibyte_chars_in_text (GPT_ADDR, inserted_byte); | 4236 if (from_byte_orig == from_byte) |
| 4250 | 4237 from_byte_orig = from_byte = PT_BYTE; |
| 4251 if (! CHAR_HEAD_P (*GPT_ADDR) | 4238 |
| 4252 && GPT_BYTE > 1 | 4239 if (! encodep && ! NILP (coding->post_read_conversion)) |
| 4253 && from_byte == from_byte_orig) | 4240 { |
| 4254 { | 4241 Lisp_Object val; |
| 4255 unsigned char *p0 = GPT_ADDR - 1, *pmin = BEG_ADDR, *p1, *pmax; | 4242 int orig_inserted = inserted, pos = PT; |
| 4256 | 4243 |
| 4257 while (! CHAR_HEAD_P (*p0) && p0 > pmin) p0--; | 4244 if (from != pos) |
| 4258 if (BASE_LEADING_CODE_P (*p0)) | 4245 temp_set_point_both (current_buffer, from, from_byte); |
| 4259 { | 4246 val = call1 (coding->post_read_conversion, make_number (inserted)); |
| 4260 /* Codes in the range 0240..0377 were inserted just | 4247 if (! NILP (val)) |
| 4261 after a multibyte sequence. We must treat those | 4248 { |
| 4262 codes as tailing constituents of the multibyte | 4249 CHECK_NUMBER (val, 0); |
| 4263 sequence. For that, we increase byte positions of | 4250 inserted = XFASTINT (val); |
| 4264 position keepers whose char positions are GPT. */ | 4251 } |
| 4265 Lisp_Object tail; | 4252 if (pos >= from + orig_inserted) |
| 4266 | 4253 temp_set_point (current_buffer, pos + (inserted - orig_inserted)); |
| 4267 combined_before_bytes | 4254 } |
| 4268 = count_combining_before (GPT_ADDR, inserted_byte, | 4255 |
| 4269 GPT, GPT_BYTE); | 4256 signal_after_change (from, to - from, inserted); |
| 4270 if (PT == GPT) | |
| 4271 BUF_PT_BYTE (current_buffer) += combined_before_bytes; | |
| 4272 if (BEGV == GPT) | |
| 4273 BUF_BEGV_BYTE (current_buffer) += combined_before_bytes; | |
| 4274 | |
| 4275 tail = BUF_MARKERS (current_buffer); | |
| 4276 while (XSYMBOL (tail) != XSYMBOL (Qnil)) | |
| 4277 { | |
| 4278 if (XMARKER (tail)->charpos == GPT) | |
| 4279 XMARKER (tail)->bytepos += combined_before_bytes; | |
| 4280 tail = XMARKER (tail)->chain; | |
| 4281 } | |
| 4282 | |
| 4283 from_byte += combined_before_bytes; | |
| 4284 from_byte_orig = from_byte; | |
| 4285 adjusted_inserted = inserted - !! combined_before_bytes; | |
| 4286 | |
| 4287 if (! EQ (current_buffer->undo_list, Qt)) | |
| 4288 { | |
| 4289 /* We record the multibyte sequence preceding the | |
| 4290 gap as deleted, and the new multibyte sequence | |
| 4291 combined with COMBINED_BYTES as inserted. We | |
| 4292 directly modify the undo list because we have | |
| 4293 already done record_delete and can skip various | |
| 4294 checking. */ | |
| 4295 Lisp_Object str = make_multibyte_string (p0, 1, | |
| 4296 GPT_ADDR - p0); | |
| 4297 current_buffer->undo_list | |
| 4298 = Fcons (Fcons (make_number (GPT - 1), make_number (GPT)), | |
| 4299 Fcons (Fcons (str, make_number (GPT - 1)), | |
| 4300 current_buffer->undo_list)); | |
| 4301 } | |
| 4302 } | |
| 4303 } | |
| 4304 } | |
| 4305 | |
| 4306 /* Update various buffer positions for the new text. */ | |
| 4307 GAP_SIZE -= inserted_byte; | |
| 4308 ZV += adjusted_inserted; Z+= adjusted_inserted; | |
| 4309 ZV_BYTE += inserted_byte; Z_BYTE += inserted_byte; | |
| 4310 GPT += adjusted_inserted; GPT_BYTE += inserted_byte; | |
| 4311 | |
| 4312 if (adjust) | |
| 4313 { | |
| 4314 adjust_after_replace (from, from_byte, to, to_byte, | |
| 4315 inserted, inserted_byte, | |
| 4316 combined_before_bytes, 0); | |
| 4317 | |
| 4318 if (! encodep && ! NILP (coding->post_read_conversion)) | |
| 4319 { | |
| 4320 Lisp_Object val; | |
| 4321 int orig_inserted = adjusted_inserted, pos = PT; | |
| 4322 | |
| 4323 temp_set_point_both (current_buffer, from, from_byte); | |
| 4324 val = call1 (coding->post_read_conversion, | |
| 4325 make_number (adjusted_inserted)); | |
| 4326 if (! NILP (val)) | |
| 4327 { | |
| 4328 CHECK_NUMBER (val, 0); | |
| 4329 adjusted_inserted = XFASTINT (val); | |
| 4330 } | |
| 4331 if (pos >= from + orig_inserted) | |
| 4332 temp_set_point (current_buffer, | |
| 4333 pos + (adjusted_inserted - orig_inserted)); | |
| 4334 } | |
| 4335 signal_after_change (from, to - from, adjusted_inserted); | |
| 4336 } | |
| 4337 | 4257 |
| 4338 { | 4258 { |
| 4339 int skip = (to_byte_orig - to_byte) + (from_byte - from_byte_orig); | 4259 int skip = (to_byte_orig - to_byte) + (from_byte - from_byte_orig); |
| 4340 | 4260 |
| 4341 coding->consumed = to_byte_orig - from_byte_orig; | 4261 coding->consumed = to_byte_orig - from_byte_orig; |
| 4342 coding->consumed_char = skip + (to - from); | 4262 coding->consumed_char = skip + (to - from); |
| 4343 coding->produced = skip + inserted_byte; | 4263 coding->produced = skip + inserted_byte; |
| 4344 coding->produced_char = skip + adjusted_inserted; | 4264 coding->produced_char = skip + inserted; |
| 4345 } | 4265 } |
| 4346 | 4266 |
| 4347 return 0; | 4267 return 0; |
| 4348 } | 4268 } |
| 4349 | 4269 |
