comparison src/coding.c @ 23116:6736da064f4a

(detect_coding_iso2022): Handle ESC N and ESC O correctly. They are for SS2 and SS3 respectively. (ccl_coding_driver): Fix previous change.
author Kenichi Handa <handa@m17n.org>
date Thu, 27 Aug 1998 07:47:15 +0000
parents 20486aa49e7d
children 7a72a7b8718c
comparison
equal deleted inserted replaced
23115:b992f7bb67d7 23116:6736da064f4a
731 } 731 }
732 else 732 else
733 /* Invalid designation sequence. Just ignore. */ 733 /* Invalid designation sequence. Just ignore. */
734 break; 734 break;
735 } 735 }
736 else if (c == 'N' || c == 'n') 736 else if (c == 'N' || c == 'O')
737 { 737 {
738 if (shift_out == 0 738 /* ESC <Fe> for SS2 or SS3. */
739 && (reg[1] >= 0 739 mask &= CODING_CATEGORY_MASK_ISO_7_ELSE;
740 || SHIFT_OUT_OK (CODING_CATEGORY_IDX_ISO_7_ELSE)
741 || SHIFT_OUT_OK (CODING_CATEGORY_IDX_ISO_8_ELSE)))
742 {
743 /* Locking shift out. */
744 mask &= ~CODING_CATEGORY_MASK_ISO_7BIT;
745 mask_found |= CODING_CATEGORY_MASK_ISO_SHIFT;
746 shift_out = 1;
747 }
748 break;
749 }
750 else if (c == 'O' || c == 'o')
751 {
752 if (shift_out == 1)
753 {
754 /* Locking shift in. */
755 mask &= ~CODING_CATEGORY_MASK_ISO_7BIT;
756 mask_found |= CODING_CATEGORY_MASK_ISO_SHIFT;
757 shift_out = 0;
758 }
759 break; 740 break;
760 } 741 }
761 else if (c == '0' || c == '1' || c == '2') 742 else if (c == '0' || c == '1' || c == '2')
762 /* Start/end composition. Just ignore. */ 743 /* ESC <Fp> for start/end composition. Just ignore. */
763 break; 744 break;
764 else 745 else
765 /* Invalid escape sequence. Just ignore. */ 746 /* Invalid escape sequence. Just ignore. */
766 break; 747 break;
767 748
773 mask &= ~CODING_CATEGORY_MASK_ISO_7; 754 mask &= ~CODING_CATEGORY_MASK_ISO_7;
774 if (CHARSET_OK (CODING_CATEGORY_IDX_ISO_7_TIGHT, charset)) 755 if (CHARSET_OK (CODING_CATEGORY_IDX_ISO_7_TIGHT, charset))
775 mask_found |= CODING_CATEGORY_MASK_ISO_7_TIGHT; 756 mask_found |= CODING_CATEGORY_MASK_ISO_7_TIGHT;
776 else 757 else
777 mask &= ~CODING_CATEGORY_MASK_ISO_7_TIGHT; 758 mask &= ~CODING_CATEGORY_MASK_ISO_7_TIGHT;
778 if (! CHARSET_OK (CODING_CATEGORY_IDX_ISO_7_ELSE, charset)) 759 if (CHARSET_OK (CODING_CATEGORY_IDX_ISO_7_ELSE, charset))
760 mask_found |= CODING_CATEGORY_MASK_ISO_7_ELSE;
761 else
779 mask &= ~CODING_CATEGORY_MASK_ISO_7_ELSE; 762 mask &= ~CODING_CATEGORY_MASK_ISO_7_ELSE;
780 if (! CHARSET_OK (CODING_CATEGORY_IDX_ISO_8_ELSE, charset)) 763 if (CHARSET_OK (CODING_CATEGORY_IDX_ISO_8_ELSE, charset))
764 mask_found |= CODING_CATEGORY_MASK_ISO_8_ELSE;
765 else
781 mask &= ~CODING_CATEGORY_MASK_ISO_8_ELSE; 766 mask &= ~CODING_CATEGORY_MASK_ISO_8_ELSE;
782 break; 767 break;
783 768
784 case ISO_CODE_SO: 769 case ISO_CODE_SO:
785 single_shifting = 0; 770 single_shifting = 0;
3621 { 3606 {
3622 struct ccl_program *ccl 3607 struct ccl_program *ccl
3623 = encodep ? &coding->spec.ccl.encoder : &coding->spec.ccl.decoder; 3608 = encodep ? &coding->spec.ccl.encoder : &coding->spec.ccl.decoder;
3624 int result; 3609 int result;
3625 3610
3626 if (encodep) 3611 ccl->last_block = coding->mode & CODING_MODE_LAST_BLOCK;
3627 ccl->last_block = coding->mode & CODING_MODE_LAST_BLOCK;
3628 3612
3629 coding->produced = ccl_driver (ccl, source, destination, 3613 coding->produced = ccl_driver (ccl, source, destination,
3630 src_bytes, dst_bytes, &(coding->consumed)); 3614 src_bytes, dst_bytes, &(coding->consumed));
3631 if (encodep) 3615 if (encodep)
3632 { 3616 {