comparison src/coding.c @ 23514:7bad909cd6f1

(setup_coding_system): Fix setting up coding->spec.ccl.valid_codes for CCL based coding system. (code_convert_region): Set point to FROM before inserting the result of pre-write-funciton. Preserve original point. (code_convert_string): If coding->type is coding_type_ccl, do conversion even if the length of conversion region is zero.
author Kenichi Handa <handa@m17n.org>
date Wed, 21 Oct 1998 11:50:56 +0000
parents 6f03301d36a7
children 28cd5faf93dd
comparison
equal deleted inserted replaced
23513:0a3fa36b323b 23514:7bad909cd6f1
3136 { 3136 {
3137 int start = XINT (XCONS (this)->car); 3137 int start = XINT (XCONS (this)->car);
3138 int end = XINT (XCONS (this)->cdr); 3138 int end = XINT (XCONS (this)->cdr);
3139 3139
3140 if (start >= 0 && start <= end && end < 256) 3140 if (start >= 0 && start <= end && end < 256)
3141 while (start < end) 3141 while (start <= end)
3142 coding->spec.ccl.valid_codes[start++] = 1; 3142 coding->spec.ccl.valid_codes[start++] = 1;
3143 } 3143 }
3144 } 3144 }
3145 } 3145 }
3146 } 3146 }
4167 int multibyte = !NILP (current_buffer->enable_multibyte_characters); 4167 int multibyte = !NILP (current_buffer->enable_multibyte_characters);
4168 int first = 1; 4168 int first = 1;
4169 int fake_multibyte = 0; 4169 int fake_multibyte = 0;
4170 unsigned char *src, *dst; 4170 unsigned char *src, *dst;
4171 Lisp_Object deletion; 4171 Lisp_Object deletion;
4172 int orig_point = PT, orig_len = len;
4172 4173
4173 deletion = Qnil; 4174 deletion = Qnil;
4174 saved_coding_symbol = Qnil; 4175 saved_coding_symbol = Qnil;
4175 4176
4176 if (from < PT && PT < to) 4177 if (from < PT && PT < to)
4177 SET_PT_BOTH (from, from_byte); 4178 {
4179 TEMP_SET_PT_BOTH (from, from_byte);
4180 orig_point = from;
4181 }
4178 4182
4179 if (replace) 4183 if (replace)
4180 { 4184 {
4181 int saved_from = from; 4185 int saved_from = from;
4182 4186
4267 { 4271 {
4268 len = ZV - BEGV; 4272 len = ZV - BEGV;
4269 new = current_buffer; 4273 new = current_buffer;
4270 set_buffer_internal_1 (prev); 4274 set_buffer_internal_1 (prev);
4271 del_range_2 (from, from_byte, to, to_byte); 4275 del_range_2 (from, from_byte, to, to_byte);
4272 insert_from_buffer (new, BEG, len, 0); 4276 TEMP_SET_PT_BOTH (from, from_byte);
4277 insert_from_buffer (new, 1, len, 0);
4278 if (orig_point >= to)
4279 orig_point += len - orig_len;
4280 else if (orig_point > from)
4281 orig_point = from;
4282 orig_len = len;
4273 to = from + len; 4283 to = from + len;
4284 from_byte = multibyte ? CHAR_TO_BYTE (from) : from_byte;
4274 to_byte = multibyte ? CHAR_TO_BYTE (to) : to; 4285 to_byte = multibyte ? CHAR_TO_BYTE (to) : to;
4275 len_byte = to_byte - from_byte; 4286 len_byte = to_byte - from_byte;
4287 TEMP_SET_PT_BOTH (from, from_byte);
4276 } 4288 }
4277 } 4289 }
4278 4290
4279 if (replace) 4291 if (replace)
4280 deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1); 4292 deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1);
4514 adjust_after_replace (from, from_byte, deletion, inserted, inserted_byte); 4526 adjust_after_replace (from, from_byte, deletion, inserted, inserted_byte);
4515 4527
4516 if (! encodep && ! NILP (coding->post_read_conversion)) 4528 if (! encodep && ! NILP (coding->post_read_conversion))
4517 { 4529 {
4518 Lisp_Object val; 4530 Lisp_Object val;
4519 int orig_inserted = inserted, pos = PT; 4531
4520 4532 if (from != PT)
4521 if (from != pos) 4533 TEMP_SET_PT_BOTH (from, from_byte);
4522 temp_set_point_both (current_buffer, from, from_byte);
4523 val = call1 (coding->post_read_conversion, make_number (inserted)); 4534 val = call1 (coding->post_read_conversion, make_number (inserted));
4524 if (! NILP (val)) 4535 if (! NILP (val))
4525 { 4536 {
4526 CHECK_NUMBER (val, 0); 4537 CHECK_NUMBER (val, 0);
4527 inserted = XFASTINT (val); 4538 inserted = XFASTINT (val);
4528 } 4539 }
4529 if (pos >= from + orig_inserted) 4540 }
4530 temp_set_point (current_buffer, pos + (inserted - orig_inserted)); 4541
4542 if (orig_point >= from)
4543 {
4544 if (orig_point >= from + orig_len)
4545 orig_point += inserted - orig_len;
4546 else
4547 orig_point = from;
4548 TEMP_SET_PT (orig_point);
4531 } 4549 }
4532 4550
4533 signal_after_change (from, to - from, inserted); 4551 signal_after_change (from, to - from, inserted);
4534 4552
4535 { 4553 {
4563 /* Since we have to call Lisp functions which assume target text 4581 /* Since we have to call Lisp functions which assume target text
4564 is in a buffer, after setting a temporary buffer, call 4582 is in a buffer, after setting a temporary buffer, call
4565 code_convert_region. */ 4583 code_convert_region. */
4566 int count = specpdl_ptr - specpdl; 4584 int count = specpdl_ptr - specpdl;
4567 struct buffer *prev = current_buffer; 4585 struct buffer *prev = current_buffer;
4568 4586
4569 record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); 4587 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
4570 temp_output_buffer_setup (" *code-converting-work*"); 4588 temp_output_buffer_setup (" *code-converting-work*");
4571 set_buffer_internal (XBUFFER (Vstandard_output)); 4589 set_buffer_internal (XBUFFER (Vstandard_output));
4572 if (encodep) 4590 if (encodep)
4573 insert_from_string (str, 0, 0, to, to_byte, 0); 4591 insert_from_string (str, 0, 0, to, to_byte, 0);
4617 { 4635 {
4618 /* Try to skip the heading and tailing ASCIIs. */ 4636 /* Try to skip the heading and tailing ASCIIs. */
4619 SHRINK_CONVERSION_REGION (&from, &to_byte, coding, XSTRING (str)->data, 4637 SHRINK_CONVERSION_REGION (&from, &to_byte, coding, XSTRING (str)->data,
4620 encodep); 4638 encodep);
4621 } 4639 }
4622 if (from == to_byte) 4640 if (from == to_byte
4641 && coding->type != coding_type_ccl)
4623 return (nocopy ? str : Fcopy_sequence (str)); 4642 return (nocopy ? str : Fcopy_sequence (str));
4624 4643
4625 if (encodep) 4644 if (encodep)
4626 len = encoding_buffer_size (coding, to_byte - from); 4645 len = encoding_buffer_size (coding, to_byte - from);
4627 else 4646 else