comparison src/coding.c @ 23881:20d595402dea

(DECODE_DESIGNATION): Jump to label_invalid_code if final_char is invalid. (decode_coding): If coding->type is coding_type_ccl, call ccl_coding_driver even if SRC_BYTES is zero. (code_convert_region): Update `inserted' correctly after calling coding->post_read_conversion. Even after the code converter consumed all source text, call it once more if it is coding_type_ccl to flush out data.
author Kenichi Handa <handa@m17n.org>
date Tue, 15 Dec 1998 04:35:38 +0000
parents 6eb3e346d1fd
children d20160af7b6e
comparison
equal deleted inserted replaced
23880:522ac99a666d 23881:20d595402dea
935 } while (0) 935 } while (0)
936 936
937 /* Set designation state into CODING. */ 937 /* Set designation state into CODING. */
938 #define DECODE_DESIGNATION(reg, dimension, chars, final_char) \ 938 #define DECODE_DESIGNATION(reg, dimension, chars, final_char) \
939 do { \ 939 do { \
940 int charset = ISO_CHARSET_TABLE (make_number (dimension), \ 940 int charset; \
941 make_number (chars), \ 941 \
942 make_number (final_char)); \ 942 if (final_char < '0' || final_char >= 128) \
943 goto label_invalid_code; \
944 charset = ISO_CHARSET_TABLE (make_number (dimension), \
945 make_number (chars), \
946 make_number (final_char)); \
943 if (charset >= 0 \ 947 if (charset >= 0 \
944 && (CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) == reg \ 948 && (CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) == reg \
945 || coding->safe_charsets[charset])) \ 949 || coding->safe_charsets[charset])) \
946 { \ 950 { \
947 if (coding->spec.iso2022.last_invalid_designation_register == 0 \ 951 if (coding->spec.iso2022.last_invalid_designation_register == 0 \
3692 int src_bytes, dst_bytes; 3696 int src_bytes, dst_bytes;
3693 { 3697 {
3694 int result; 3698 int result;
3695 3699
3696 if (src_bytes <= 0 3700 if (src_bytes <= 0
3701 && coding->type != coding_type_ccl
3697 && ! (coding->mode & CODING_MODE_LAST_BLOCK 3702 && ! (coding->mode & CODING_MODE_LAST_BLOCK
3698 && CODING_REQUIRE_FLUSHING (coding))) 3703 && CODING_REQUIRE_FLUSHING (coding)))
3699 { 3704 {
3700 coding->produced = coding->produced_char = 0; 3705 coding->produced = coding->produced_char = 0;
3701 coding->consumed = coding->consumed_char = 0; 3706 coding->consumed = coding->consumed_char = 0;
4308 4313
4309 if (from < GPT && GPT < to) 4314 if (from < GPT && GPT < to)
4310 move_gap_both (from, from_byte); 4315 move_gap_both (from, from_byte);
4311 SHRINK_CONVERSION_REGION (&from_byte, &to_byte, coding, NULL, encodep); 4316 SHRINK_CONVERSION_REGION (&from_byte, &to_byte, coding, NULL, encodep);
4312 if (from_byte == to_byte 4317 if (from_byte == to_byte
4318 && coding->type != coding_type_ccl
4313 && ! (coding->mode & CODING_MODE_LAST_BLOCK 4319 && ! (coding->mode & CODING_MODE_LAST_BLOCK
4314 && CODING_REQUIRE_FLUSHING (coding))) 4320 && CODING_REQUIRE_FLUSHING (coding)))
4315 { 4321 {
4316 coding->produced = len_byte; 4322 coding->produced = len_byte;
4317 coding->produced_char = multibyte ? len : len_byte; 4323 coding->produced_char = multibyte ? len : len_byte;
4450 coding->symbol = saved_coding_symbol; 4456 coding->symbol = saved_coding_symbol;
4451 4457
4452 continue; 4458 continue;
4453 } 4459 }
4454 if (len_byte <= 0) 4460 if (len_byte <= 0)
4455 break; 4461 {
4462 if (coding->type != coding_type_ccl
4463 || coding->mode & CODING_MODE_LAST_BLOCK)
4464 break;
4465 coding->mode |= CODING_MODE_LAST_BLOCK;
4466 continue;
4467 }
4456 if (result == CODING_FINISH_INSUFFICIENT_SRC) 4468 if (result == CODING_FINISH_INSUFFICIENT_SRC)
4457 { 4469 {
4458 /* The source text ends in invalid codes. Let's just 4470 /* The source text ends in invalid codes. Let's just
4459 make them valid buffer contents, and finish conversion. */ 4471 make them valid buffer contents, and finish conversion. */
4460 inserted += len_byte; 4472 inserted += len_byte;
4545 if (from != PT) 4557 if (from != PT)
4546 TEMP_SET_PT_BOTH (from, from_byte); 4558 TEMP_SET_PT_BOTH (from, from_byte);
4547 prev_Z = Z; 4559 prev_Z = Z;
4548 val = call1 (coding->post_read_conversion, make_number (inserted)); 4560 val = call1 (coding->post_read_conversion, make_number (inserted));
4549 CHECK_NUMBER (val, 0); 4561 CHECK_NUMBER (val, 0);
4550 inserted = Z - prev_Z; 4562 inserted += Z - prev_Z;
4551 } 4563 }
4552 4564
4553 if (orig_point >= from) 4565 if (orig_point >= from)
4554 { 4566 {
4555 if (orig_point >= from + orig_len) 4567 if (orig_point >= from + orig_len)