17db96d56Sopenharmony_ci/* 27db96d56Sopenharmony_ci * _codecs_iso2022.c: Codecs collection for ISO-2022 encodings. 37db96d56Sopenharmony_ci * 47db96d56Sopenharmony_ci * Written by Hye-Shik Chang <perky@FreeBSD.org> 57db96d56Sopenharmony_ci */ 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci#define USING_IMPORTED_MAPS 87db96d56Sopenharmony_ci#define USING_BINARY_PAIR_SEARCH 97db96d56Sopenharmony_ci#define EXTERN_JISX0213_PAIR 107db96d56Sopenharmony_ci#define EMULATE_JISX0213_2000_ENCODE_INVALID MAP_UNMAPPABLE 117db96d56Sopenharmony_ci#define EMULATE_JISX0213_2000_DECODE_INVALID MAP_UNMAPPABLE 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci#include "cjkcodecs.h" 147db96d56Sopenharmony_ci#include "alg_jisx0201.h" 157db96d56Sopenharmony_ci#include "emu_jisx0213_2000.h" 167db96d56Sopenharmony_ci#include "mappings_jisx0213_pair.h" 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci/* STATE 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci state->c[0-3] 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci 00000000 237db96d56Sopenharmony_ci ||^^^^^| 247db96d56Sopenharmony_ci |+-----+---- G0-3 Character Set 257db96d56Sopenharmony_ci +----------- Is G0-3 double byte? 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci state->c[4] 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci 00000000 307db96d56Sopenharmony_ci || 317db96d56Sopenharmony_ci |+---- Locked-Shift? 327db96d56Sopenharmony_ci +----- ESC Throughout 337db96d56Sopenharmony_ci*/ 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci#define ESC 0x1B 367db96d56Sopenharmony_ci#define SO 0x0E 377db96d56Sopenharmony_ci#define SI 0x0F 387db96d56Sopenharmony_ci#define LF 0x0A 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci#define MAX_ESCSEQLEN 16 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci#define CHARSET_ISO8859_1 'A' 437db96d56Sopenharmony_ci#define CHARSET_ASCII 'B' 447db96d56Sopenharmony_ci#define CHARSET_ISO8859_7 'F' 457db96d56Sopenharmony_ci#define CHARSET_JISX0201_K 'I' 467db96d56Sopenharmony_ci#define CHARSET_JISX0201_R 'J' 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci#define CHARSET_GB2312 ('A'|CHARSET_DBCS) 497db96d56Sopenharmony_ci#define CHARSET_JISX0208 ('B'|CHARSET_DBCS) 507db96d56Sopenharmony_ci#define CHARSET_KSX1001 ('C'|CHARSET_DBCS) 517db96d56Sopenharmony_ci#define CHARSET_JISX0212 ('D'|CHARSET_DBCS) 527db96d56Sopenharmony_ci#define CHARSET_GB2312_8565 ('E'|CHARSET_DBCS) 537db96d56Sopenharmony_ci#define CHARSET_CNS11643_1 ('G'|CHARSET_DBCS) 547db96d56Sopenharmony_ci#define CHARSET_CNS11643_2 ('H'|CHARSET_DBCS) 557db96d56Sopenharmony_ci#define CHARSET_JISX0213_2000_1 ('O'|CHARSET_DBCS) 567db96d56Sopenharmony_ci#define CHARSET_JISX0213_2 ('P'|CHARSET_DBCS) 577db96d56Sopenharmony_ci#define CHARSET_JISX0213_2004_1 ('Q'|CHARSET_DBCS) 587db96d56Sopenharmony_ci#define CHARSET_JISX0208_O ('@'|CHARSET_DBCS) 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci#define CHARSET_DBCS 0x80 617db96d56Sopenharmony_ci#define ESCMARK(mark) ((mark) & 0x7f) 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci#define IS_ESCEND(c) (((c) >= 'A' && (c) <= 'Z') || (c) == '@') 647db96d56Sopenharmony_ci#define IS_ISO2022ESC(c2) \ 657db96d56Sopenharmony_ci ((c2) == '(' || (c2) == ')' || (c2) == '$' || \ 667db96d56Sopenharmony_ci (c2) == '.' || (c2) == '&') 677db96d56Sopenharmony_ci /* this is not a complete list of ISO-2022 escape sequence headers. 687db96d56Sopenharmony_ci * but, it's enough to implement CJK instances of iso-2022. */ 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci#define MAP_UNMAPPABLE 0xFFFF 717db96d56Sopenharmony_ci#define MAP_MULTIPLE_AVAIL 0xFFFE /* for JIS X 0213 */ 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci#define F_SHIFTED 0x01 747db96d56Sopenharmony_ci#define F_ESCTHROUGHOUT 0x02 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci#define STATE_SETG(dn, v) do { ((state)->c[dn]) = (v); } while (0) 777db96d56Sopenharmony_ci#define STATE_GETG(dn) ((state)->c[dn]) 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ci#define STATE_G0 STATE_GETG(0) 807db96d56Sopenharmony_ci#define STATE_G1 STATE_GETG(1) 817db96d56Sopenharmony_ci#define STATE_G2 STATE_GETG(2) 827db96d56Sopenharmony_ci#define STATE_G3 STATE_GETG(3) 837db96d56Sopenharmony_ci#define STATE_SETG0(v) STATE_SETG(0, v) 847db96d56Sopenharmony_ci#define STATE_SETG1(v) STATE_SETG(1, v) 857db96d56Sopenharmony_ci#define STATE_SETG2(v) STATE_SETG(2, v) 867db96d56Sopenharmony_ci#define STATE_SETG3(v) STATE_SETG(3, v) 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci#define STATE_SETFLAG(f) do { ((state)->c[4]) |= (f); } while (0) 897db96d56Sopenharmony_ci#define STATE_GETFLAG(f) ((state)->c[4] & (f)) 907db96d56Sopenharmony_ci#define STATE_CLEARFLAG(f) do { ((state)->c[4]) &= ~(f); } while (0) 917db96d56Sopenharmony_ci#define STATE_CLEARFLAGS() do { ((state)->c[4]) = 0; } while (0) 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci#define ISO2022_CONFIG ((const struct iso2022_config *)config) 947db96d56Sopenharmony_ci#define CONFIG_ISSET(flag) (ISO2022_CONFIG->flags & (flag)) 957db96d56Sopenharmony_ci#define CONFIG_DESIGNATIONS (ISO2022_CONFIG->designations) 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci/* iso2022_config.flags */ 987db96d56Sopenharmony_ci#define NO_SHIFT 0x01 997db96d56Sopenharmony_ci#define USE_G2 0x02 1007db96d56Sopenharmony_ci#define USE_JISX0208_EXT 0x04 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci/*-*- internal data structures -*-*/ 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_citypedef int (*iso2022_init_func)(void); 1057db96d56Sopenharmony_citypedef Py_UCS4 (*iso2022_decode_func)(const unsigned char *data); 1067db96d56Sopenharmony_citypedef DBCHAR (*iso2022_encode_func)(const Py_UCS4 *data, Py_ssize_t *length); 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_cistruct iso2022_designation { 1097db96d56Sopenharmony_ci unsigned char mark; 1107db96d56Sopenharmony_ci unsigned char plane; 1117db96d56Sopenharmony_ci unsigned char width; 1127db96d56Sopenharmony_ci iso2022_init_func initializer; 1137db96d56Sopenharmony_ci iso2022_decode_func decoder; 1147db96d56Sopenharmony_ci iso2022_encode_func encoder; 1157db96d56Sopenharmony_ci}; 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_cistruct iso2022_config { 1187db96d56Sopenharmony_ci int flags; 1197db96d56Sopenharmony_ci const struct iso2022_designation *designations; /* non-ascii desigs */ 1207db96d56Sopenharmony_ci}; 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci/*-*- iso-2022 codec implementation -*-*/ 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ciCODEC_INIT(iso2022) 1257db96d56Sopenharmony_ci{ 1267db96d56Sopenharmony_ci const struct iso2022_designation *desig; 1277db96d56Sopenharmony_ci for (desig = CONFIG_DESIGNATIONS; desig->mark; desig++) 1287db96d56Sopenharmony_ci if (desig->initializer != NULL && desig->initializer() != 0) 1297db96d56Sopenharmony_ci return -1; 1307db96d56Sopenharmony_ci return 0; 1317db96d56Sopenharmony_ci} 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ciENCODER_INIT(iso2022) 1347db96d56Sopenharmony_ci{ 1357db96d56Sopenharmony_ci STATE_CLEARFLAGS(); 1367db96d56Sopenharmony_ci STATE_SETG0(CHARSET_ASCII); 1377db96d56Sopenharmony_ci STATE_SETG1(CHARSET_ASCII); 1387db96d56Sopenharmony_ci return 0; 1397db96d56Sopenharmony_ci} 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ciENCODER_RESET(iso2022) 1427db96d56Sopenharmony_ci{ 1437db96d56Sopenharmony_ci if (STATE_GETFLAG(F_SHIFTED)) { 1447db96d56Sopenharmony_ci WRITEBYTE1(SI); 1457db96d56Sopenharmony_ci NEXT_OUT(1); 1467db96d56Sopenharmony_ci STATE_CLEARFLAG(F_SHIFTED); 1477db96d56Sopenharmony_ci } 1487db96d56Sopenharmony_ci if (STATE_G0 != CHARSET_ASCII) { 1497db96d56Sopenharmony_ci WRITEBYTE3(ESC, '(', 'B'); 1507db96d56Sopenharmony_ci NEXT_OUT(3); 1517db96d56Sopenharmony_ci STATE_SETG0(CHARSET_ASCII); 1527db96d56Sopenharmony_ci } 1537db96d56Sopenharmony_ci return 0; 1547db96d56Sopenharmony_ci} 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ciENCODER(iso2022) 1577db96d56Sopenharmony_ci{ 1587db96d56Sopenharmony_ci while (*inpos < inlen) { 1597db96d56Sopenharmony_ci const struct iso2022_designation *dsg; 1607db96d56Sopenharmony_ci DBCHAR encoded; 1617db96d56Sopenharmony_ci Py_UCS4 c = INCHAR1; 1627db96d56Sopenharmony_ci Py_ssize_t insize; 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci if (c < 0x80) { 1657db96d56Sopenharmony_ci if (STATE_G0 != CHARSET_ASCII) { 1667db96d56Sopenharmony_ci WRITEBYTE3(ESC, '(', 'B'); 1677db96d56Sopenharmony_ci STATE_SETG0(CHARSET_ASCII); 1687db96d56Sopenharmony_ci NEXT_OUT(3); 1697db96d56Sopenharmony_ci } 1707db96d56Sopenharmony_ci if (STATE_GETFLAG(F_SHIFTED)) { 1717db96d56Sopenharmony_ci WRITEBYTE1(SI); 1727db96d56Sopenharmony_ci STATE_CLEARFLAG(F_SHIFTED); 1737db96d56Sopenharmony_ci NEXT_OUT(1); 1747db96d56Sopenharmony_ci } 1757db96d56Sopenharmony_ci WRITEBYTE1((unsigned char)c); 1767db96d56Sopenharmony_ci NEXT(1, 1); 1777db96d56Sopenharmony_ci continue; 1787db96d56Sopenharmony_ci } 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci insize = 1; 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci encoded = MAP_UNMAPPABLE; 1837db96d56Sopenharmony_ci for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) { 1847db96d56Sopenharmony_ci Py_ssize_t length = 1; 1857db96d56Sopenharmony_ci encoded = dsg->encoder(&c, &length); 1867db96d56Sopenharmony_ci if (encoded == MAP_MULTIPLE_AVAIL) { 1877db96d56Sopenharmony_ci /* this implementation won't work for pair 1887db96d56Sopenharmony_ci * of non-bmp characters. */ 1897db96d56Sopenharmony_ci if (inlen - *inpos < 2) { 1907db96d56Sopenharmony_ci if (!(flags & MBENC_FLUSH)) 1917db96d56Sopenharmony_ci return MBERR_TOOFEW; 1927db96d56Sopenharmony_ci length = -1; 1937db96d56Sopenharmony_ci } 1947db96d56Sopenharmony_ci else 1957db96d56Sopenharmony_ci length = 2; 1967db96d56Sopenharmony_ci encoded = dsg->encoder(&c, &length); 1977db96d56Sopenharmony_ci if (encoded != MAP_UNMAPPABLE) { 1987db96d56Sopenharmony_ci insize = length; 1997db96d56Sopenharmony_ci break; 2007db96d56Sopenharmony_ci } 2017db96d56Sopenharmony_ci } 2027db96d56Sopenharmony_ci else if (encoded != MAP_UNMAPPABLE) 2037db96d56Sopenharmony_ci break; 2047db96d56Sopenharmony_ci } 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci if (!dsg->mark) 2077db96d56Sopenharmony_ci return 1; 2087db96d56Sopenharmony_ci assert(dsg->width == 1 || dsg->width == 2); 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci switch (dsg->plane) { 2117db96d56Sopenharmony_ci case 0: /* G0 */ 2127db96d56Sopenharmony_ci if (STATE_GETFLAG(F_SHIFTED)) { 2137db96d56Sopenharmony_ci WRITEBYTE1(SI); 2147db96d56Sopenharmony_ci STATE_CLEARFLAG(F_SHIFTED); 2157db96d56Sopenharmony_ci NEXT_OUT(1); 2167db96d56Sopenharmony_ci } 2177db96d56Sopenharmony_ci if (STATE_G0 != dsg->mark) { 2187db96d56Sopenharmony_ci if (dsg->width == 1) { 2197db96d56Sopenharmony_ci WRITEBYTE3(ESC, '(', ESCMARK(dsg->mark)); 2207db96d56Sopenharmony_ci STATE_SETG0(dsg->mark); 2217db96d56Sopenharmony_ci NEXT_OUT(3); 2227db96d56Sopenharmony_ci } 2237db96d56Sopenharmony_ci else if (dsg->mark == CHARSET_JISX0208) { 2247db96d56Sopenharmony_ci WRITEBYTE3(ESC, '$', ESCMARK(dsg->mark)); 2257db96d56Sopenharmony_ci STATE_SETG0(dsg->mark); 2267db96d56Sopenharmony_ci NEXT_OUT(3); 2277db96d56Sopenharmony_ci } 2287db96d56Sopenharmony_ci else { 2297db96d56Sopenharmony_ci WRITEBYTE4(ESC, '$', '(', 2307db96d56Sopenharmony_ci ESCMARK(dsg->mark)); 2317db96d56Sopenharmony_ci STATE_SETG0(dsg->mark); 2327db96d56Sopenharmony_ci NEXT_OUT(4); 2337db96d56Sopenharmony_ci } 2347db96d56Sopenharmony_ci } 2357db96d56Sopenharmony_ci break; 2367db96d56Sopenharmony_ci case 1: /* G1 */ 2377db96d56Sopenharmony_ci if (STATE_G1 != dsg->mark) { 2387db96d56Sopenharmony_ci if (dsg->width == 1) { 2397db96d56Sopenharmony_ci WRITEBYTE3(ESC, ')', ESCMARK(dsg->mark)); 2407db96d56Sopenharmony_ci STATE_SETG1(dsg->mark); 2417db96d56Sopenharmony_ci NEXT_OUT(3); 2427db96d56Sopenharmony_ci } 2437db96d56Sopenharmony_ci else { 2447db96d56Sopenharmony_ci WRITEBYTE4(ESC, '$', ')', ESCMARK(dsg->mark)); 2457db96d56Sopenharmony_ci STATE_SETG1(dsg->mark); 2467db96d56Sopenharmony_ci NEXT_OUT(4); 2477db96d56Sopenharmony_ci } 2487db96d56Sopenharmony_ci } 2497db96d56Sopenharmony_ci if (!STATE_GETFLAG(F_SHIFTED)) { 2507db96d56Sopenharmony_ci WRITEBYTE1(SO); 2517db96d56Sopenharmony_ci STATE_SETFLAG(F_SHIFTED); 2527db96d56Sopenharmony_ci NEXT_OUT(1); 2537db96d56Sopenharmony_ci } 2547db96d56Sopenharmony_ci break; 2557db96d56Sopenharmony_ci default: /* G2 and G3 is not supported: no encoding in 2567db96d56Sopenharmony_ci * CJKCodecs are using them yet */ 2577db96d56Sopenharmony_ci return MBERR_INTERNAL; 2587db96d56Sopenharmony_ci } 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci if (dsg->width == 1) { 2617db96d56Sopenharmony_ci WRITEBYTE1((unsigned char)encoded); 2627db96d56Sopenharmony_ci NEXT_OUT(1); 2637db96d56Sopenharmony_ci } 2647db96d56Sopenharmony_ci else { 2657db96d56Sopenharmony_ci WRITEBYTE2(encoded >> 8, encoded & 0xff); 2667db96d56Sopenharmony_ci NEXT_OUT(2); 2677db96d56Sopenharmony_ci } 2687db96d56Sopenharmony_ci NEXT_INCHAR(insize); 2697db96d56Sopenharmony_ci } 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci return 0; 2727db96d56Sopenharmony_ci} 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ciDECODER_INIT(iso2022) 2757db96d56Sopenharmony_ci{ 2767db96d56Sopenharmony_ci STATE_CLEARFLAGS(); 2777db96d56Sopenharmony_ci STATE_SETG0(CHARSET_ASCII); 2787db96d56Sopenharmony_ci STATE_SETG1(CHARSET_ASCII); 2797db96d56Sopenharmony_ci STATE_SETG2(CHARSET_ASCII); 2807db96d56Sopenharmony_ci return 0; 2817db96d56Sopenharmony_ci} 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ciDECODER_RESET(iso2022) 2847db96d56Sopenharmony_ci{ 2857db96d56Sopenharmony_ci STATE_SETG0(CHARSET_ASCII); 2867db96d56Sopenharmony_ci STATE_CLEARFLAG(F_SHIFTED); 2877db96d56Sopenharmony_ci return 0; 2887db96d56Sopenharmony_ci} 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_cistatic Py_ssize_t 2917db96d56Sopenharmony_ciiso2022processesc(const void *config, MultibyteCodec_State *state, 2927db96d56Sopenharmony_ci const unsigned char **inbuf, Py_ssize_t *inleft) 2937db96d56Sopenharmony_ci{ 2947db96d56Sopenharmony_ci unsigned char charset, designation; 2957db96d56Sopenharmony_ci Py_ssize_t i, esclen = 0; 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci for (i = 1;i < MAX_ESCSEQLEN;i++) { 2987db96d56Sopenharmony_ci if (i >= *inleft) 2997db96d56Sopenharmony_ci return MBERR_TOOFEW; 3007db96d56Sopenharmony_ci if (IS_ESCEND((*inbuf)[i])) { 3017db96d56Sopenharmony_ci esclen = i + 1; 3027db96d56Sopenharmony_ci break; 3037db96d56Sopenharmony_ci } 3047db96d56Sopenharmony_ci else if (CONFIG_ISSET(USE_JISX0208_EXT) && i+1 < *inleft && 3057db96d56Sopenharmony_ci (*inbuf)[i] == '&' && (*inbuf)[i+1] == '@') { 3067db96d56Sopenharmony_ci i += 2; 3077db96d56Sopenharmony_ci } 3087db96d56Sopenharmony_ci } 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci switch (esclen) { 3117db96d56Sopenharmony_ci case 0: 3127db96d56Sopenharmony_ci return 1; /* unterminated escape sequence */ 3137db96d56Sopenharmony_ci case 3: 3147db96d56Sopenharmony_ci if (INBYTE2 == '$') { 3157db96d56Sopenharmony_ci charset = INBYTE3 | CHARSET_DBCS; 3167db96d56Sopenharmony_ci designation = 0; 3177db96d56Sopenharmony_ci } 3187db96d56Sopenharmony_ci else { 3197db96d56Sopenharmony_ci charset = INBYTE3; 3207db96d56Sopenharmony_ci if (INBYTE2 == '(') 3217db96d56Sopenharmony_ci designation = 0; 3227db96d56Sopenharmony_ci else if (INBYTE2 == ')') 3237db96d56Sopenharmony_ci designation = 1; 3247db96d56Sopenharmony_ci else if (CONFIG_ISSET(USE_G2) && INBYTE2 == '.') 3257db96d56Sopenharmony_ci designation = 2; 3267db96d56Sopenharmony_ci else 3277db96d56Sopenharmony_ci return 3; 3287db96d56Sopenharmony_ci } 3297db96d56Sopenharmony_ci break; 3307db96d56Sopenharmony_ci case 4: 3317db96d56Sopenharmony_ci if (INBYTE2 != '$') 3327db96d56Sopenharmony_ci return 4; 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci charset = INBYTE4 | CHARSET_DBCS; 3357db96d56Sopenharmony_ci if (INBYTE3 == '(') 3367db96d56Sopenharmony_ci designation = 0; 3377db96d56Sopenharmony_ci else if (INBYTE3 == ')') 3387db96d56Sopenharmony_ci designation = 1; 3397db96d56Sopenharmony_ci else 3407db96d56Sopenharmony_ci return 4; 3417db96d56Sopenharmony_ci break; 3427db96d56Sopenharmony_ci case 6: /* designation with prefix */ 3437db96d56Sopenharmony_ci if (CONFIG_ISSET(USE_JISX0208_EXT) && 3447db96d56Sopenharmony_ci (*inbuf)[3] == ESC && (*inbuf)[4] == '$' && 3457db96d56Sopenharmony_ci (*inbuf)[5] == 'B') { 3467db96d56Sopenharmony_ci charset = 'B' | CHARSET_DBCS; 3477db96d56Sopenharmony_ci designation = 0; 3487db96d56Sopenharmony_ci } 3497db96d56Sopenharmony_ci else 3507db96d56Sopenharmony_ci return 6; 3517db96d56Sopenharmony_ci break; 3527db96d56Sopenharmony_ci default: 3537db96d56Sopenharmony_ci return esclen; 3547db96d56Sopenharmony_ci } 3557db96d56Sopenharmony_ci 3567db96d56Sopenharmony_ci /* raise error when the charset is not designated for this encoding */ 3577db96d56Sopenharmony_ci if (charset != CHARSET_ASCII) { 3587db96d56Sopenharmony_ci const struct iso2022_designation *dsg; 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) { 3617db96d56Sopenharmony_ci if (dsg->mark == charset) 3627db96d56Sopenharmony_ci break; 3637db96d56Sopenharmony_ci } 3647db96d56Sopenharmony_ci if (!dsg->mark) 3657db96d56Sopenharmony_ci return esclen; 3667db96d56Sopenharmony_ci } 3677db96d56Sopenharmony_ci 3687db96d56Sopenharmony_ci STATE_SETG(designation, charset); 3697db96d56Sopenharmony_ci *inleft -= esclen; 3707db96d56Sopenharmony_ci (*inbuf) += esclen; 3717db96d56Sopenharmony_ci return 0; 3727db96d56Sopenharmony_ci} 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci#define ISO8859_7_DECODE(c, writer) \ 3757db96d56Sopenharmony_ci if ((c) < 0xa0) { \ 3767db96d56Sopenharmony_ci OUTCHAR(c); \ 3777db96d56Sopenharmony_ci } else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0)))) { \ 3787db96d56Sopenharmony_ci OUTCHAR(c); \ 3797db96d56Sopenharmony_ci } else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 || \ 3807db96d56Sopenharmony_ci (0xbffffd77L & (1L << ((c)-0xb4))))) { \ 3817db96d56Sopenharmony_ci OUTCHAR(0x02d0 + (c)); \ 3827db96d56Sopenharmony_ci } else if ((c) == 0xa1) { \ 3837db96d56Sopenharmony_ci OUTCHAR(0x2018); \ 3847db96d56Sopenharmony_ci } else if ((c) == 0xa2) { \ 3857db96d56Sopenharmony_ci OUTCHAR(0x2019); \ 3867db96d56Sopenharmony_ci } else if ((c) == 0xaf) { \ 3877db96d56Sopenharmony_ci OUTCHAR(0x2015); \ 3887db96d56Sopenharmony_ci } 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_cistatic Py_ssize_t 3917db96d56Sopenharmony_ciiso2022processg2(const void *config, MultibyteCodec_State *state, 3927db96d56Sopenharmony_ci const unsigned char **inbuf, Py_ssize_t *inleft, 3937db96d56Sopenharmony_ci _PyUnicodeWriter *writer) 3947db96d56Sopenharmony_ci{ 3957db96d56Sopenharmony_ci /* not written to use encoder, decoder functions because only few 3967db96d56Sopenharmony_ci * encodings use G2 designations in CJKCodecs */ 3977db96d56Sopenharmony_ci if (STATE_G2 == CHARSET_ISO8859_1) { 3987db96d56Sopenharmony_ci if (INBYTE3 < 0x80) 3997db96d56Sopenharmony_ci OUTCHAR(INBYTE3 + 0x80); 4007db96d56Sopenharmony_ci else 4017db96d56Sopenharmony_ci return 3; 4027db96d56Sopenharmony_ci } 4037db96d56Sopenharmony_ci else if (STATE_G2 == CHARSET_ISO8859_7) { 4047db96d56Sopenharmony_ci ISO8859_7_DECODE(INBYTE3 ^ 0x80, writer) 4057db96d56Sopenharmony_ci else 4067db96d56Sopenharmony_ci return 3; 4077db96d56Sopenharmony_ci } 4087db96d56Sopenharmony_ci else if (STATE_G2 == CHARSET_ASCII) { 4097db96d56Sopenharmony_ci if (INBYTE3 & 0x80) 4107db96d56Sopenharmony_ci return 3; 4117db96d56Sopenharmony_ci else 4127db96d56Sopenharmony_ci OUTCHAR(INBYTE3); 4137db96d56Sopenharmony_ci } 4147db96d56Sopenharmony_ci else 4157db96d56Sopenharmony_ci return MBERR_INTERNAL; 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci (*inbuf) += 3; 4187db96d56Sopenharmony_ci *inleft -= 3; 4197db96d56Sopenharmony_ci return 0; 4207db96d56Sopenharmony_ci} 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ciDECODER(iso2022) 4237db96d56Sopenharmony_ci{ 4247db96d56Sopenharmony_ci const struct iso2022_designation *dsgcache = NULL; 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci while (inleft > 0) { 4277db96d56Sopenharmony_ci unsigned char c = INBYTE1; 4287db96d56Sopenharmony_ci Py_ssize_t err; 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_ci if (STATE_GETFLAG(F_ESCTHROUGHOUT)) { 4317db96d56Sopenharmony_ci /* ESC throughout mode: 4327db96d56Sopenharmony_ci * for non-iso2022 escape sequences */ 4337db96d56Sopenharmony_ci OUTCHAR(c); /* assume as ISO-8859-1 */ 4347db96d56Sopenharmony_ci NEXT_IN(1); 4357db96d56Sopenharmony_ci if (IS_ESCEND(c)) { 4367db96d56Sopenharmony_ci STATE_CLEARFLAG(F_ESCTHROUGHOUT); 4377db96d56Sopenharmony_ci } 4387db96d56Sopenharmony_ci continue; 4397db96d56Sopenharmony_ci } 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci switch (c) { 4427db96d56Sopenharmony_ci case ESC: 4437db96d56Sopenharmony_ci REQUIRE_INBUF(2); 4447db96d56Sopenharmony_ci if (IS_ISO2022ESC(INBYTE2)) { 4457db96d56Sopenharmony_ci err = iso2022processesc(config, state, 4467db96d56Sopenharmony_ci inbuf, &inleft); 4477db96d56Sopenharmony_ci if (err != 0) 4487db96d56Sopenharmony_ci return err; 4497db96d56Sopenharmony_ci } 4507db96d56Sopenharmony_ci else if (CONFIG_ISSET(USE_G2) && INBYTE2 == 'N') {/* SS2 */ 4517db96d56Sopenharmony_ci REQUIRE_INBUF(3); 4527db96d56Sopenharmony_ci err = iso2022processg2(config, state, 4537db96d56Sopenharmony_ci inbuf, &inleft, writer); 4547db96d56Sopenharmony_ci if (err != 0) 4557db96d56Sopenharmony_ci return err; 4567db96d56Sopenharmony_ci } 4577db96d56Sopenharmony_ci else { 4587db96d56Sopenharmony_ci OUTCHAR(ESC); 4597db96d56Sopenharmony_ci STATE_SETFLAG(F_ESCTHROUGHOUT); 4607db96d56Sopenharmony_ci NEXT_IN(1); 4617db96d56Sopenharmony_ci } 4627db96d56Sopenharmony_ci break; 4637db96d56Sopenharmony_ci case SI: 4647db96d56Sopenharmony_ci if (CONFIG_ISSET(NO_SHIFT)) 4657db96d56Sopenharmony_ci goto bypass; 4667db96d56Sopenharmony_ci STATE_CLEARFLAG(F_SHIFTED); 4677db96d56Sopenharmony_ci NEXT_IN(1); 4687db96d56Sopenharmony_ci break; 4697db96d56Sopenharmony_ci case SO: 4707db96d56Sopenharmony_ci if (CONFIG_ISSET(NO_SHIFT)) 4717db96d56Sopenharmony_ci goto bypass; 4727db96d56Sopenharmony_ci STATE_SETFLAG(F_SHIFTED); 4737db96d56Sopenharmony_ci NEXT_IN(1); 4747db96d56Sopenharmony_ci break; 4757db96d56Sopenharmony_ci case LF: 4767db96d56Sopenharmony_ci STATE_CLEARFLAG(F_SHIFTED); 4777db96d56Sopenharmony_ci OUTCHAR(LF); 4787db96d56Sopenharmony_ci NEXT_IN(1); 4797db96d56Sopenharmony_ci break; 4807db96d56Sopenharmony_ci default: 4817db96d56Sopenharmony_ci if (c < 0x20) /* C0 */ 4827db96d56Sopenharmony_ci goto bypass; 4837db96d56Sopenharmony_ci else if (c >= 0x80) 4847db96d56Sopenharmony_ci return 1; 4857db96d56Sopenharmony_ci else { 4867db96d56Sopenharmony_ci const struct iso2022_designation *dsg; 4877db96d56Sopenharmony_ci unsigned char charset; 4887db96d56Sopenharmony_ci Py_UCS4 decoded; 4897db96d56Sopenharmony_ci 4907db96d56Sopenharmony_ci if (STATE_GETFLAG(F_SHIFTED)) 4917db96d56Sopenharmony_ci charset = STATE_G1; 4927db96d56Sopenharmony_ci else 4937db96d56Sopenharmony_ci charset = STATE_G0; 4947db96d56Sopenharmony_ci 4957db96d56Sopenharmony_ci if (charset == CHARSET_ASCII) { 4967db96d56Sopenharmony_cibypass: 4977db96d56Sopenharmony_ci OUTCHAR(c); 4987db96d56Sopenharmony_ci NEXT_IN(1); 4997db96d56Sopenharmony_ci break; 5007db96d56Sopenharmony_ci } 5017db96d56Sopenharmony_ci 5027db96d56Sopenharmony_ci if (dsgcache != NULL && 5037db96d56Sopenharmony_ci dsgcache->mark == charset) 5047db96d56Sopenharmony_ci dsg = dsgcache; 5057db96d56Sopenharmony_ci else { 5067db96d56Sopenharmony_ci for (dsg = CONFIG_DESIGNATIONS; 5077db96d56Sopenharmony_ci dsg->mark != charset 5087db96d56Sopenharmony_ci#ifdef Py_DEBUG 5097db96d56Sopenharmony_ci && dsg->mark != '\0' 5107db96d56Sopenharmony_ci#endif 5117db96d56Sopenharmony_ci ; dsg++) 5127db96d56Sopenharmony_ci { 5137db96d56Sopenharmony_ci /* noop */ 5147db96d56Sopenharmony_ci } 5157db96d56Sopenharmony_ci assert(dsg->mark != '\0'); 5167db96d56Sopenharmony_ci dsgcache = dsg; 5177db96d56Sopenharmony_ci } 5187db96d56Sopenharmony_ci 5197db96d56Sopenharmony_ci REQUIRE_INBUF(dsg->width); 5207db96d56Sopenharmony_ci decoded = dsg->decoder(*inbuf); 5217db96d56Sopenharmony_ci if (decoded == MAP_UNMAPPABLE) 5227db96d56Sopenharmony_ci return dsg->width; 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci if (decoded < 0x10000) { 5257db96d56Sopenharmony_ci OUTCHAR(decoded); 5267db96d56Sopenharmony_ci } 5277db96d56Sopenharmony_ci else if (decoded < 0x30000) { 5287db96d56Sopenharmony_ci OUTCHAR(decoded); 5297db96d56Sopenharmony_ci } 5307db96d56Sopenharmony_ci else { /* JIS X 0213 pairs */ 5317db96d56Sopenharmony_ci OUTCHAR2(decoded >> 16, decoded & 0xffff); 5327db96d56Sopenharmony_ci } 5337db96d56Sopenharmony_ci NEXT_IN(dsg->width); 5347db96d56Sopenharmony_ci } 5357db96d56Sopenharmony_ci break; 5367db96d56Sopenharmony_ci } 5377db96d56Sopenharmony_ci } 5387db96d56Sopenharmony_ci return 0; 5397db96d56Sopenharmony_ci} 5407db96d56Sopenharmony_ci 5417db96d56Sopenharmony_ci/*-*- mapping table holders -*-*/ 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci#define ENCMAP(enc) static const encode_map *enc##_encmap = NULL; 5447db96d56Sopenharmony_ci#define DECMAP(enc) static const decode_map *enc##_decmap = NULL; 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci/* kr */ 5477db96d56Sopenharmony_ciENCMAP(cp949) 5487db96d56Sopenharmony_ciDECMAP(ksx1001) 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci/* jp */ 5517db96d56Sopenharmony_ciENCMAP(jisxcommon) 5527db96d56Sopenharmony_ciDECMAP(jisx0208) 5537db96d56Sopenharmony_ciDECMAP(jisx0212) 5547db96d56Sopenharmony_ciENCMAP(jisx0213_bmp) 5557db96d56Sopenharmony_ciDECMAP(jisx0213_1_bmp) 5567db96d56Sopenharmony_ciDECMAP(jisx0213_2_bmp) 5577db96d56Sopenharmony_ciENCMAP(jisx0213_emp) 5587db96d56Sopenharmony_ciDECMAP(jisx0213_1_emp) 5597db96d56Sopenharmony_ciDECMAP(jisx0213_2_emp) 5607db96d56Sopenharmony_ci 5617db96d56Sopenharmony_ci/* cn */ 5627db96d56Sopenharmony_ciENCMAP(gbcommon) 5637db96d56Sopenharmony_ciDECMAP(gb2312) 5647db96d56Sopenharmony_ci 5657db96d56Sopenharmony_ci/* tw */ 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci/*-*- mapping access functions -*-*/ 5687db96d56Sopenharmony_ci 5697db96d56Sopenharmony_cistatic int 5707db96d56Sopenharmony_ciksx1001_init(void) 5717db96d56Sopenharmony_ci{ 5727db96d56Sopenharmony_ci static int initialized = 0; 5737db96d56Sopenharmony_ci 5747db96d56Sopenharmony_ci if (!initialized && ( 5757db96d56Sopenharmony_ci IMPORT_MAP(kr, cp949, &cp949_encmap, NULL) || 5767db96d56Sopenharmony_ci IMPORT_MAP(kr, ksx1001, NULL, &ksx1001_decmap))) 5777db96d56Sopenharmony_ci return -1; 5787db96d56Sopenharmony_ci initialized = 1; 5797db96d56Sopenharmony_ci return 0; 5807db96d56Sopenharmony_ci} 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_cistatic Py_UCS4 5837db96d56Sopenharmony_ciksx1001_decoder(const unsigned char *data) 5847db96d56Sopenharmony_ci{ 5857db96d56Sopenharmony_ci Py_UCS4 u; 5867db96d56Sopenharmony_ci if (TRYMAP_DEC(ksx1001, u, data[0], data[1])) 5877db96d56Sopenharmony_ci return u; 5887db96d56Sopenharmony_ci else 5897db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 5907db96d56Sopenharmony_ci} 5917db96d56Sopenharmony_ci 5927db96d56Sopenharmony_cistatic DBCHAR 5937db96d56Sopenharmony_ciksx1001_encoder(const Py_UCS4 *data, Py_ssize_t *length) 5947db96d56Sopenharmony_ci{ 5957db96d56Sopenharmony_ci DBCHAR coded; 5967db96d56Sopenharmony_ci assert(*length == 1); 5977db96d56Sopenharmony_ci if (*data < 0x10000) { 5987db96d56Sopenharmony_ci if (TRYMAP_ENC(cp949, coded, *data)) { 5997db96d56Sopenharmony_ci if (!(coded & 0x8000)) 6007db96d56Sopenharmony_ci return coded; 6017db96d56Sopenharmony_ci } 6027db96d56Sopenharmony_ci } 6037db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 6047db96d56Sopenharmony_ci} 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_cistatic int 6077db96d56Sopenharmony_cijisx0208_init(void) 6087db96d56Sopenharmony_ci{ 6097db96d56Sopenharmony_ci static int initialized = 0; 6107db96d56Sopenharmony_ci 6117db96d56Sopenharmony_ci if (!initialized && ( 6127db96d56Sopenharmony_ci IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL) || 6137db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0208, NULL, &jisx0208_decmap))) 6147db96d56Sopenharmony_ci return -1; 6157db96d56Sopenharmony_ci initialized = 1; 6167db96d56Sopenharmony_ci return 0; 6177db96d56Sopenharmony_ci} 6187db96d56Sopenharmony_ci 6197db96d56Sopenharmony_cistatic Py_UCS4 6207db96d56Sopenharmony_cijisx0208_decoder(const unsigned char *data) 6217db96d56Sopenharmony_ci{ 6227db96d56Sopenharmony_ci Py_UCS4 u; 6237db96d56Sopenharmony_ci if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */ 6247db96d56Sopenharmony_ci return 0xff3c; 6257db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0208, u, data[0], data[1])) 6267db96d56Sopenharmony_ci return u; 6277db96d56Sopenharmony_ci else 6287db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 6297db96d56Sopenharmony_ci} 6307db96d56Sopenharmony_ci 6317db96d56Sopenharmony_cistatic DBCHAR 6327db96d56Sopenharmony_cijisx0208_encoder(const Py_UCS4 *data, Py_ssize_t *length) 6337db96d56Sopenharmony_ci{ 6347db96d56Sopenharmony_ci DBCHAR coded; 6357db96d56Sopenharmony_ci assert(*length == 1); 6367db96d56Sopenharmony_ci if (*data < 0x10000) { 6377db96d56Sopenharmony_ci if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */ 6387db96d56Sopenharmony_ci return 0x2140; 6397db96d56Sopenharmony_ci else if (TRYMAP_ENC(jisxcommon, coded, *data)) { 6407db96d56Sopenharmony_ci if (!(coded & 0x8000)) 6417db96d56Sopenharmony_ci return coded; 6427db96d56Sopenharmony_ci } 6437db96d56Sopenharmony_ci } 6447db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 6457db96d56Sopenharmony_ci} 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_cistatic int 6487db96d56Sopenharmony_cijisx0212_init(void) 6497db96d56Sopenharmony_ci{ 6507db96d56Sopenharmony_ci static int initialized = 0; 6517db96d56Sopenharmony_ci 6527db96d56Sopenharmony_ci if (!initialized && ( 6537db96d56Sopenharmony_ci IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL) || 6547db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0212, NULL, &jisx0212_decmap))) 6557db96d56Sopenharmony_ci return -1; 6567db96d56Sopenharmony_ci initialized = 1; 6577db96d56Sopenharmony_ci return 0; 6587db96d56Sopenharmony_ci} 6597db96d56Sopenharmony_ci 6607db96d56Sopenharmony_cistatic Py_UCS4 6617db96d56Sopenharmony_cijisx0212_decoder(const unsigned char *data) 6627db96d56Sopenharmony_ci{ 6637db96d56Sopenharmony_ci Py_UCS4 u; 6647db96d56Sopenharmony_ci if (TRYMAP_DEC(jisx0212, u, data[0], data[1])) 6657db96d56Sopenharmony_ci return u; 6667db96d56Sopenharmony_ci else 6677db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 6687db96d56Sopenharmony_ci} 6697db96d56Sopenharmony_ci 6707db96d56Sopenharmony_cistatic DBCHAR 6717db96d56Sopenharmony_cijisx0212_encoder(const Py_UCS4 *data, Py_ssize_t *length) 6727db96d56Sopenharmony_ci{ 6737db96d56Sopenharmony_ci DBCHAR coded; 6747db96d56Sopenharmony_ci assert(*length == 1); 6757db96d56Sopenharmony_ci if (*data < 0x10000) { 6767db96d56Sopenharmony_ci if (TRYMAP_ENC(jisxcommon, coded, *data)) { 6777db96d56Sopenharmony_ci if (coded & 0x8000) 6787db96d56Sopenharmony_ci return coded & 0x7fff; 6797db96d56Sopenharmony_ci } 6807db96d56Sopenharmony_ci } 6817db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 6827db96d56Sopenharmony_ci} 6837db96d56Sopenharmony_ci 6847db96d56Sopenharmony_cistatic int 6857db96d56Sopenharmony_cijisx0213_init(void) 6867db96d56Sopenharmony_ci{ 6877db96d56Sopenharmony_ci static int initialized = 0; 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci if (!initialized && ( 6907db96d56Sopenharmony_ci jisx0208_init() || 6917db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0213_bmp, 6927db96d56Sopenharmony_ci &jisx0213_bmp_encmap, NULL) || 6937db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0213_1_bmp, 6947db96d56Sopenharmony_ci NULL, &jisx0213_1_bmp_decmap) || 6957db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0213_2_bmp, 6967db96d56Sopenharmony_ci NULL, &jisx0213_2_bmp_decmap) || 6977db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0213_emp, 6987db96d56Sopenharmony_ci &jisx0213_emp_encmap, NULL) || 6997db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0213_1_emp, 7007db96d56Sopenharmony_ci NULL, &jisx0213_1_emp_decmap) || 7017db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0213_2_emp, 7027db96d56Sopenharmony_ci NULL, &jisx0213_2_emp_decmap) || 7037db96d56Sopenharmony_ci IMPORT_MAP(jp, jisx0213_pair, &jisx0213_pair_encmap, 7047db96d56Sopenharmony_ci &jisx0213_pair_decmap))) 7057db96d56Sopenharmony_ci return -1; 7067db96d56Sopenharmony_ci initialized = 1; 7077db96d56Sopenharmony_ci return 0; 7087db96d56Sopenharmony_ci} 7097db96d56Sopenharmony_ci 7107db96d56Sopenharmony_ci#define config ((void *)2000) 7117db96d56Sopenharmony_cistatic Py_UCS4 7127db96d56Sopenharmony_cijisx0213_2000_1_decoder(const unsigned char *data) 7137db96d56Sopenharmony_ci{ 7147db96d56Sopenharmony_ci Py_UCS4 u; 7157db96d56Sopenharmony_ci EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1]) 7167db96d56Sopenharmony_ci else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */ 7177db96d56Sopenharmony_ci return 0xff3c; 7187db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0208, u, data[0], data[1])) 7197db96d56Sopenharmony_ci ; 7207db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1])) 7217db96d56Sopenharmony_ci ; 7227db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])) 7237db96d56Sopenharmony_ci u |= 0x20000; 7247db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1])) 7257db96d56Sopenharmony_ci ; 7267db96d56Sopenharmony_ci else 7277db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 7287db96d56Sopenharmony_ci return u; 7297db96d56Sopenharmony_ci} 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_cistatic Py_UCS4 7327db96d56Sopenharmony_cijisx0213_2000_2_decoder(const unsigned char *data) 7337db96d56Sopenharmony_ci{ 7347db96d56Sopenharmony_ci Py_UCS4 u; 7357db96d56Sopenharmony_ci EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(u, data[0], data[1]) 7367db96d56Sopenharmony_ci if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1])) 7377db96d56Sopenharmony_ci ; 7387db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])) 7397db96d56Sopenharmony_ci u |= 0x20000; 7407db96d56Sopenharmony_ci else 7417db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 7427db96d56Sopenharmony_ci return u; 7437db96d56Sopenharmony_ci} 7447db96d56Sopenharmony_ci#undef config 7457db96d56Sopenharmony_ci 7467db96d56Sopenharmony_cistatic Py_UCS4 7477db96d56Sopenharmony_cijisx0213_2004_1_decoder(const unsigned char *data) 7487db96d56Sopenharmony_ci{ 7497db96d56Sopenharmony_ci Py_UCS4 u; 7507db96d56Sopenharmony_ci if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */ 7517db96d56Sopenharmony_ci return 0xff3c; 7527db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0208, u, data[0], data[1])) 7537db96d56Sopenharmony_ci ; 7547db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1])) 7557db96d56Sopenharmony_ci ; 7567db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])) 7577db96d56Sopenharmony_ci u |= 0x20000; 7587db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1])) 7597db96d56Sopenharmony_ci ; 7607db96d56Sopenharmony_ci else 7617db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 7627db96d56Sopenharmony_ci return u; 7637db96d56Sopenharmony_ci} 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_cistatic Py_UCS4 7667db96d56Sopenharmony_cijisx0213_2004_2_decoder(const unsigned char *data) 7677db96d56Sopenharmony_ci{ 7687db96d56Sopenharmony_ci Py_UCS4 u; 7697db96d56Sopenharmony_ci if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1])) 7707db96d56Sopenharmony_ci ; 7717db96d56Sopenharmony_ci else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])) 7727db96d56Sopenharmony_ci u |= 0x20000; 7737db96d56Sopenharmony_ci else 7747db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 7757db96d56Sopenharmony_ci return u; 7767db96d56Sopenharmony_ci} 7777db96d56Sopenharmony_ci 7787db96d56Sopenharmony_cistatic DBCHAR 7797db96d56Sopenharmony_cijisx0213_encoder(const Py_UCS4 *data, Py_ssize_t *length, void *config) 7807db96d56Sopenharmony_ci{ 7817db96d56Sopenharmony_ci DBCHAR coded; 7827db96d56Sopenharmony_ci 7837db96d56Sopenharmony_ci switch (*length) { 7847db96d56Sopenharmony_ci case 1: /* first character */ 7857db96d56Sopenharmony_ci if (*data >= 0x10000) { 7867db96d56Sopenharmony_ci if ((*data) >> 16 == 0x20000 >> 16) { 7877db96d56Sopenharmony_ci EMULATE_JISX0213_2000_ENCODE_EMP(coded, *data) 7887db96d56Sopenharmony_ci else if (TRYMAP_ENC(jisx0213_emp, coded, (*data) & 0xffff)) 7897db96d56Sopenharmony_ci return coded; 7907db96d56Sopenharmony_ci } 7917db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 7927db96d56Sopenharmony_ci } 7937db96d56Sopenharmony_ci 7947db96d56Sopenharmony_ci EMULATE_JISX0213_2000_ENCODE_BMP(coded, *data) 7957db96d56Sopenharmony_ci else if (TRYMAP_ENC(jisx0213_bmp, coded, *data)) { 7967db96d56Sopenharmony_ci if (coded == MULTIC) 7977db96d56Sopenharmony_ci return MAP_MULTIPLE_AVAIL; 7987db96d56Sopenharmony_ci } 7997db96d56Sopenharmony_ci else if (TRYMAP_ENC(jisxcommon, coded, *data)) { 8007db96d56Sopenharmony_ci if (coded & 0x8000) 8017db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8027db96d56Sopenharmony_ci } 8037db96d56Sopenharmony_ci else 8047db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8057db96d56Sopenharmony_ci return coded; 8067db96d56Sopenharmony_ci 8077db96d56Sopenharmony_ci case 2: /* second character of unicode pair */ 8087db96d56Sopenharmony_ci coded = find_pairencmap((ucs2_t)data[0], (ucs2_t)data[1], 8097db96d56Sopenharmony_ci jisx0213_pair_encmap, JISX0213_ENCPAIRS); 8107db96d56Sopenharmony_ci if (coded != DBCINV) 8117db96d56Sopenharmony_ci return coded; 8127db96d56Sopenharmony_ci /* fall through */ 8137db96d56Sopenharmony_ci 8147db96d56Sopenharmony_ci case -1: /* flush unterminated */ 8157db96d56Sopenharmony_ci *length = 1; 8167db96d56Sopenharmony_ci coded = find_pairencmap((ucs2_t)data[0], 0, 8177db96d56Sopenharmony_ci jisx0213_pair_encmap, JISX0213_ENCPAIRS); 8187db96d56Sopenharmony_ci if (coded == DBCINV) 8197db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8207db96d56Sopenharmony_ci else 8217db96d56Sopenharmony_ci return coded; 8227db96d56Sopenharmony_ci break; 8237db96d56Sopenharmony_ci 8247db96d56Sopenharmony_ci default: 8257db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8267db96d56Sopenharmony_ci } 8277db96d56Sopenharmony_ci} 8287db96d56Sopenharmony_ci 8297db96d56Sopenharmony_cistatic DBCHAR 8307db96d56Sopenharmony_cijisx0213_2000_1_encoder(const Py_UCS4 *data, Py_ssize_t *length) 8317db96d56Sopenharmony_ci{ 8327db96d56Sopenharmony_ci DBCHAR coded = jisx0213_encoder(data, length, (void *)2000); 8337db96d56Sopenharmony_ci if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL) 8347db96d56Sopenharmony_ci return coded; 8357db96d56Sopenharmony_ci else if (coded & 0x8000) 8367db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8377db96d56Sopenharmony_ci else 8387db96d56Sopenharmony_ci return coded; 8397db96d56Sopenharmony_ci} 8407db96d56Sopenharmony_ci 8417db96d56Sopenharmony_cistatic DBCHAR 8427db96d56Sopenharmony_cijisx0213_2000_1_encoder_paironly(const Py_UCS4 *data, Py_ssize_t *length) 8437db96d56Sopenharmony_ci{ 8447db96d56Sopenharmony_ci DBCHAR coded; 8457db96d56Sopenharmony_ci Py_ssize_t ilength = *length; 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_ci coded = jisx0213_encoder(data, length, (void *)2000); 8487db96d56Sopenharmony_ci switch (ilength) { 8497db96d56Sopenharmony_ci case 1: 8507db96d56Sopenharmony_ci if (coded == MAP_MULTIPLE_AVAIL) 8517db96d56Sopenharmony_ci return MAP_MULTIPLE_AVAIL; 8527db96d56Sopenharmony_ci else 8537db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8547db96d56Sopenharmony_ci case 2: 8557db96d56Sopenharmony_ci if (*length != 2) 8567db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8577db96d56Sopenharmony_ci else 8587db96d56Sopenharmony_ci return coded; 8597db96d56Sopenharmony_ci default: 8607db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8617db96d56Sopenharmony_ci } 8627db96d56Sopenharmony_ci} 8637db96d56Sopenharmony_ci 8647db96d56Sopenharmony_cistatic DBCHAR 8657db96d56Sopenharmony_cijisx0213_2000_2_encoder(const Py_UCS4 *data, Py_ssize_t *length) 8667db96d56Sopenharmony_ci{ 8677db96d56Sopenharmony_ci DBCHAR coded = jisx0213_encoder(data, length, (void *)2000); 8687db96d56Sopenharmony_ci if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL) 8697db96d56Sopenharmony_ci return coded; 8707db96d56Sopenharmony_ci else if (coded & 0x8000) 8717db96d56Sopenharmony_ci return coded & 0x7fff; 8727db96d56Sopenharmony_ci else 8737db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8747db96d56Sopenharmony_ci} 8757db96d56Sopenharmony_ci 8767db96d56Sopenharmony_cistatic DBCHAR 8777db96d56Sopenharmony_cijisx0213_2004_1_encoder(const Py_UCS4 *data, Py_ssize_t *length) 8787db96d56Sopenharmony_ci{ 8797db96d56Sopenharmony_ci DBCHAR coded = jisx0213_encoder(data, length, NULL); 8807db96d56Sopenharmony_ci if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL) 8817db96d56Sopenharmony_ci return coded; 8827db96d56Sopenharmony_ci else if (coded & 0x8000) 8837db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 8847db96d56Sopenharmony_ci else 8857db96d56Sopenharmony_ci return coded; 8867db96d56Sopenharmony_ci} 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_cistatic DBCHAR 8897db96d56Sopenharmony_cijisx0213_2004_1_encoder_paironly(const Py_UCS4 *data, Py_ssize_t *length) 8907db96d56Sopenharmony_ci{ 8917db96d56Sopenharmony_ci DBCHAR coded; 8927db96d56Sopenharmony_ci Py_ssize_t ilength = *length; 8937db96d56Sopenharmony_ci 8947db96d56Sopenharmony_ci coded = jisx0213_encoder(data, length, NULL); 8957db96d56Sopenharmony_ci switch (ilength) { 8967db96d56Sopenharmony_ci case 1: 8977db96d56Sopenharmony_ci if (coded == MAP_MULTIPLE_AVAIL) 8987db96d56Sopenharmony_ci return MAP_MULTIPLE_AVAIL; 8997db96d56Sopenharmony_ci else 9007db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9017db96d56Sopenharmony_ci case 2: 9027db96d56Sopenharmony_ci if (*length != 2) 9037db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9047db96d56Sopenharmony_ci else 9057db96d56Sopenharmony_ci return coded; 9067db96d56Sopenharmony_ci default: 9077db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9087db96d56Sopenharmony_ci } 9097db96d56Sopenharmony_ci} 9107db96d56Sopenharmony_ci 9117db96d56Sopenharmony_cistatic DBCHAR 9127db96d56Sopenharmony_cijisx0213_2004_2_encoder(const Py_UCS4 *data, Py_ssize_t *length) 9137db96d56Sopenharmony_ci{ 9147db96d56Sopenharmony_ci DBCHAR coded = jisx0213_encoder(data, length, NULL); 9157db96d56Sopenharmony_ci if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL) 9167db96d56Sopenharmony_ci return coded; 9177db96d56Sopenharmony_ci else if (coded & 0x8000) 9187db96d56Sopenharmony_ci return coded & 0x7fff; 9197db96d56Sopenharmony_ci else 9207db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9217db96d56Sopenharmony_ci} 9227db96d56Sopenharmony_ci 9237db96d56Sopenharmony_cistatic Py_UCS4 9247db96d56Sopenharmony_cijisx0201_r_decoder(const unsigned char *data) 9257db96d56Sopenharmony_ci{ 9267db96d56Sopenharmony_ci Py_UCS4 u; 9277db96d56Sopenharmony_ci JISX0201_R_DECODE_CHAR(*data, u) 9287db96d56Sopenharmony_ci else 9297db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9307db96d56Sopenharmony_ci return u; 9317db96d56Sopenharmony_ci} 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_cistatic DBCHAR 9347db96d56Sopenharmony_cijisx0201_r_encoder(const Py_UCS4 *data, Py_ssize_t *length) 9357db96d56Sopenharmony_ci{ 9367db96d56Sopenharmony_ci DBCHAR coded; 9377db96d56Sopenharmony_ci JISX0201_R_ENCODE(*data, coded) 9387db96d56Sopenharmony_ci else 9397db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9407db96d56Sopenharmony_ci return coded; 9417db96d56Sopenharmony_ci} 9427db96d56Sopenharmony_ci 9437db96d56Sopenharmony_cistatic Py_UCS4 9447db96d56Sopenharmony_cijisx0201_k_decoder(const unsigned char *data) 9457db96d56Sopenharmony_ci{ 9467db96d56Sopenharmony_ci Py_UCS4 u; 9477db96d56Sopenharmony_ci JISX0201_K_DECODE_CHAR(*data ^ 0x80, u) 9487db96d56Sopenharmony_ci else 9497db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9507db96d56Sopenharmony_ci return u; 9517db96d56Sopenharmony_ci} 9527db96d56Sopenharmony_ci 9537db96d56Sopenharmony_cistatic DBCHAR 9547db96d56Sopenharmony_cijisx0201_k_encoder(const Py_UCS4 *data, Py_ssize_t *length) 9557db96d56Sopenharmony_ci{ 9567db96d56Sopenharmony_ci DBCHAR coded; 9577db96d56Sopenharmony_ci JISX0201_K_ENCODE(*data, coded) 9587db96d56Sopenharmony_ci else 9597db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9607db96d56Sopenharmony_ci return coded - 0x80; 9617db96d56Sopenharmony_ci} 9627db96d56Sopenharmony_ci 9637db96d56Sopenharmony_cistatic int 9647db96d56Sopenharmony_cigb2312_init(void) 9657db96d56Sopenharmony_ci{ 9667db96d56Sopenharmony_ci static int initialized = 0; 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ci if (!initialized && ( 9697db96d56Sopenharmony_ci IMPORT_MAP(cn, gbcommon, &gbcommon_encmap, NULL) || 9707db96d56Sopenharmony_ci IMPORT_MAP(cn, gb2312, NULL, &gb2312_decmap))) 9717db96d56Sopenharmony_ci return -1; 9727db96d56Sopenharmony_ci initialized = 1; 9737db96d56Sopenharmony_ci return 0; 9747db96d56Sopenharmony_ci} 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_cistatic Py_UCS4 9777db96d56Sopenharmony_cigb2312_decoder(const unsigned char *data) 9787db96d56Sopenharmony_ci{ 9797db96d56Sopenharmony_ci Py_UCS4 u; 9807db96d56Sopenharmony_ci if (TRYMAP_DEC(gb2312, u, data[0], data[1])) 9817db96d56Sopenharmony_ci return u; 9827db96d56Sopenharmony_ci else 9837db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9847db96d56Sopenharmony_ci} 9857db96d56Sopenharmony_ci 9867db96d56Sopenharmony_cistatic DBCHAR 9877db96d56Sopenharmony_cigb2312_encoder(const Py_UCS4 *data, Py_ssize_t *length) 9887db96d56Sopenharmony_ci{ 9897db96d56Sopenharmony_ci DBCHAR coded; 9907db96d56Sopenharmony_ci assert(*length == 1); 9917db96d56Sopenharmony_ci if (*data < 0x10000) { 9927db96d56Sopenharmony_ci if (TRYMAP_ENC(gbcommon, coded, *data)) { 9937db96d56Sopenharmony_ci if (!(coded & 0x8000)) 9947db96d56Sopenharmony_ci return coded; 9957db96d56Sopenharmony_ci } 9967db96d56Sopenharmony_ci } 9977db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 9987db96d56Sopenharmony_ci} 9997db96d56Sopenharmony_ci 10007db96d56Sopenharmony_ci 10017db96d56Sopenharmony_cistatic Py_UCS4 10027db96d56Sopenharmony_cidummy_decoder(const unsigned char *data) 10037db96d56Sopenharmony_ci{ 10047db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 10057db96d56Sopenharmony_ci} 10067db96d56Sopenharmony_ci 10077db96d56Sopenharmony_cistatic DBCHAR 10087db96d56Sopenharmony_cidummy_encoder(const Py_UCS4 *data, Py_ssize_t *length) 10097db96d56Sopenharmony_ci{ 10107db96d56Sopenharmony_ci return MAP_UNMAPPABLE; 10117db96d56Sopenharmony_ci} 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci/*-*- registry tables -*-*/ 10147db96d56Sopenharmony_ci 10157db96d56Sopenharmony_ci#define REGISTRY_KSX1001_G0 { CHARSET_KSX1001, 0, 2, \ 10167db96d56Sopenharmony_ci ksx1001_init, \ 10177db96d56Sopenharmony_ci ksx1001_decoder, ksx1001_encoder } 10187db96d56Sopenharmony_ci#define REGISTRY_KSX1001_G1 { CHARSET_KSX1001, 1, 2, \ 10197db96d56Sopenharmony_ci ksx1001_init, \ 10207db96d56Sopenharmony_ci ksx1001_decoder, ksx1001_encoder } 10217db96d56Sopenharmony_ci#define REGISTRY_JISX0201_R { CHARSET_JISX0201_R, 0, 1, \ 10227db96d56Sopenharmony_ci NULL, \ 10237db96d56Sopenharmony_ci jisx0201_r_decoder, jisx0201_r_encoder } 10247db96d56Sopenharmony_ci#define REGISTRY_JISX0201_K { CHARSET_JISX0201_K, 0, 1, \ 10257db96d56Sopenharmony_ci NULL, \ 10267db96d56Sopenharmony_ci jisx0201_k_decoder, jisx0201_k_encoder } 10277db96d56Sopenharmony_ci#define REGISTRY_JISX0208 { CHARSET_JISX0208, 0, 2, \ 10287db96d56Sopenharmony_ci jisx0208_init, \ 10297db96d56Sopenharmony_ci jisx0208_decoder, jisx0208_encoder } 10307db96d56Sopenharmony_ci#define REGISTRY_JISX0208_O { CHARSET_JISX0208_O, 0, 2, \ 10317db96d56Sopenharmony_ci jisx0208_init, \ 10327db96d56Sopenharmony_ci jisx0208_decoder, jisx0208_encoder } 10337db96d56Sopenharmony_ci#define REGISTRY_JISX0212 { CHARSET_JISX0212, 0, 2, \ 10347db96d56Sopenharmony_ci jisx0212_init, \ 10357db96d56Sopenharmony_ci jisx0212_decoder, jisx0212_encoder } 10367db96d56Sopenharmony_ci#define REGISTRY_JISX0213_2000_1 { CHARSET_JISX0213_2000_1, 0, 2, \ 10377db96d56Sopenharmony_ci jisx0213_init, \ 10387db96d56Sopenharmony_ci jisx0213_2000_1_decoder, \ 10397db96d56Sopenharmony_ci jisx0213_2000_1_encoder } 10407db96d56Sopenharmony_ci#define REGISTRY_JISX0213_2000_1_PAIRONLY { CHARSET_JISX0213_2000_1, 0, 2, \ 10417db96d56Sopenharmony_ci jisx0213_init, \ 10427db96d56Sopenharmony_ci jisx0213_2000_1_decoder, \ 10437db96d56Sopenharmony_ci jisx0213_2000_1_encoder_paironly } 10447db96d56Sopenharmony_ci#define REGISTRY_JISX0213_2000_2 { CHARSET_JISX0213_2, 0, 2, \ 10457db96d56Sopenharmony_ci jisx0213_init, \ 10467db96d56Sopenharmony_ci jisx0213_2000_2_decoder, \ 10477db96d56Sopenharmony_ci jisx0213_2000_2_encoder } 10487db96d56Sopenharmony_ci#define REGISTRY_JISX0213_2004_1 { CHARSET_JISX0213_2004_1, 0, 2, \ 10497db96d56Sopenharmony_ci jisx0213_init, \ 10507db96d56Sopenharmony_ci jisx0213_2004_1_decoder, \ 10517db96d56Sopenharmony_ci jisx0213_2004_1_encoder } 10527db96d56Sopenharmony_ci#define REGISTRY_JISX0213_2004_1_PAIRONLY { CHARSET_JISX0213_2004_1, 0, 2, \ 10537db96d56Sopenharmony_ci jisx0213_init, \ 10547db96d56Sopenharmony_ci jisx0213_2004_1_decoder, \ 10557db96d56Sopenharmony_ci jisx0213_2004_1_encoder_paironly } 10567db96d56Sopenharmony_ci#define REGISTRY_JISX0213_2004_2 { CHARSET_JISX0213_2, 0, 2, \ 10577db96d56Sopenharmony_ci jisx0213_init, \ 10587db96d56Sopenharmony_ci jisx0213_2004_2_decoder, \ 10597db96d56Sopenharmony_ci jisx0213_2004_2_encoder } 10607db96d56Sopenharmony_ci#define REGISTRY_GB2312 { CHARSET_GB2312, 0, 2, \ 10617db96d56Sopenharmony_ci gb2312_init, \ 10627db96d56Sopenharmony_ci gb2312_decoder, gb2312_encoder } 10637db96d56Sopenharmony_ci#define REGISTRY_CNS11643_1 { CHARSET_CNS11643_1, 1, 2, \ 10647db96d56Sopenharmony_ci cns11643_init, \ 10657db96d56Sopenharmony_ci cns11643_1_decoder, cns11643_1_encoder } 10667db96d56Sopenharmony_ci#define REGISTRY_CNS11643_2 { CHARSET_CNS11643_2, 2, 2, \ 10677db96d56Sopenharmony_ci cns11643_init, \ 10687db96d56Sopenharmony_ci cns11643_2_decoder, cns11643_2_encoder } 10697db96d56Sopenharmony_ci#define REGISTRY_ISO8859_1 { CHARSET_ISO8859_1, 2, 1, \ 10707db96d56Sopenharmony_ci NULL, dummy_decoder, dummy_encoder } 10717db96d56Sopenharmony_ci#define REGISTRY_ISO8859_7 { CHARSET_ISO8859_7, 2, 1, \ 10727db96d56Sopenharmony_ci NULL, dummy_decoder, dummy_encoder } 10737db96d56Sopenharmony_ci#define REGISTRY_SENTINEL { 0, } 10747db96d56Sopenharmony_ci#define CONFIGDEF(var, attrs) \ 10757db96d56Sopenharmony_ci static const struct iso2022_config iso2022_##var##_config = { \ 10767db96d56Sopenharmony_ci attrs, iso2022_##var##_designations \ 10777db96d56Sopenharmony_ci }; 10787db96d56Sopenharmony_ci 10797db96d56Sopenharmony_cistatic const struct iso2022_designation iso2022_kr_designations[] = { 10807db96d56Sopenharmony_ci REGISTRY_KSX1001_G1, REGISTRY_SENTINEL 10817db96d56Sopenharmony_ci}; 10827db96d56Sopenharmony_ciCONFIGDEF(kr, 0) 10837db96d56Sopenharmony_ci 10847db96d56Sopenharmony_cistatic const struct iso2022_designation iso2022_jp_designations[] = { 10857db96d56Sopenharmony_ci REGISTRY_JISX0208, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O, 10867db96d56Sopenharmony_ci REGISTRY_SENTINEL 10877db96d56Sopenharmony_ci}; 10887db96d56Sopenharmony_ciCONFIGDEF(jp, NO_SHIFT | USE_JISX0208_EXT) 10897db96d56Sopenharmony_ci 10907db96d56Sopenharmony_cistatic const struct iso2022_designation iso2022_jp_1_designations[] = { 10917db96d56Sopenharmony_ci REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R, 10927db96d56Sopenharmony_ci REGISTRY_JISX0208_O, REGISTRY_SENTINEL 10937db96d56Sopenharmony_ci}; 10947db96d56Sopenharmony_ciCONFIGDEF(jp_1, NO_SHIFT | USE_JISX0208_EXT) 10957db96d56Sopenharmony_ci 10967db96d56Sopenharmony_cistatic const struct iso2022_designation iso2022_jp_2_designations[] = { 10977db96d56Sopenharmony_ci REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_KSX1001_G0, 10987db96d56Sopenharmony_ci REGISTRY_GB2312, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O, 10997db96d56Sopenharmony_ci REGISTRY_ISO8859_1, REGISTRY_ISO8859_7, REGISTRY_SENTINEL 11007db96d56Sopenharmony_ci}; 11017db96d56Sopenharmony_ciCONFIGDEF(jp_2, NO_SHIFT | USE_G2 | USE_JISX0208_EXT) 11027db96d56Sopenharmony_ci 11037db96d56Sopenharmony_cistatic const struct iso2022_designation iso2022_jp_2004_designations[] = { 11047db96d56Sopenharmony_ci REGISTRY_JISX0213_2004_1_PAIRONLY, REGISTRY_JISX0208, 11057db96d56Sopenharmony_ci REGISTRY_JISX0213_2004_1, REGISTRY_JISX0213_2004_2, REGISTRY_SENTINEL 11067db96d56Sopenharmony_ci}; 11077db96d56Sopenharmony_ciCONFIGDEF(jp_2004, NO_SHIFT | USE_JISX0208_EXT) 11087db96d56Sopenharmony_ci 11097db96d56Sopenharmony_cistatic const struct iso2022_designation iso2022_jp_3_designations[] = { 11107db96d56Sopenharmony_ci REGISTRY_JISX0213_2000_1_PAIRONLY, REGISTRY_JISX0208, 11117db96d56Sopenharmony_ci REGISTRY_JISX0213_2000_1, REGISTRY_JISX0213_2000_2, REGISTRY_SENTINEL 11127db96d56Sopenharmony_ci}; 11137db96d56Sopenharmony_ciCONFIGDEF(jp_3, NO_SHIFT | USE_JISX0208_EXT) 11147db96d56Sopenharmony_ci 11157db96d56Sopenharmony_cistatic const struct iso2022_designation iso2022_jp_ext_designations[] = { 11167db96d56Sopenharmony_ci REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R, 11177db96d56Sopenharmony_ci REGISTRY_JISX0201_K, REGISTRY_JISX0208_O, REGISTRY_SENTINEL 11187db96d56Sopenharmony_ci}; 11197db96d56Sopenharmony_ciCONFIGDEF(jp_ext, NO_SHIFT | USE_JISX0208_EXT) 11207db96d56Sopenharmony_ci 11217db96d56Sopenharmony_ci 11227db96d56Sopenharmony_ciBEGIN_MAPPINGS_LIST 11237db96d56Sopenharmony_ci /* no mapping table here */ 11247db96d56Sopenharmony_ciEND_MAPPINGS_LIST 11257db96d56Sopenharmony_ci 11267db96d56Sopenharmony_ci#define ISO2022_CODEC(variation) { \ 11277db96d56Sopenharmony_ci "iso2022_" #variation, \ 11287db96d56Sopenharmony_ci &iso2022_##variation##_config, \ 11297db96d56Sopenharmony_ci iso2022_codec_init, \ 11307db96d56Sopenharmony_ci _STATEFUL_METHODS(iso2022) \ 11317db96d56Sopenharmony_ci}, 11327db96d56Sopenharmony_ci 11337db96d56Sopenharmony_ciBEGIN_CODECS_LIST 11347db96d56Sopenharmony_ci ISO2022_CODEC(kr) 11357db96d56Sopenharmony_ci ISO2022_CODEC(jp) 11367db96d56Sopenharmony_ci ISO2022_CODEC(jp_1) 11377db96d56Sopenharmony_ci ISO2022_CODEC(jp_2) 11387db96d56Sopenharmony_ci ISO2022_CODEC(jp_2004) 11397db96d56Sopenharmony_ci ISO2022_CODEC(jp_3) 11407db96d56Sopenharmony_ci ISO2022_CODEC(jp_ext) 11417db96d56Sopenharmony_ciEND_CODECS_LIST 11427db96d56Sopenharmony_ci 11437db96d56Sopenharmony_ciI_AM_A_MODULE_FOR(iso2022) 1144