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