static char rcsid[] = "@(#)$Id: iso2022.c,v 1.100 2006/04/09 07:37:07 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.100 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) *****************************************************************************/ #include "headers.h" #include "s_me.h" #include "cs_imp.h" #include #ifndef ANSI_C extern int errno; #endif DEBUG_VAR(Debug,__FILE__,"charset"); struct iso2022_setid return_to_iso2022 = { bank_unspecified, iso2022_other , { 0x40 , 0x00, 0x00, 0x00 } }; static struct iso2022_setid set0_utf8 = { bank_unspecified, iso2022_other , { 0x47 , 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_latin7 = /* ISO-8859-13 */ { bank_unspecified, iso2022_96, { 0x59, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_latin8 = /* ISO-8859-14 */ { bank_unspecified, iso2022_96, { 0x5F, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_latin9 = /* ISO-8859-15 */ { bank_unspecified, iso2022_96, { 0x62, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso885916 = /* ISO-8859-16 */ { bank_unspecified, iso2022_96, { 0x66, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_koi8e = /* ECMA Cyrilic, ISO-IR-111, KOI8-E */ { bank_unspecified, iso2022_96, { 0x40, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_2 = /* IRV, ISO_646.irv:1983, ISO-IR-2 */ { bank_G0, iso2022_94, { 0x40, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_4 = /* ISO646-GB, BS_4730, ISO-IR-4 */ { bank_G0, iso2022_94, { 0x41, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_8_1 = /* NATS-SEFI, ISO-IR-8-1 */ { bank_G0, iso2022_94, { 0x43, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_8_2 = /* NATS-SEFI-ADD, ISO-IR-8-2 */ { bank_G0, iso2022_94, { 0x44, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_9_1 = /* NATS-DANO, ISO-IR-9-1 */ { bank_G0, iso2022_94, { 0x45, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_9_2 = /* NATS-DANO-ADD, ISO-IR-9-2 */ { bank_G0, iso2022_94, { 0x46, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_10 = /* ISO646-FI, ISO646-SE, SEN_850200_B, ISO-IR-10 */ { bank_G0, iso2022_94, { 0x47, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_11 = /* ISO646-SE2, SEN_850200_C, ISO-IR-11 */ { bank_G0, iso2022_94, { 0x48, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_KSC5601 = /* KSC 5601, part of ISO-2022-KR */ { bank_G1, iso2022_94x94, { 0x43, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_13 = /* JIS_C6220-1969-jp, ISO-IR-13 */ { bank_G1, iso2022_94, { 0x49, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_JISC6220 = /* JIS C 6220-1976 or JIS X 0201, part of ISO-2022-JP */ { bank_G0, iso2022_94, { 0x4A, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_JISX0201_euc = /* JIS X 0201:1976, part of EUC-JP */ { bank_G2, iso2022_94, { 0x4A, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_15 = /* IT, ISO-IR-15, ISO646-IT */ { bank_G0, iso2022_94, { 0x59, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_16 = /* PT, ISO-IR-16, ISO646-PT */ { bank_G0, iso2022_94, { 0x4C, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_17 = /* ES, ISO-IR-17, ISO646-ES */ { bank_G0, iso2022_94, { 0x5A, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_18 = /* greek7-old, ISO-IR-18 */ { bank_G0, iso2022_94, { 0x5B, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_19 = /* latin-greek, ISO-IR-19 */ { bank_G0, iso2022_94, { 0x5C, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_21 = /* ISO646-DE, DIN_66003, ISO-IR-21 */ { bank_G0, iso2022_94, { 0x4B, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_25 = /* ISO646-FR1, NF_Z_62-010_(1973), ISO-IR-25 */ { bank_G0, iso2022_94, { 0x52, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_27 = /* Latin-greek-1 , ISO-IR-25 */ { bank_G0, iso2022_94, { 0x55, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_37 = /* ISO_5427 , ISO-IR-37 */ { bank_G0, iso2022_94, { 0x4E, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_47 = /* BS_viewdata" , ISO-IR-47 */ { bank_G0, iso2022_94, { 0x56, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_49 = /* INIS , ISO-IR-49 */ { bank_G0, iso2022_94, { 0x57, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_50 = /* INIS-8 , ISO-IR-50 */ { bank_G1, iso2022_94, { 0x5D, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_51 = /* INIS-cyrillic , ISO-IR-51 */ { bank_G1, iso2022_94, { 0x5E, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_54 = /* ISO_5427:1981 , ISO-IR-54 */ { bank_G0, iso2022_94, { 0x51, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_55 = /* ISO_5428:1980 , ISO-IR-55 */ { bank_G0, iso2022_94, { 0x53, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_57 = /* ISO646-CN, GB_1988-80 , ISO-IR-57 */ { bank_G0, iso2022_94, { 0x54, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_60 = /* ISO646-NO, NS_4551-1 , ISO-IR-60 */ { bank_G0, iso2022_94, { 0x60, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_61 = /* ISO646-NO2, NS_4551-2 , ISO-IR-61 */ { bank_G0, iso2022_94, { 0x61, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_69 = /* ISO646-FR, NF_Z_62-010 , ISO-IR-69 */ { bank_G0, iso2022_94, { 0x66, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_70 = /* codeset videotex-suppl , ISO-IR-70 */ { bank_G0, iso2022_94, { 0x62, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_84 = /* ISO646-PT2, PT2 , ISO-IR-84 */ { bank_G0, iso2022_94, { 0x67, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_85 = /* ISO646-ES2, ES2 , ISO-IR-85 */ { bank_G0, iso2022_94, { 0x68, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_86 = /* ISO646-HU, MSZ_7795.3 , ISO-IR-86 */ { bank_G0, iso2022_94, { 0x69, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_89 = /* ASMO_449 , ISO-IR-89 */ { bank_G0, iso2022_94, { 0x6B, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_90 = /* ISO-IR-90 */ { bank_G1, iso2022_94, { 0x6C, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_91 = /* JIS_C6229-1984-a , ISO-IR-91 */ { bank_G0, iso2022_94, { 0x6D, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_92 = /* ISO646-JP-OCR-B, JIS_C6229-1984-b , ISO-IR-92 */ { bank_G0, iso2022_94, { 0x6E, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_93 = /* JIS_C6229-1984-b-add , ISO-IR-93 */ { bank_G1, iso2022_94, { 0x6F, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_94 = /* JIS_C6229-1984-hand , ISO-IR-94 */ { bank_G0, iso2022_94, { 0x70, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_95 = /* JIS_C6229-1984-hand-add , ISO-IR-95 */ { bank_G1, iso2022_94, { 0x71, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_96 = /* JIS_C6229-1984-kana , ISO-IR-96 */ { bank_G0, iso2022_94, { 0x72, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_98 = /* ISO_2033-1983 , ISO-IR-98 */ { bank_G0, iso2022_94, { 0x73, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_99 = /* ANSI_X3.110-1983 , ISO-IR-99 */ { bank_G2, iso2022_94, { 0x74, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_102 = /* T.61-7bit , ISO-IR-102 */ { bank_G0, iso2022_94, { 0x75, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_103 = /* T.61-8bit , ISO-IR-103 */ { bank_G1, iso2022_94, { 0x76, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_121 = /* ISO646-CA, CSA_Z243.4-1985-1, ISO-IR-121 */ { bank_G0, iso2022_94, { 0x77, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_122 = /* ISO646-CA2, CSA_Z243.4-1985-2, ISO-IR-122 */ { bank_G0, iso2022_94, { 0x78, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_123 = /* CSA_Z243.4-1985-gr, ISO-IR-123 */ { bank_G1, iso2022_96, { 0x45, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_128 = /* T.101-G2 , ISO-IR-128 */ { bank_G2, iso2022_94, { 0x7C, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_139 = /* CSN_369103 , ISO-IR-139 */ { bank_unspecified, iso2022_96, { 0x49, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_141 = /* ISO646-YU, JUS_I.B1.002 , ISO-IR-141 */ { bank_G0, iso2022_94, { 0x7A, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_142 = /* ISO_6937-2-add , ISO-IR-142 */ { bank_G1, iso2022_96, { 0x4A, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_143 = /* IEC_P27-1 , ISO-IR-143 */ { bank_G1, iso2022_96, { 0x4B, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_146 = /* JUS_I.B1.003-serb , ISO-IR-146 */ { bank_G0, iso2022_94, { 0x7B, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_147 = /* JUS_I.B1.003-mac , ISO-IR-147 */ { bank_G0, iso2022_94, { 0x7D, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_150 = /* greek-ccitt , ISO-IR-150 */ { bank_G0, iso2022_94, { 0x21, 0x40, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_151 = /* ISO646-CU, NC_NC00-10:81 , ISO-IR-151 */ { bank_G0, iso2022_94, { 0x21, 0x41, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_152 = /* ISO_6937-2-25 , ISO-IR-152 */ { bank_G1, iso2022_96, { 0x4E, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_153 = /* GOST_19768-74 , ISO-IR-153 */ { bank_G1, iso2022_96, { 0x4F, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_154 = /* ISO_8859-supp , ISO-IR-154 */ { bank_G3, iso2022_96, { 0x50, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_155 = /* ISO_10367-box , ISO-IR-155 */ { bank_G1, iso2022_96, { 0x51, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set1_iso_ir_158 = /* ISO_10367-box , ISO-IR-158 */ { bank_G3, iso2022_96, { 0x58, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_JISC6226a = /* JIS C 6226-1978 or JIS X 0208-1978, part of ISO-2022-JP */ { bank_G0, iso2022_94x94, { 0x40, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_JISC6226b = /* JIS C 6226-1983 or JIS X 0208-1983, part of ISO-2022-JP */ { bank_G0, iso2022_94x94, { 0x42, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_JISX0208_1983_euc = /* JIS X 0208-1983, part of EUC-JP */ { bank_G1, iso2022_94x94, { 0x42, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_GB2312jp = /* GB2312-1980, part of ISO-2022-JP-2 */ { bank_G0, iso2022_94x94, { 0x41, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_KSC5601jp = /* KSC5601-1987, part of ISO-2022-JP-2 */ { bank_G0, iso2022_94x94, { 0x43, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_JISX0212 = /* JIS X 0212-1990, part of ISO-2022-JP-2 */ { bank_G0, iso2022_94x94, { 0x44, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_JISX0212_euc = /* JIS X 0212-1990, part of EUC-JP */ { bank_G3, iso2022_94x94, { 0x44, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_ISO88591 = /* ISO8859-1, part of ISO-2022-JP-2 */ { bank_G2, iso2022_96, { 0x41, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_ISO88597 = /* ISO8859-7(Greek), part of ISO-2022-JP-2 */ { bank_G2, iso2022_96, { 0x46, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_GB2312 = /* GB 2312, part of ISO-2022-CN */ { bank_G1, iso2022_94x94, { 0x41, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_CNS11643plane1 = /* CNS 11643-plane-1, part of ISO-2022-CN */ { bank_G1, iso2022_94x94, { 0x47, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_CNS11643plane2 = /* CNS 11643-plane-1, part of ISO-2022-CN */ { bank_G2, iso2022_94x94, { 0x48, 0x00, 0x00, 0x00 } }; #if 0 static struct iso2022_setid set_GB12345 = /* GB 12345, part of ISO-2022-CN-EXT -- NOTE: Final byte unknown */ { bank_G1, iso2022_94x94, { 0x00, 0x00, 0x00, 0x00 } }; #endif static struct iso2022_setid set_ISOIR165 = /* ISO-IR-165, part of ISO-2022-CN-EXT */ { bank_G1, iso2022_94x94, { 0x45, 0x00, 0x00, 0x00 } }; #if 0 static struct iso2022_setid set_GB7589 = /* GB 7589, part of ISO-2022-CN-EXT -- NOTE: Final byte unknown */ { bank_G2, iso2022_94x94, { 0x00, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_GB13131 = /* GB 13131, part of ISO-2022-CN-EXT -- NOTE: Final byte unknown */ { bank_G2, iso2022_94x94, { 0x00, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_GB7590 = /* GB 7590, part of ISO-2022-CN-EXT -- NOTE: Final byte unknown */ { bank_G3, iso2022_94x94, { 0x00, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_GB13132 = /* GB 13132, part of ISO-2022-CN-EXT -- NOTE: Final byte unknown */ { bank_G3, iso2022_94x94, { 0x00, 0x00, 0x00, 0x00 } }; #endif static struct iso2022_setid set_CNS11643plane3 = /* CNS 11643-plane-3, part of ISO-2022-CN */ { bank_G3, iso2022_94x94, { 0x49, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_CNS11643plane4 = /* CNS 11643-plane-4, part of ISO-2022-CN */ { bank_G3, iso2022_94x94, { 0x4A, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_CNS11643plane5 = /* CNS 11643-plane-5, part of ISO-2022-CN */ { bank_G3, iso2022_94x94, { 0x4B, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_CNS11643plane6 = /* CNS 11643-plane-5, part of ISO-2022-CN */ { bank_G3, iso2022_94x94, { 0x4C, 0x00, 0x00, 0x00 } }; static struct iso2022_setid set_CNS11643plane7 = /* CNS 11643-plane-5, part of ISO-2022-CN */ { bank_G3, iso2022_94x94, { 0x4D, 0x00, 0x00, 0x00 } }; static struct iso2022_setid latin_banks[] = { { bank_G0, iso2022_94, { 0x42, 0x00, 0x00, 0x00 } }, /* ASCII */ { bank_unspecified, iso2022_96, { 0x41, 0x00, 0x00, 0x00 } }, /* 1 */ { bank_unspecified, iso2022_96, { 0x42, 0x00, 0x00, 0x00 } }, /* 2 */ { bank_unspecified, iso2022_96, { 0x43, 0x00, 0x00, 0x00 } }, /* 3 */ { bank_unspecified, iso2022_96, { 0x44, 0x00, 0x00, 0x00 } }, /* 4 */ { bank_unspecified, iso2022_96, { 0x4C, 0x00, 0x00, 0x00 } }, /* 5 */ { bank_unspecified, iso2022_96, { 0x47, 0x00, 0x00, 0x00 } }, /* 6 */ { bank_unspecified, iso2022_96, { 0x46, 0x00, 0x00, 0x00 } }, /* 7 */ { bank_unspecified, iso2022_96, { 0x48, 0x00, 0x00, 0x00 } }, /* 8 */ { bank_unspecified, iso2022_96, { 0x4D, 0x00, 0x00, 0x00 } }, /* 9 */ { bank_unspecified, iso2022_96, { 0x56, 0x00, 0x00, 0x00 } }, /* 10 */ { bank_unspecified, iso2022_96, { 0x54, 0x00, 0x00, 0x00 } }, /* 11 */ }; struct iso2022_setid * CONST ASCII_BANK = &latin_banks[0]; struct iso2022_setid * CONST LATIN1_BANK = &latin_banks[1]; struct iso2022_map_list INITIAL_iso2022_map_list[] = { { &return_to_iso2022, NULL, ml_system }, { &set0_utf8, NULL, ml_system }, { & latin_banks[0], &latin_iso2022_map_ascii, ml_system },/* ASCII */ { & latin_banks[1], &latin_iso2022_map_latin1, ml_system },/* ISO-8859-1 */ { & latin_banks[2], NULL, ml_system }, { & latin_banks[3], NULL, ml_system }, { & latin_banks[4], NULL, ml_system }, { & latin_banks[5], NULL, ml_system }, { & latin_banks[6], NULL, ml_system }, { & latin_banks[7], NULL, ml_system }, { & latin_banks[8], NULL, ml_system }, { & latin_banks[9], NULL, ml_system }, { & latin_banks[10], NULL, ml_system }, { & latin_banks[11], NULL, ml_system }, { &set1_latin7, NULL, ml_system }, { &set1_latin8, NULL, ml_system }, { &set1_latin9, NULL, ml_system }, { &set1_iso885916, NULL, ml_system }, { &set1_koi8e, NULL, ml_system }, { &set1_iso_ir_2, NULL, ml_system }, { &set1_iso_ir_4, NULL, ml_system }, { &set1_iso_ir_8_1, NULL, ml_system }, { &set1_iso_ir_8_2, NULL, ml_system }, { &set1_iso_ir_9_1, NULL, ml_system }, { &set1_iso_ir_9_2, NULL, ml_system }, { &set1_iso_ir_10, NULL, ml_system }, { &set1_iso_ir_11, NULL, ml_system }, { &set1_iso_ir_13, NULL, ml_system }, { &set1_iso_ir_15, NULL, ml_system }, { &set1_iso_ir_16, NULL, ml_system }, { &set1_iso_ir_17, NULL, ml_system }, { &set1_iso_ir_18, NULL, ml_system }, { &set1_iso_ir_19, NULL, ml_system }, { &set1_iso_ir_21, NULL, ml_system }, { &set1_iso_ir_25, NULL, ml_system }, { &set1_iso_ir_27, NULL, ml_system }, { &set1_iso_ir_37, NULL, ml_system }, { &set1_iso_ir_47, NULL, ml_system }, { &set1_iso_ir_49, NULL, ml_system }, { &set1_iso_ir_50, NULL, ml_system }, { &set1_iso_ir_51, NULL, ml_system }, { &set1_iso_ir_54, NULL, ml_system }, { &set1_iso_ir_55, NULL, ml_system }, { &set1_iso_ir_57, NULL, ml_system }, { &set1_iso_ir_60, NULL, ml_system }, { &set1_iso_ir_61, NULL, ml_system }, { &set1_iso_ir_69, NULL, ml_system }, { &set1_iso_ir_70, NULL, ml_system }, { &set1_iso_ir_84, NULL, ml_system }, { &set1_iso_ir_85, NULL, ml_system }, { &set1_iso_ir_86, NULL, ml_system }, { &set1_iso_ir_89, NULL, ml_system }, { &set1_iso_ir_90, NULL, ml_system }, { &set1_iso_ir_91, NULL, ml_system }, { &set1_iso_ir_92, NULL, ml_system }, { &set1_iso_ir_93, NULL, ml_system }, { &set1_iso_ir_94, NULL, ml_system }, { &set1_iso_ir_95, NULL, ml_system }, { &set1_iso_ir_96, NULL, ml_system }, { &set1_iso_ir_98, NULL, ml_system }, { &set1_iso_ir_99, NULL, ml_system }, { &set1_iso_ir_102, NULL, ml_system }, { &set1_iso_ir_103, NULL, ml_system }, { &set1_iso_ir_121, NULL, ml_system }, { &set1_iso_ir_122, NULL, ml_system }, { &set1_iso_ir_123, NULL, ml_system }, { &set1_iso_ir_128, NULL, ml_system }, { &set1_iso_ir_139, NULL, ml_system }, { &set1_iso_ir_141, NULL, ml_system }, { &set1_iso_ir_142, NULL, ml_system }, { &set1_iso_ir_143, NULL, ml_system }, { &set1_iso_ir_146, NULL, ml_system }, { &set1_iso_ir_147, NULL, ml_system }, { &set1_iso_ir_150, NULL, ml_system }, { &set1_iso_ir_151, NULL, ml_system }, { &set1_iso_ir_152, NULL, ml_system }, { &set1_iso_ir_153, NULL, ml_system }, { &set1_iso_ir_154, NULL, ml_system }, { &set1_iso_ir_155, NULL, ml_system }, { &set_KSC5601, NULL, ml_system }, { &set_JISC6220, NULL, ml_system }, { &set_JISX0201_euc, NULL, ml_system }, { &set_JISC6226a, NULL, ml_system }, { &set_JISC6226b, NULL, ml_system }, { &set_JISX0208_1983_euc, NULL, ml_system }, { &set_GB2312jp, NULL, ml_system }, { &set_KSC5601jp, NULL, ml_system }, { &set_JISX0212, NULL, ml_system }, { &set_JISX0212_euc, NULL, ml_system }, { &set_ISO88591, &latin_iso2022_map_latin1, ml_system }, { &set_ISO88597, NULL, ml_system }, { &set_GB2312, NULL, ml_system }, { &set_CNS11643plane1, NULL, ml_system }, { &set_CNS11643plane2, NULL, ml_system }, #if 0 /* Final byte unknown */ { &set_GB12345, NULL, ml_system }, #endif { &set_ISOIR165, NULL, ml_system }, #if 0 /* Final byte unknown */ { &set_GB7589, NULL, ml_system }, { &set_GB13131, NULL, ml_system }, { &set_GB7590, NULL, ml_system }, { &set_GB13132, NULL, ml_system }, #endif { &set_CNS11643plane3, NULL, ml_system }, { &set_CNS11643plane4, NULL, ml_system }, { &set_CNS11643plane5, NULL, ml_system }, { &set_CNS11643plane6, NULL, ml_system }, { &set_CNS11643plane7, NULL, ml_system } }; struct iso2022_map_list * iso2022_map_list = INITIAL_iso2022_map_list; int iso2022_map_list_count = sizeof INITIAL_iso2022_map_list / sizeof (INITIAL_iso2022_map_list[0]); void fill_iso2022_map_setlist_bytes(iso2022_map_index,type,bytes,bytes_size) int iso2022_map_index; enum iso2022_settype type; unsigned char *bytes; int bytes_size; { if (iso2022_map_index < 0 || iso2022_map_index >= iso2022_map_list_count) panic("ISO2022 PANIC",__FILE__,__LINE__, "fill_iso2022_map_setlist_bytes", "iso2022_map_index out of range",0); if (!iso2022_map_list[iso2022_map_index].setid) panic("ISO2022 PANIC",__FILE__,__LINE__, "fill_iso2022_map_setlist_bytes", "No setid",0); if (type != iso2022_map_list[iso2022_map_index].setid->type) panic("ISO2022 PANIC",__FILE__,__LINE__, "fill_iso2022_map_setlist_bytes", "type mismatch",0); if (sizeof iso2022_map_list[iso2022_map_index].setid->bytes != bytes_size) panic("ISO2022 PANIC",__FILE__,__LINE__, "fill_iso2022_map_setlist_bytes", "size mismatch",0); memcpy(bytes,iso2022_map_list[iso2022_map_index].setid->bytes,bytes_size); } static int realloc_iso2022_map_list P_((int add)); static int realloc_iso2022_map_list(add) int add; { int new_max = iso2022_map_list_count + add; if (!ISO2022_MAP_LIST_ALLOCED) { int i; iso2022_map_list = safe_malloc((new_max) * sizeof (iso2022_map_list[0])); for (i = 0; i < iso2022_map_list_count; i++) iso2022_map_list[i] = INITIAL_iso2022_map_list[i]; } else { iso2022_map_list = safe_realloc(iso2022_map_list, (new_max) * sizeof (iso2022_map_list[0])); } return new_max; } static struct iso2022_keyword { CONST char * keyword; enum iso2022_bank bank; enum iso2022_settype type; } iso2022_keywords[] = { { "other-set", bank_unspecified, iso2022_other }, /* Sets without bank specification */ { "bank-94", bank_unspecified, iso2022_94 }, { "bank-96", bank_unspecified, iso2022_96 }, { "bank-94x94", bank_unspecified, iso2022_94x94 }, { "bank-96x96", bank_unspecified, iso2022_96x96 }, /* Bank G0 */ { "bank-G0-94", bank_G0, iso2022_94 }, { "bank-G0-94x94", bank_G0, iso2022_94x94 }, /* Bank G1 */ { "bank-G1-94", bank_G1, iso2022_94 }, { "bank-G1-96", bank_G1, iso2022_96 }, { "bank-G1-94x94", bank_G1, iso2022_94x94 }, { "bank-G1-96x96", bank_G1, iso2022_96x96 }, /* Bank G2 */ { "bank-G2-94", bank_G2, iso2022_94 }, { "bank-G2-96", bank_G2, iso2022_96 }, { "bank-G2-94x94", bank_G2, iso2022_94x94 }, { "bank-G2-96x96", bank_G2, iso2022_96x96 }, /* Bank G3 */ { "bank-G3-94", bank_G3, iso2022_94 }, { "bank-G3-96", bank_G3, iso2022_96 }, { "bank-G3-94x94", bank_G3, iso2022_94x94 }, { "bank-G3-96x96", bank_G3, iso2022_96x96 }, { NULL, bank_unspecified, iso2022_other } }; static int parse_ISO2022_ident_spec P_((const char *val, unsigned char *bytes, int size)); static int same_setid_bytes P_((const struct iso2022_setid A, const struct iso2022_setid B)); /* -1 == not found, otherwise index to iso2022_map_list[] index must exist on index_list */ int give_iso2022_index(index_list,index_count,set_text) int *index_list; int index_count; struct iso2022_setid * set_text; { int i; /* First exact match */ for (i = 0; i < index_count; i++) { if (-1 != index_list[i]) { int idx; if (index_list[i] < 0 || index_list[i] >= iso2022_map_list_count) panic("ISO2022 PANIC",__FILE__,__LINE__, "give_iso2022_index", "Bad index",0); idx = index_list[i]; if (same_setid(*(iso2022_map_list[idx].setid),*set_text)) { return idx; } } } /* Then match without bank -- if on index there is no bank given */ for (i = 0; i < index_count; i++) { if (-1 != index_list[i]) { int idx; if (index_list[i] < 0 || index_list[i] >= iso2022_map_list_count) panic("ISO2022 PANIC",__FILE__,__LINE__, "give_iso2022_index", "Bad index",0); idx = index_list[i]; if (iso2022_map_list[idx].setid->bank == bank_unspecified && iso2022_map_list[idx].setid->type == set_text->type && same_setid_bytes(*(iso2022_map_list[idx].setid),*set_text)) { DPRINT(Debug,61,(&Debug, "Set bank %d type %d match without bank -- iso2022 index %d\n", set_text->bank, set_text->type, idx)); return idx; } } } #ifdef DEBUG if (Debug.active > 60) { char *x = iso2022_codestr(set_text->bytes, sizeof (set_text->bytes)); DPRINT(Debug,61,(&Debug, "No set bank %d type %d bytes=%s ", set_text->bank, set_text->type, x ? x : "???")); free(x); DPRINT(Debug,61,(&Debug, " --- iso2022 indexes :")); for (i = 0; i < index_count; i++) { DPRINT(Debug,61,(&Debug," %d",index_list[i])); } DPRINT(Debug,61,(&Debug,"\n")); } #endif return -1; } /* -1 == not found, otherwise index to iso2022_map_list[] */ int find_iso2022_map_spec(name) char *name; { int res = -1; char * p = strchr(name,' '); if (p) { int kw,i; struct iso2022_setid TMP; *p++ = '\0'; for (kw = 0; iso2022_keywords[kw].keyword; kw++) if (0 == strcmp(iso2022_keywords[kw].keyword,name)) break; if (!iso2022_keywords[kw].keyword) { lib_error(CATGETS(elm_msg_cat, MeSet, MeNotKWISO2022sets, "Map with keyword %s not found from ISO2022 sets (bad keyword)"), name); return -1; } TMP.bank = iso2022_keywords[kw].bank; TMP.type = iso2022_keywords[kw].type; if (!parse_ISO2022_ident_spec(p,TMP.bytes,sizeof (TMP.bytes))) { lib_error(CATGETS(elm_msg_cat, MeSet, MeNotIdentISO2022sets, "Map %s %s not found from ISO2022 sets (bad ident)"), name,p); return -1; } /* Similar than loc_setid algorithm */ for (i = 0; i < iso2022_map_list_count; i++) { if (iso2022_map_list[i].map) { if (same_setid(*(iso2022_map_list[i].setid),TMP)) { res = i; } } } if (res < 0) lib_error(CATGETS(elm_msg_cat, MeSet, MeNoMapISO2022sets, "Map %s %s not found from ISO2022 sets"), name,p); } else { int i; for (i = 0; i < iso2022_map_list_count; i++) { if (iso2022_map_list[i].map) { if ( 0 == strcmp(name, iso2022_mapname(iso2022_map_list[i].map))) { res = i; } } } if (res < 0) lib_error(CATGETS(elm_msg_cat, MeSet, MeNotFoundISO2022sets, "Map with name %s not found from ISO2022 sets"), name); } DPRINT(Debug,11,(&Debug, "find_iso2022_map_spec(\"%s\")=%d\n", name,res)); return res; } int parse_iso2022_map(filename,errors,mode) CONST char *filename; int *errors; enum map_list_mode mode; { /* banktype "bytes" file (flags) */ int max_count = 0; int new_max; int count = 0; FILE * f; char buf[LONG_STRING]; int c, l1; int err = can_open(filename,"r"); if (err) { DPRINT(Debug,2,(&Debug, "parse_iso2022_map=0: %s: %s (can_open)\n", filename,error_description(err))); return 0; } f = fopen(filename,"r"); if (!f) { int err = errno; DPRINT(Debug,2,(&Debug, "parse_iso2022_map=0: %s: %s\n", filename,error_description(err))); return 0; } while(EOF != (c = fgetc(f))) if ('\n' == c) max_count++; DPRINT(Debug,9,(&Debug, "parse_iso2022_map: %s, max_count=%d\n", filename,max_count)); if (!max_count) { fclose(f); return 0; } rewind(f); new_max = realloc_iso2022_map_list(max_count); while (count < max_count && iso2022_map_list_count < new_max && (l1 = mail_gets(buf,sizeof buf, f)) > 0) { char *c,*c1,*c2, *c3; int code_c3 = 0; char * pat = NULL; int kw; struct iso2022_mapinfo *map = NULL; struct iso2022_setid TMP, *id; if ('\n' == buf[l1 -1]) buf[l1 - 1] = '\0'; else { lib_error(CATGETS(elm_msg_cat, MeSet, MeTooLongLine, "%.30s: Too long line: %.30s..."), filename,buf); (*errors) ++; break; } l1--; while (l1-- > 0 && whitespace(buf[l1])) buf[l1] = '\0'; c = buf; while (*c && whitespace (*c)) /* skip leading whitespace */ c++; if ('#' == *c) continue; if (!*c) continue; c1 = strpbrk(c," \t"); if (!c1) { lib_error(CATGETS(elm_msg_cat, MeSet, MeBadLine, "%.30s: Bad line: %.30s..."), filename,buf); (*errors) ++; break; } *c1 = '\0'; c1++; for (kw = 0; iso2022_keywords[kw].keyword; kw++) if (0 == strcmp(iso2022_keywords[kw].keyword,c)) break; if (!iso2022_keywords[kw].keyword) { lib_error(CATGETS(elm_msg_cat, MeSet, MeBadLine, "%.30s: Bad line: %.30s..."), filename,buf); (*errors) ++; break; } TMP.bank = iso2022_keywords[kw].bank; TMP.type = iso2022_keywords[kw].type; while (*c1 && whitespace (*c1)) /* skip leading whitespace */ c1++; if (!*c1) { lib_error(CATGETS(elm_msg_cat, MeSet, MeBadLine, "%.30s: Bad line: %.30s..."), filename,buf); (*errors) ++; break; } c2 = qstrpbrk(c1," \t"); if (!c2) { lib_error(CATGETS(elm_msg_cat, MeSet, MeBadLine, "%.30s: Bad line: %.30s..."), filename,buf); (*errors) ++; break; } *c2 = '\0'; c2++; pat = dequote_opt(c1,c2-c1); if (!parse_ISO2022_ident_spec(pat,TMP.bytes,sizeof (TMP.bytes))) { free(pat); pat = NULL; lib_error(CATGETS(elm_msg_cat, MeSet, MeBadLine, "%.30s: Bad line: %.30s..."), filename,buf); (*errors) ++; break; } free(pat); pat = NULL; while (*c2 && whitespace (*c2)) /* skip leading whitespace */ c2++; if (!*c2) { lib_error(CATGETS(elm_msg_cat, MeSet, MeBadLine, "%.30s: Bad line: %.30s..."), filename,buf); (*errors) ++; break; } /* look flags */ c3 = strpbrk(c2," \t"); code_c3 = 0; if (c3) { *c3 = '\0'; c3++; while (*c3 && whitespace (*c3)) /* skip leading whitespace */ c3++; if (*c3) { code_c3 = iso2022_parseflag_ok(c3); if (!code_c3) { lib_error(CATGETS(elm_msg_cat, MeSet, MeBadLine, "%.30s: Bad line: %.30s..."), filename,buf); (*errors) ++; break; } } else c3 = NULL; } if (code_c3 & PF_IS_BUILTIN) { struct map_info *builtin_map; struct charset_type * MAP_type = NULL; switch (code_c3 & PF_type_mask) { case PF_ascii: MAP_type = &cs_ascii; break; case PF_bytemap: MAP_type = &cs_onebyte; break; default: panic("ISO2022 PANIC",__FILE__,__LINE__, "parse_iso2022_map", "Bad flags for internal map",0); } DPRINT(Debug,5,(&Debug,"%s: Treating %s as %s map\n", filename,c2,MAP_type->type_name)); builtin_map = MAP_type->find_map_type(c2); if (builtin_map) map = make_iso2022_map(builtin_map,TMP.type,code_c3,c3); else { lib_error(CATGETS(elm_msg_cat, MeSet, MeUnknownMap, "No map %s on charset type %s"), c2,MAP_type->type_name); map = NULL; } } else map = read_iso2022_map(c2, TMP.type,code_c3,c3); if (!map) { (*errors) ++; break; } id = safe_malloc(sizeof (struct iso2022_setid)); *id = TMP; iso2022_map_list[iso2022_map_list_count].setid = id; iso2022_map_list[iso2022_map_list_count].map = map; iso2022_map_list[iso2022_map_list_count].mode = mode; iso2022_map_list_count++; count++; /* Not actually used */ } DPRINT(Debug,9,(&Debug, "parse_iso2022_map: %s, %d parsed (%d total)\n", filename,count,iso2022_map_list_count)); fclose(f); return 1; } void dump_iso2022_map(f,mode) FILE *f; enum map_list_mode mode; { int i; for (i = 0; i < iso2022_map_list_count; i++) { if (mode == iso2022_map_list[i].mode && iso2022_map_list[i].setid && iso2022_map_list[i].map) { int j; for (j = 0; iso2022_keywords[j].keyword; j++) { if (iso2022_keywords[j].bank == iso2022_map_list[i].setid->bank && iso2022_keywords[j].type == iso2022_map_list[i].setid->type) { char * t = iso2022_codestr(iso2022_map_list[i].setid->bytes, sizeof iso2022_map_list[i].setid-> bytes); if (t) { CONST char *X; if (0 == strchr(t,' ')) elm_fprintf(f,FRM("%s\t%s\t%s"), iso2022_keywords[j].keyword, t,iso2022_mapname(iso2022_map_list[i].map)); else elm_fprintf(f,FRM("%s\t%Q\t%s"), iso2022_keywords[j].keyword, t,iso2022_mapname(iso2022_map_list[i].map)); X = iso2022_mapflags(iso2022_map_list[i].map); if (X) fprintf(f,"\t%s",X); putc('\n',f); free(t); } } } } } } static int same_setid_bytes(A,B) CONST struct iso2022_setid A; CONST struct iso2022_setid B; { int i; for (i = 0; i < sizeof A.bytes; i++) if (A.bytes[i] != B.bytes[i]) return 0; return 1; } int same_setid(A,B) CONST struct iso2022_setid A; CONST struct iso2022_setid B; { if (A.bank != B.bank) return 0; if (A.type != B.type) return 0; if (!same_setid_bytes(A,B)) return 0; return 1; } static struct iso2022_setid * loc_setid P_((const struct iso2022_setid c)); static struct iso2022_setid * loc_setid(c) CONST struct iso2022_setid c; { struct iso2022_setid * ret = NULL; int i; int found_it = 0; /* May have several given on {lib}/elm.iso2022sets and ~/.elm/iso2022.sets ... */ for (i = 0; i < iso2022_map_list_count; i++) { if (same_setid(*(iso2022_map_list[i].setid),c)) { ret = iso2022_map_list[i].setid; goto found; } } /* Create new setid */ ret = safe_malloc(sizeof (struct iso2022_setid)); *ret = c; realloc_iso2022_map_list(1); iso2022_map_list[iso2022_map_list_count].setid = ret; iso2022_map_list[iso2022_map_list_count].map = NULL; iso2022_map_list[iso2022_map_list_count].mode = ml_none; iso2022_map_list_count++; DPRINT(Debug,25,(&Debug, "loc_setid: Adding new id to list, count %d", iso2022_map_list_count)); found: DPRINT(Debug,25,(&Debug, "loc_setid=%p *mapnum=%d\n")); return ret; } struct setlist set_utf8 = { { -1, -1, -1, -1 }, { &set0_utf8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_unspecified, bank_unspecified }; struct setlist set_latin7 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_latin7, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }; struct setlist set_latin8 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_latin8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }; struct setlist set_latin9 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_latin9, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }; struct setlist set_iso885916 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso885916, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }; struct setlist set_koi8e = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_koi8e, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }; /* codeset ISO_646.irv:1983 -- iso-ir-2 */ struct setlist set_iso_ir_2 = { { -1, -1, -1, -1 }, { &set1_iso_ir_2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-GB - codeset BS_4730 -- iso-ir-4 */ struct setlist set_iso_ir_4 = { { -1, -1, -1, -1 }, { &set1_iso_ir_4, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset NATS-SEFI -- iso-ir-8-1 */ struct setlist set_iso_ir_8_1 = { { -1, -1, -1, -1 }, { &set1_iso_ir_8_1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset NATS-SEFI-ADD -- iso-ir-8-2 */ struct setlist set_iso_ir_8_2 = { { -1, -1, -1, -1 }, { &set1_iso_ir_8_2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset NATS-DANO -- iso-ir-9-1 */ struct setlist set_iso_ir_9_1 = { { -1, -1, -1, -1 }, { &set1_iso_ir_9_1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset NATS-DANO-ADD -- iso-ir-9-2 */ struct setlist set_iso_ir_9_2 = { { -1, -1, -1, -1 }, { &set1_iso_ir_9_2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-FI, codeset SEN_850200_B -- iso-ir-10 */ struct setlist set_iso_ir_10 = { { -1, -1, -1, -1 }, { &set1_iso_ir_10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-SE2, codeset SEN_850200_C -- iso-ir-11 */ struct setlist set_iso_ir_11 = { { -1, -1, -1, -1 }, { &set1_iso_ir_11, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* "KS_C_5601-1987" -- ISO-IR-149 */ struct setlist set_iso_ir_149 = { { -1, -1, -1, -1 }, { &set_KSC5601jp, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ... must probably incorrect assigment of backs ... */ struct setlist set_iso_ir_13 = { { -1, -1, -1, -1 }, { &set_JISC6220, &set1_iso_ir_13, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* ISO646-IT, codeset IT -- iso-ir-15 */ struct setlist set_iso_ir_15 = { { -1, -1, -1, -1 }, { &set1_iso_ir_15, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-PT, codeset PT -- iso-ir-16 */ struct setlist set_iso_ir_16 = { { -1, -1, -1, -1 }, { &set1_iso_ir_16, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-ES, codeset ES -- iso-ir-17 */ struct setlist set_iso_ir_17 = { { -1, -1, -1, -1 }, { &set1_iso_ir_17, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset greek7-old -- iso-ir-18 */ struct setlist set_iso_ir_18 = { { -1, -1, -1, -1 }, { &set1_iso_ir_18, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset latin-greek -- iso-ir-19 */ struct setlist set_iso_ir_19 = { { -1, -1, -1, -1 }, { &set1_iso_ir_19, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-DE, codeset DIN_66003 -- iso-ir-21 */ struct setlist set_iso_ir_21 = { { -1, -1, -1, -1 }, { &set1_iso_ir_21, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-FR1, codeset NF_Z_62-010_(1973) -- iso-ir-25 */ struct setlist set_iso_ir_25 = { { -1, -1, -1, -1 }, { &set1_iso_ir_25, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset Latin-greek-1 -- iso-ir-27 */ struct setlist set_iso_ir_27 = { { -1, -1, -1, -1 }, { &set1_iso_ir_27, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset ISO_5427 -- iso-ir-37 */ struct setlist set_iso_ir_37 = { { -1, -1, -1, -1 }, { &set1_iso_ir_37, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset BS_viewdata -- iso-ir-47 */ struct setlist set_iso_ir_47 = { { -1, -1, -1, -1 }, { &set1_iso_ir_47, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset INIS -- iso-ir-49 */ struct setlist set_iso_ir_49 = { { -1, -1, -1, -1 }, { &set1_iso_ir_49, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset INIS-8 -- iso-ir-50 */ struct setlist set_iso_ir_50 = { { -1, -1, -1, -1 }, { &set1_iso_ir_49, &set1_iso_ir_50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset INIS-cyrillic -- iso-ir-51 */ struct setlist set_iso_ir_51 = { { -1, -1, -1, -1 }, { &set1_iso_ir_49, &set1_iso_ir_51, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "ISO_5427:1981" -- iso-ir-54 */ struct setlist set_iso_ir_54 = { { -1, -1, -1, -1 }, { &set1_iso_ir_54, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "ISO_5428:1980" -- iso-ir-55 */ struct setlist set_iso_ir_55 = { { -1, -1, -1, -1 }, { &set1_iso_ir_55, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-CN, codeset "GB_1988-80" -- iso-ir-57 */ struct setlist set_iso_ir_57 = { { -1, -1, -1, -1 }, { &set1_iso_ir_57, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-NO, codeset "NS_4551-1" -- iso-ir-60 */ struct setlist set_iso_ir_60 = { { -1, -1, -1, -1 }, { &set1_iso_ir_60, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-NO2, codeset "NS_4551-2" -- iso-ir-61 */ struct setlist set_iso_ir_61 = { { -1, -1, -1, -1 }, { &set1_iso_ir_61, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-FR, codeset "NF_Z_62-010" -- iso-ir-69 */ struct setlist set_iso_ir_69 = { { -1, -1, -1, -1 }, { &set1_iso_ir_69, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "videotex-suppl" -- iso-ir-70 */ struct setlist set_iso_ir_70 = { { -1, -1, -1, -1 }, { &set1_iso_ir_70, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-PT2, codeset "PT2" -- iso-ir-84 */ struct setlist set_iso_ir_84 = { { -1, -1, -1, -1 }, { &set1_iso_ir_84, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-ES2, codeset "ES2" -- iso-ir-85 */ struct setlist set_iso_ir_85 = { { -1, -1, -1, -1 }, { &set1_iso_ir_85, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-HU, codeset "MSZ_7795.3" -- iso-ir-86 */ struct setlist set_iso_ir_86 = { { -1, -1, -1, -1 }, { &set1_iso_ir_86, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "ASMO_449" -- iso-ir-89 */ struct setlist set_iso_ir_89 = { { -1, -1, -1, -1 }, { &set1_iso_ir_89, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "iso-ir-90" */ struct setlist set_iso_ir_90 = { { -1, -1, -1, -1 }, { &set1_iso_ir_2, &set1_iso_ir_90, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "JIS_C6229-1984-a" -- iso-ir-91 */ struct setlist set_iso_ir_91 = { { -1, -1, -1, -1 }, { &set1_iso_ir_91, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-JP-OCR-B , codeset "JIS_C6229-1984-b" -- iso-ir-92 */ struct setlist set_iso_ir_92 = { { -1, -1, -1, -1 }, { &set1_iso_ir_92, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* This is quite likely wrong... codeset "JIS_C6229-1984-b-add" -- iso-ir-93 */ struct setlist set_iso_ir_93 = { { -1, -1, -1, -1 }, { &set1_iso_ir_92, &set1_iso_ir_93, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "JIS_C6229-1984-hand" -- iso-ir-94 */ struct setlist set_iso_ir_94 = { { -1, -1, -1, -1 }, { &set1_iso_ir_94, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "JIS_C6229-1984-hand-add" -- iso-ir-95 This is quite likely incorrect... */ struct setlist set_iso_ir_95 = { { -1, -1, -1, -1 }, { &set1_iso_ir_94, &set1_iso_ir_95, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "JIS_C6229-1984-kana" -- iso-ir-96 */ struct setlist set_iso_ir_96 = { { -1, -1, -1, -1 }, { &set1_iso_ir_96, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "ISO_2033-1983" -- iso-ir-98 * this is likely to be incorrect */ struct setlist set_iso_ir_98 = { { -1, -1, -1, -1 }, { &set1_iso_ir_98, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "ANSI_X3.110-1983" -- iso-ir-99 this is incorrect */ struct setlist set_iso_ir_99 = { { -1, -1, -1, -1 }, { &set1_iso_ir_99, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G2, bank_unspecified }; /* codeset "T.61-7bit" -- iso-ir-102 */ struct setlist set_iso_ir_102 = { { -1, -1, -1, -1 }, { &set1_iso_ir_102, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "T.61-8bit" -- iso-ir-103 */ struct setlist set_iso_ir_103 = { { -1, -1, -1, -1 }, { &set1_iso_ir_102, &set1_iso_ir_103, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* ISO646-CA, codeset "CSA_Z243.4-1985-1" -- iso-ir-121 */ struct setlist set_iso_ir_121 = { { -1, -1, -1, -1 }, { &set1_iso_ir_121, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-CA2, codeset "CSA_Z243.4-1985-2" -- iso-ir-122 */ struct setlist set_iso_ir_122 = { { -1, -1, -1, -1 }, { &set1_iso_ir_122, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "CSA_Z243.4-1985-gr" -- iso-ir-123 * This is probably incorrect */ struct setlist set_iso_ir_123 = { { -1, -1, -1, -1 }, { &set1_iso_ir_121, &set1_iso_ir_123, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "T.101-G2", ISO-IR-128 * This is likely to be incorrect */ struct setlist set_iso_ir_128 = { { -1, -1, -1, -1 }, { &set1_iso_ir_128, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G2, bank_unspecified }; /* codeset "CSN_369103", ISO-IR-139 * This is almost ISO-8859-2 */ struct setlist set_iso_ir_139 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso_ir_139, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }; /* ISO646-YU, codeset "JUS_I.B1.002", IS-IR-141 */ struct setlist set_iso_ir_141 = { { -1, -1, -1, -1 }, { &set1_iso_ir_141, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "ISO_6937-2-add", ISO-IR-142 */ struct setlist set_iso_ir_142 = { { -1, -1, -1, -1 }, { &set1_iso_ir_2, &set1_iso_ir_142, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "IEC_P27-1", ISO-IR-143 */ struct setlist set_iso_ir_143 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso_ir_143, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "JUS_I.B1.003-serb", ISO-IR-146 */ struct setlist set_iso_ir_146 = { { -1, -1, -1, -1 }, { &set1_iso_ir_146, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "JUS_I.B1.003-mac", ISO-IR-147 */ struct setlist set_iso_ir_147 = { { -1, -1, -1, -1 }, { &set1_iso_ir_147, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "greek-ccitt", ISO-IR-150 */ struct setlist set_iso_ir_150 = { { -1, -1, -1, -1 }, { &set1_iso_ir_150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO646-CU, codeset "NC_NC00-10:81", ISO-IR-151 */ struct setlist set_iso_ir_151 = { { -1, -1, -1, -1 }, { &set1_iso_ir_151, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset "ISO_6937-2-25", ISO-IR-152 * Assumed to be like ISO-8859-* */ struct setlist set_iso_ir_152 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso_ir_152, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "GOST_19768-74 ", ISO-IR-153 * Assumed to be like ISO-8859-* */ struct setlist set_iso_ir_153 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso_ir_153, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "ISO_8859-supp", ISO-IR-154 * Assumed to be like ISO-8859-* * This is likely to be incorrect */ struct setlist set_iso_ir_154 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso_ir_154, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G3 }; /* codeset "ISO_10367-box ", ISO-IR-155 * Assumed to be like ISO-8859-* * This is likely to be incorrect */ struct setlist set_iso_ir_155 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso_ir_155, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* codeset "latin-lap", ISO-IR-158 * Assumed to be like ISO-8859-* * This is likely to be incorrect */ struct setlist set_iso_ir_158 = { { -1, -1, -1, -1 }, { &(latin_banks[0]), &set1_iso_ir_158, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G3 }; /* ISO-2022-KR - RFC 1557 --- ASCII KSC 5601 EUC-KR -- G0 ASCII G1 KS X 1001 (KS C 5601) */ struct setlist set_ISO2022KR = { { 0, 1, -1, -1 }, { &(latin_banks[0]), &set_KSC5601, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; struct setlist set_EUCKR = { { 0, 1, -1, -1 }, { &(latin_banks[0]), &set_KSC5601, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* ISO-2022-JP - RFC 1468 -- ASCII, JIS C 6220 (JIS X 0201) - 1976 JIS C 6226 (JIS X 0208) - 1978 JIS C 6226 (JIS X 0208) - 1983 */ struct setlist set_ISO2022JP = { { 0, -1, -1, -1 }, { &(latin_banks[0]), &set_JISC6220, &set_JISC6226a, &set_JISC6226b, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* iso-ir-42 -- must likely incorrenct */ struct setlist set_iso_ir_42 = { { -1, -1, -1, -1 }, { &set_JISC6226a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* iso-ir-87 -- must likely incorrenct */ struct setlist set_iso_ir_87 = { { -1, -1, -1, -1 }, { &set_JISC6226b, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* EUC-JP - G0 ASCII G1 JIS X 0208-1983 G2 JIS X 0201:1976/1997 G3 JIS X 0212:1990 */ struct setlist set_EUCJP = { { 0, 1, 2, 3 }, { &(latin_banks[0]), &set_JISX0208_1983_euc, &set_JISX0201_euc, &set_JISX0212_euc, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; /* ISO646-JP -- JIS C 6220 (JIS X 0201) - 1976 */ struct setlist set_ISO646JP = { { -1, -1, -1, -1 }, { &set_JISC6220, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, bank_G0, bank_unspecified }; /* ISO-2022-JP-2 -- RFC 1554 -- ASCII, JIS C 6220 (JIS X 0201) - 1976 JIS C 6226 (JIS X 0208) - 1978 JIS C 6226 (JIS X 0208) - 1983 GB2312-1980 KSC5601-1987 JIS X 0212-1990 ISO8859-1 ISO8859-7(Greek) */ struct setlist set_ISO2022JP2 = { { 0, -1, -1, -1 }, { &(latin_banks[0]), &set_JISC6220, &set_JISC6226a, &set_JISC6226b, &set_GB2312jp, &set_KSC5601jp, &set_JISX0212, &set_ISO88591, &set_ISO88597, NULL }, bank_G0, bank_G2 }; /* GB_2312-80, iso-ir-58 */ struct setlist set_iso_ir_58 = { { -1, -1, -1, -1 }, { &set_GB2312jp , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* codeset JIS_X0212-1990, iso-ir-159 * This is likely be incorrect */ struct setlist set_iso_ir_159 = { { -1, -1, -1, -1 }, { &set_JISX0212, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO-2022-CN -- RFC 1922, ASCII, GB 2312, CNS 11643-plane-1, CNS 11643-plane-2 FIXME: This does not use sigle shifts for CNS 11643-plane-1, CNS 11643-plane-2 */ struct setlist set_ISO2022CN = { { 0, -1, -1, -1 }, { &(latin_banks[0]), &set_GB2312, &set_CNS11643plane1, &set_CNS11643plane2, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }; /* ISO-2022-CN-EXT -- RFC 1922, ASCII, bank G1: GB 2312, GB 12345, Final byte unknown! (set_GB12345) CNS 11643-plane-1, ISO-IR-165, bank G2: GB 7589, Final byte unknown! (set_GB7589) GB 13131, Final byte unknown! (set_GB13131) CNS 11643-plane-2, bank G3: GB 7590, Final byte unknown! (set_GB7590) GB 13132, Final byte unknown! (set_GB13132) CNS 11643-plane-3, CNS 11643-plane-(4-7) */ struct setlist set_ISO2022CNEXT = { { 0, -1, -1, -1 }, { &(latin_banks[0]), &set_GB2312, #if 0 /* Final byte unknown */ &set_GB12345, #endif &set_CNS11643plane1, &set_ISOIR165, #if 0 /* Final byte unknown */ &set_GB7589, &set_GB13131, #endif &set_CNS11643plane2, #if 0 /* Final byte unknown */ &set_GB7590, &set_GB13132, #endif &set_CNS11643plane3, &set_CNS11643plane4, &set_CNS11643plane5, &set_CNS11643plane6, &set_CNS11643plane7 }, bank_G0, bank_unspecified }; /* GB2312 (really EUC-CN) -- ASCII + GB 2312-80 */ struct setlist set_EUCCN = { { 0, 1, -1, -1 }, { &(latin_banks[0]), &set_GB2312, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G1 }; static struct setlist * INITIAL_setlists[] = { &set_utf8, &set_latin7, &set_latin8, &set_latin9, &set_iso885916, &set_koi8e, &set_iso_ir_2, &set_iso_ir_4, &set_iso_ir_8_1, &set_iso_ir_8_2, &set_iso_ir_9_1, &set_iso_ir_9_2, &set_iso_ir_10, &set_iso_ir_11, &set_iso_ir_13, &set_iso_ir_15, &set_iso_ir_16, &set_iso_ir_17, &set_iso_ir_18, &set_iso_ir_19, &set_iso_ir_21, &set_iso_ir_25, &set_iso_ir_27, &set_iso_ir_37, &set_iso_ir_47, &set_iso_ir_49, &set_iso_ir_50, &set_iso_ir_51, &set_iso_ir_54, &set_iso_ir_55, &set_iso_ir_57, &set_iso_ir_58, &set_iso_ir_60, &set_iso_ir_61, &set_iso_ir_69, &set_iso_ir_70, &set_iso_ir_84, &set_iso_ir_85, &set_iso_ir_86, &set_iso_ir_89, &set_iso_ir_90, &set_iso_ir_91, &set_iso_ir_92, &set_iso_ir_93, &set_iso_ir_94, &set_iso_ir_95, &set_iso_ir_96, &set_iso_ir_98, &set_iso_ir_99, &set_iso_ir_102, &set_iso_ir_103, &set_iso_ir_121, &set_iso_ir_122, &set_iso_ir_123, &set_iso_ir_128, &set_iso_ir_139, &set_iso_ir_141, &set_iso_ir_142, &set_iso_ir_143, &set_iso_ir_146, &set_iso_ir_147, &set_iso_ir_150, &set_iso_ir_151, &set_iso_ir_152, &set_iso_ir_153, &set_iso_ir_154, &set_iso_ir_155, &set_iso_ir_158, &set_iso_ir_159, &set_ISO2022KR, &set_EUCKR, &set_iso_ir_149, &set_ISO2022JP, &set_EUCJP, &set_ISO646JP, &set_ISO2022JP2, &set_iso_ir_42, &set_iso_ir_87, &set_ISO2022CN, &set_ISO2022CNEXT, }; struct setlist sets_iso_8859_X [] = { { { -1, -1, -1, -1 }, { &(latin_banks[0]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_unspecified }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[1]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[2]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[3]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[4]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[5]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[6]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[7]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[8]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[9]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[10]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, { { -1, -1, -1, -1 }, { &(latin_banks[0]), &(latin_banks[11]), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, bank_G0, bank_G2 }, }; static int same_setlist P_((const struct setlist A, const struct setlist B)); static int same_setlist(A,B) CONST struct setlist A; CONST struct setlist B; { int i; for (i = 0; i < sizeof (A.initial_bank) / sizeof (A.initial_bank[0]); i++) if (A.initial_bank[i] != B.initial_bank[i]) return 0; for (i = 0; i < sizeof (A.sets) / sizeof (A.sets[0]); i++) if (A.sets[i] != B.sets[i]) return 0; if (A.initial_L != B.initial_L) return 0; if (A.initial_R != B.initial_R) return 0; return 1; } struct setlist *loc_setlist(l) CONST struct setlist l; { static struct setlist ** setlists = INITIAL_setlists; static int setlist_count = sizeof (INITIAL_setlists) / sizeof (INITIAL_setlists[0]); struct setlist *ret; int i; for (i = 0; i < sizeof sets_iso_8859_X / sizeof (sets_iso_8859_X[0]); i++) { if (same_setlist(sets_iso_8859_X[i],l)) { ret = &(sets_iso_8859_X[i]); goto found; } } for (i = 0; i < setlist_count; i++) if (same_setlist(*(setlists[i]),l)) { ret = setlists[i]; goto found; } ret = safe_malloc(sizeof (struct setlist)); *ret = l; if (INITIAL_setlists == setlists) { int k; setlists = safe_malloc((setlist_count+1) * sizeof (struct setlist *)); for (k = 0; k < setlist_count; k++) setlists[k] = INITIAL_setlists[k]; } else setlists = safe_realloc(setlists, (setlist_count+1) * sizeof (struct setlist *)); setlists[setlist_count++] = ret; DPRINT(Debug,25,(&Debug, "loc_setlist: Addind new setlist to list, count %d\n", setlist_count)); found: DPRINT(Debug,25,(&Debug, "loc_setlist=%p\n",ret)); return ret; } /* May be called from signal handler -- on that situation use buffer specified as argument -- otherwise result is malloced */ char * iso2022_setid_stream(c,buffer,size) CONST struct iso2022_setid c; char *buffer; int size; { int len,j; char * ret; int idx = 0; int maybe_signal = buffer != NULL; if (maybe_signal) { SIGDPRINT(Debug,9,(&Debug, "iso2022_setid_stream: buffer=%p size=%d\n", buffer,size)); } if (maybe_signal) { ret = buffer; len = size-1; } else { for (len = 0; len < sizeof c.bytes; len++) if (!c.bytes[len]) break; len += 4; /* ESC {twobyte} bank {bytes} */ ret = safe_malloc(len+1); } #define ADD(x) if (idx >= len) \ panic("ISO2022 PANIC",__FILE__,__LINE__,"iso2022_setid_stream","Overlow",\ maybe_signal); \ else { ret[idx++]=(x); } ADD(0x1B); /* ESC */ switch(c.type) { case iso2022_other: ADD(0x25); break; case iso2022_94x94: ADD(0x24); /* FALLTHRU */ case iso2022_94: switch(c.bank) { case bank_G0: ADD(0x28); break; case bank_G1: ADD(0x29); break; case bank_G2: ADD(0x2A); break; case bank_G3: ADD(0x2B); break; } break; case iso2022_96x96: ADD(0x24); /* FALLTHRU */ case iso2022_96: switch(c.bank) { case bank_G1: ADD(0x2D); break; case bank_G2: ADD(0x2E); break; case bank_G3: ADD(0x2F); break; } break; } for (j = 0; j < sizeof c.bytes && c.bytes[j]; j++) { ADD(c.bytes[j]); } #undef ADD ret[idx] = '\0'; if (maybe_signal && ret != buffer) panic("ISO2022 PANIC",__FILE__,__LINE__, "iso2022_setid_stream", "buffer != ret when called from signal",1); return ret; } /* Special return values: 0 Not a setid * -1 Incomplete setid * > 0 len of setid */ static int eat_iso2022_ident P_((CONST unsigned char *buffer, int len)); int eat_iso2022_setid P_((struct iso2022_setid *result, const unsigned char *buffer, int len)); int eat_iso2022_setid(result,buffer,len) struct iso2022_setid *result; CONST unsigned char *buffer; int len; { int i = 0,l,j; int multi_byte = 0; result->type = iso2022_other; result->bank = bank_unspecified; if (len < 1) { DPRINT(Debug,60,(&Debug, "eat_iso2022_setid=-1: Too short %d\n", i)); return -1; } if (buffer[i] != 0x1B) /* ESC */ goto fail; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; if (buffer[i] == 0x24) { multi_byte++; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; } if (len <= i) { DPRINT(Debug,60,(&Debug, "eat_iso2022_setid=-1: Too short %d\n", i)); return -1; } switch(buffer[i]) { case 0x28: /* G0 */ if (multi_byte) result->type = iso2022_94x94; else result->type = iso2022_94; result->bank = bank_G0; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; break; case 0x29: /* G1 */ if (multi_byte) result->type = iso2022_94x94; else result->type = iso2022_94; result->bank = bank_G1; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; break; case 0x2A: /* G2 */ if (multi_byte) result->type = iso2022_94x94; else result->type = iso2022_94; result->bank = bank_G2; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; break; case 0x2B: /* G3 */ if (multi_byte) result->type = iso2022_94x94; else result->type = iso2022_94; result->bank = bank_G3; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; break; case 0x2D: /* G1 */ if (multi_byte) result->type = iso2022_96x96; else result->type = iso2022_96; result->bank = bank_G1; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; break; case 0x2E: /* G2 */ if (multi_byte) result->type = iso2022_96x96; else result->type = iso2022_96; result->bank = bank_G2; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; break; case 0x2F: /* G0 */ if (multi_byte) result->type = iso2022_96x96; else result->type = iso2022_96; result->bank = bank_G3; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid: accept [%d]=%02X\n", i,buffer[i])); i++; break; case 0x40: case 0x41: case 0x42: /* Old multibyte designation to bank 0 without bank code */ if (multi_byte) { result->type = iso2022_94x94; result->bank = bank_G0; /* Do not increment here because that is actually part of set * code */ break; } /* FALLTHROUGH */ default: goto fail; } l = eat_iso2022_ident(buffer+i,len-i); if (l == 0) { DPRINT(Debug,60,(&Debug, "eat_iso2022_setid=0: reject (eat_iso2022_ident) [%d]=%02X\n", i,buffer[i])); return 0; } if (l < 0) { DPRINT(Debug,60,(&Debug, "got_ISO2022_setid=-1: incomplete (eat_iso2022_ident)\n")); return -1; } for (j = 0; j < sizeof (result->bytes) && j < l; j++) result->bytes[j] = buffer[i+j]; for (; j < sizeof (result->bytes); j++) result->bytes[j] = 0; DPRINT(Debug,60,(&Debug, "eat_iso2022_setid=%d: accept (eat_iso2022_ident)\n", i+l)); return i+l; fail: DPRINT(Debug,60,(&Debug, "eat_iso2022_setid=0: reject [%d]=%02X\n", i,buffer[i])); return 0; } /* May be called from signal handler -- on that situation use buffer specified as argument -- otherwise result is malloced */ char * lock_shift(r,bank,buffer,size) int r; enum iso2022_bank bank; char *buffer; int size; { int len = 3; int idx = 0; char * ret; int maybe_signal = buffer != NULL; if (maybe_signal) { SIGDPRINT(Debug,9,(&Debug, "lock_sift: buffer=%p size=%d\n", buffer,size)); } if (maybe_signal) { ret = buffer; len = size-1; } else { ret = safe_malloc(len+1); } #define ADD(x) if (idx >= len) \ panic("ISO2022 PANIC",__FILE__,__LINE__,"lock_shift","Overlow",\ maybe_signal);\ else { ret[idx++]=(x); } switch(r) { case 0: switch (bank) { case bank_G0: ADD(0x0F); /* SI */ break; case bank_G1: ADD(0x0E); /* SO */ break; case bank_G2: ADD(0x1B); ADD(0x6E); break; case bank_G3: ADD(0x1B); ADD(0x6F); break; } break; default: switch (bank) { case bank_G1: ADD(0x1B); ADD(0x7E); break; case bank_G2: ADD(0x1B); ADD(0x7D); break; case bank_G3: ADD(0x1B); ADD(0x7C); break; } } #undef ADD ret[idx] = '\0'; if (maybe_signal && ret != buffer) panic("ISO2022 PANIC",__FILE__,__LINE__, "lock_sift", "buffer != ret when called from signal",1); return ret; } /* Special return values: 0 Not a bank switch * -1 Incomplete switch * > 0 len of switch */ int eat_iso2022_bank_switch P_((enum iso2022_bank *bank, enum shift_mode *left_right, CONST unsigned char *buffer, int len)); int eat_iso2022_bank_switch(bank,left_right,buffer,len) enum iso2022_bank *bank; enum shift_mode *left_right; CONST unsigned char *buffer; int len; { int i = 0; if (len < 1) { DPRINT(Debug,60,(&Debug, "eat_iso2022_bank_switch=-1: Too short %d\n", i)); return -1; } switch(buffer[i]) { case 0x0E: *bank = bank_G1; *left_right = lock_shift_left; break; case 0x0F: *bank = bank_G0; *left_right = lock_shift_left; break; case 0x1B: DPRINT(Debug,60,(&Debug, "eat_iso2022_bank_switch: accept [%d]=%02X\n", i,buffer[i])); i++; if (len <= i) { DPRINT(Debug,60,(&Debug, "eat_iso2022_bank_switch=-1: Too short %d\n", i)); return -1; } switch(buffer[i]) { case 0x7E: *bank = bank_G1; *left_right = lock_shift_right; break; case 0x6E: *bank = bank_G2; *left_right = lock_shift_left; break; case 0x7D: *bank = bank_G2; *left_right = lock_shift_right; break; case 0x6F: *bank = bank_G3; *left_right = lock_shift_left; break; case 0x7C: *bank = bank_G3; *left_right = lock_shift_right; break; case 0x4E: *bank = bank_G2; *left_right = single_shift; /* Normally left, but EUC uses right bank */ break; case 0x4F: *bank = bank_G3; *left_right = single_shift; break; default: goto fail; } break; case 0x8E: *bank = bank_G2; *left_right = single_shift; /* Normally left, but EUC uses right bank */ break; case 0x8F: *bank = bank_G3; *left_right = single_shift; /* Normally left, but EUC uses right bank */ break; default: goto fail; } DPRINT(Debug,60,(&Debug, "eat_iso2022_bank_switch: accept [%d]=%02X\n", i,buffer[i])); i++; DPRINT(Debug,60,(&Debug, "eat_iso2022_bank_switch=%d: accept (bank=%d, left_right=%d)\n", i, *bank,*left_right)); return i; fail: DPRINT(Debug,60,(&Debug, "eat_ISO2022_bank_switch=0: reject [%d]=%02X\n", i,buffer[i])); return 0; } /* -1 == no space, 0 == not available */ int do_single_shift(buffer,size,bank,is_upper) unsigned char buffer[]; int size; enum iso2022_bank bank; int is_upper; { int ret = 0; if (size < 2) return -1; /* NO SPACE */ if (is_upper) { switch (bank) { case bank_G2: buffer[ret++] = 0x8E; break; case bank_G3: buffer[ret++] = 0x8F; break; default: return 0; } } else { if (size < 3) return -1; /* NO SPACE */ buffer[ret++] = 0x1B; /* ESC */ switch (bank) { case bank_G2: buffer[ret++] = 0x4E; break; case bank_G3: buffer[ret++] = 0x4E; break; default: return 0; } } buffer[ret] = '\0'; return ret; } /* Special return values: 0 Not a ISO2022 ident * -1 Incomplete ident * > 0 len of ident */ static int eat_iso2022_ident(buffer,len) CONST unsigned char *buffer; int len; { int i = 0; while (i < len && buffer[i] >= 0x20 && buffer[i] <= 0x2F) { DPRINT(Debug,60,(&Debug, "eat_iso2022_ident: accept [%d]=%02X\n", i,buffer[i])); i++; } /* Final byte 0x30..0x7E 0x30..0x3F is only private use */ if (i < len && buffer[i] >= 0x30 && buffer[i] <= 0x7E) { DPRINT(Debug,60,(&Debug, "eat_iso2022_ident=%d: final [%d]=%02X\n", i+1,i,buffer[i])); i++; return i; } if (i == len) { DPRINT(Debug,60,(&Debug, "eat_iso2022_ident=-1: Too short %d\n", i)); return -1; } DPRINT(Debug,60,(&Debug, "eat_iso2022_ident=0: reject [%d]=%02X\n", i,buffer[i])); return 0; } void iso2022_clear_setlist(X) struct setlist *X; { int i; for (i = 0; i < sizeof (X->initial_bank) / sizeof (X->initial_bank[0]); i++) { X->initial_bank[i] = -1; } for (i = 0; i < sizeof (X->sets) / sizeof (X->sets[0]); i++) { X->sets[i] = NULL; } X->initial_L = bank_unspecified; X->initial_R = bank_unspecified; } int parse_gen_spec(val,bytes,size) CONST char *val; unsigned char *bytes; int size; { int ret = 0; int ptr = 0; char * temp = safe_strdup(val); char *wrk; for (wrk = strtok(temp," \t,"); wrk; wrk = strtok(NULL," \t,")) { char *end; long l = strtol(wrk,&end,10); if (ptr == size) { lib_error(CATGETS(elm_msg_cat, MeSet, MeTooLongident, "Too long ident: %.20s..."), temp); ret = 0; goto fail; } if ((*end == '\0') && l >= 0x01 && l <= 0x7F) { bytes[ptr] = l; DPRINT(Debug,11,(&Debug, "parse_gen_ident_spec: [%d]=%02X\n", ptr,bytes[ptr])); ptr++; } else if (*end == '/' && l >= 0 && l <= 15 && *(end+1) != '\0') { long l1; wrk = end+1; l1 = strtol(wrk,&end,10); if ((*end == '\0') && l1 >= 0 && l1 <= 15 && (l != 0 || l1 != 0)) { bytes[ptr] = l*16 + l1; DPRINT(Debug,11,(&Debug, "parse_gen_ident_spec: [%d]=%02X\n", ptr,bytes[ptr])); ptr++; } else { DPRINT(Debug,1,(&Debug, "parse_gen_ident_spec: wrk=%s, *end=%c,l1=%ld\n", wrk,*end,l1)); lib_error(CATGETS(elm_msg_cat, MeSet, MeBadident, "Bad ident: %.20s..."), wrk); ret = 0; goto fail; } } else { DPRINT(Debug,1,(&Debug, "parse_gen_ident_spec: wrk=%s, *end=%c,l=%ld\n", wrk,*end,l)); lib_error(CATGETS(elm_msg_cat, MeSet, MeBadident, "Bad ident: %.20s..."), wrk); ret = 0; goto fail; } } ret = ptr; fail: free(temp); while (ptr < size) bytes[ptr++] = '\0'; return ret; } static int parse_ISO2022_ident_spec(val,bytes,size) CONST char *val; unsigned char * bytes; int size; { int ret = 0, ptr,l; DPRINT(Debug,11,(&Debug, "parse_ISO2022_ident_spec: val=%s\n",val)); ptr = parse_gen_spec(val,bytes,size); if (ptr) { ret = 1; l = eat_iso2022_ident(bytes,ptr); if (l != ptr) { DPRINT(Debug,1,(&Debug, "parse_ISO2022_ident_spec: eat_iso2022_ident=%d, ptr=%d\n", l,ptr)); lib_error(CATGETS(elm_msg_cat, MeSet, MeBadISO2022ident, "Bad ISO2022 ident: %.20s..."), val); ret = 0; } } return ret; } static struct iso2022_banks { CONST char * keyword; enum iso2022_bank bank; } iso2022_banks[] = { { "none", bank_unspecified }, { "bank-G0", bank_G0 }, { "bank-G1", bank_G1 }, { "bank-G2", bank_G2 }, { "bank-G3", bank_G3 }, { NULL, bank_unspecified } }; void iso2022_merge_old_info(new_setlist,setcount,old_info) struct setlist *new_setlist; int setcount; struct setlist *old_info; { int i; int bank_info[ISO2022_BANK_NUM]; for (i = 0; i < ISO2022_BANK_NUM; i++) { bank_info[i] = new_setlist->initial_bank[i]; } for (i = 0; i < setcount; i++) { if (new_setlist->sets[i] && new_setlist->sets[i]->bank >= 0 && new_setlist->sets[i]->bank < ISO2022_BANK_NUM && -1 == bank_info[ new_setlist->sets[i]->bank ] ) bank_info[ new_setlist->sets[i]->bank ] = i; } /* copy old left= and rigth= specifications if bank is on use */ if (bank_unspecified == new_setlist->initial_L && bank_unspecified != old_info->initial_L && -1 != bank_info [ old_info->initial_L ]) new_setlist->initial_L = old_info->initial_L; if (bank_unspecified == new_setlist->initial_R && bank_unspecified != old_info->initial_R && -1 != bank_info [ old_info->initial_R ]) new_setlist->initial_R = old_info->initial_R; } int parse_iso2022_specification(param,value,count,list) CONST char *param; CONST char *value; int *count; struct setlist *list; { int i; struct iso2022_setid TMP; int initial = 0; int left_right = -1; /* TODO: Hook for extra parameters */ if (0 == strcmp("left",param)) left_right = 0; if (0 == strcmp("right",param)) left_right = 1; if (left_right >= 0) { for (i= 0; iso2022_banks[i].keyword; i++) if (0 == strcmp(iso2022_banks[i].keyword,value)) break; if (!iso2022_banks[i].keyword) return 0; switch(left_right) { case 0: list->initial_L = iso2022_banks[i].bank; break; case 1: if (iso2022_banks[i].bank == bank_G0) { lib_error(CATGETS(elm_msg_cat, MeSet, MeRigthNobank0, "right=bank-G0 is not allowed")); return 0; } list->initial_R = iso2022_banks[i].bank; break; } return 1; } if (0 == strncmp("initial-",param,8)) { param += 8; initial++; } for (i = 0; iso2022_keywords[i].keyword; i++) if (0 == strcmp(iso2022_keywords[i].keyword,param)) break; if (!iso2022_keywords[i].keyword) return 0; if (initial && ( iso2022_keywords[i].bank < 0 || iso2022_keywords[i].bank >= sizeof (list->initial_bank) / sizeof (list->initial_bank[0]))) return 0; TMP.bank = iso2022_keywords[i].bank; TMP.type = iso2022_keywords[i].type; if (!parse_ISO2022_ident_spec(value,TMP.bytes,sizeof (TMP.bytes))) return 0; if (initial) { int j; if (-1 != list->initial_bank[TMP.bank]) { lib_error(CATGETS(elm_msg_cat, MeSet, MeMultipleInitial, "Multiple initial-%.20s given"), param); return 0; } for (j = 0; j < (*count); j++) { if (same_setid(* list->sets[j],TMP)) break; } if (j < (*count)) { list->initial_bank[TMP.bank] = j; return 1; } } if ((*count) >= sizeof (list->sets) / sizeof (list->sets[0])) { lib_error(CATGETS(elm_msg_cat, MeSet, MeTooManyBank, "Too many banks on charset: %.20s"), param); return 0; } if (*count > 0 && list->sets[0]->type == iso2022_other) { lib_error(CATGETS(elm_msg_cat, MeSet, MeOtherSetIncompatible, "Param other-set is incompatible with param %s"), param); return 0; } list->sets[(*count)] = loc_setid(TMP); if (initial) list->initial_bank[TMP.bank] = (*count); (*count)++; return 1; } char * iso2022_codestr(bytes,size) unsigned char * bytes; int size; { char *ret = NULL; int i; for (i = 0; i < size && bytes[i]; i++) { char temp[10]; int val = (unsigned char) bytes[i]; sprintf(temp,"%d/%d",val/16,val%16); if (ret) ret = strmcat(ret," "); ret = strmcat(ret,temp); } return ret; } void print_setlist(f,l) FILE *f; struct setlist *l; { int i; if (bank_unspecified != l->initial_L) { for (i = 0; iso2022_banks[i].keyword; i++) if (iso2022_banks[i].bank == l->initial_L) fprintf(f,";left=%s",iso2022_banks[i].keyword); } if (bank_unspecified != l->initial_R) { for (i = 0; iso2022_banks[i].keyword; i++) if (iso2022_banks[i].bank == l->initial_R) fprintf(f,";right=%s",iso2022_banks[i].keyword); } for (i = 0; l->sets[i] && i < sizeof (l->sets) / sizeof (l->sets[0]); i++) { int j; for (j = 0; iso2022_keywords[j].keyword; j++) { if (iso2022_keywords[j].bank == l->sets[i]->bank && iso2022_keywords[j].type == l->sets[i]->type) { char * t = iso2022_codestr(l->sets[i]->bytes, sizeof l->sets[i]->bytes); if (t) { char *I = ""; if (l->sets[i]->bank >= 0 && l->sets[i]->bank < sizeof (l->initial_bank) / sizeof (l->initial_bank[0])) { if (l->initial_bank[l->sets[i]->bank] == i) { I = "initial-"; } } if (0 == strchr(t,' ')) elm_fprintf(f,FRM(";%s%s=%s"), I, iso2022_keywords[j].keyword, t); else elm_fprintf(f,FRM(";%s%s=%Q"), I, iso2022_keywords[j].keyword, t); free(t); } } } } } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */