[Python-checkins] python/dist/src/Modules/cjkcodecs README, NONE, 1.1 _big5.c, NONE, 1.1 _cp932.c, NONE, 1.1 _cp949.c, NONE, 1.1 _cp950.c, NONE, 1.1 _euc_jisx0213.c, NONE, 1.1 _euc_jp.c, NONE, 1.1 _euc_kr.c, NONE, 1.1 _gb18030.c, NONE, 1.1 _gb2312.c, NONE, 1.1 _gbk.c, NONE, 1.1 _hz.c, NONE, 1.1 _iso2022_jp.c, NONE, 1.1 _iso2022_jp_1.c, NONE, 1.1 _iso2022_jp_2.c, NONE, 1.1 _iso2022_jp_3.c, NONE, 1.1 _iso2022_jp_ext.c, NONE, 1.1 _iso2022_kr.c, NONE, 1.1 _johab.c, NONE, 1.1 _shift_jis.c, NONE, 1.1 _shift_jisx0213.c, NONE, 1.1 alg_iso8859_1.h, NONE, 1.1 alg_iso8859_7.h, NONE, 1.1 alg_jisx0201.h, NONE, 1.1 cjkcommon.h, NONE, 1.1 codeccommon.h, NONE, 1.1 codecentry.h, NONE, 1.1 iso2022common.h, NONE, 1.1 map_big5.h, NONE, 1.1 map_cp932ext.h, NONE, 1.1 map_cp949.h, NONE, 1.1 map_cp949ext.h, NONE, 1.1 map_cp950ext.h, NONE, 1.1 map_gb18030ext.h, NONE, 1.1 map_gb18030uni.h, NONE, 1.1 map_gb2312.h, NONE, 1.1 map_gbcommon.h, NONE, 1.1 map_gbkext.h, NONE, 1.1 map_jisx0208.h, NONE, 1.1 map_jisx0212.h, NONE, 1.1 map_jisx0213.h, NONE, 1.1 map_jisx0213_pairs.h, NONE, 1.1 map_jisxcom! mon.h, NONE, 1.1 map_ksx1001.h, NONE, 1.1 mapdata_ja_JP.c, NONE, 1.1 mapdata_ko_KR.c, NONE, 1.1 mapdata_zh_CN.c, NONE, 1.1 mapdata_zh_TW.c, NONE, 1.1 multibytecodec.c, NONE, 1.1 multibytecodec.h, NONE, 1.1 tweak_gbk.h, NONE, 1.1

perky at users.sourceforge.net perky at users.sourceforge.net
Sat Jan 17 09:29:31 EST 2004


Update of /cvsroot/python/python/dist/src/Modules/cjkcodecs
In directory sc8-pr-cvs1:/tmp/cvs-serv14239/Modules/cjkcodecs

Added Files:
	README _big5.c _cp932.c _cp949.c _cp950.c _euc_jisx0213.c 
	_euc_jp.c _euc_kr.c _gb18030.c _gb2312.c _gbk.c _hz.c 
	_iso2022_jp.c _iso2022_jp_1.c _iso2022_jp_2.c _iso2022_jp_3.c 
	_iso2022_jp_ext.c _iso2022_kr.c _johab.c _shift_jis.c 
	_shift_jisx0213.c alg_iso8859_1.h alg_iso8859_7.h 
	alg_jisx0201.h cjkcommon.h codeccommon.h codecentry.h 
	iso2022common.h map_big5.h map_cp932ext.h map_cp949.h 
	map_cp949ext.h map_cp950ext.h map_gb18030ext.h 
	map_gb18030uni.h map_gb2312.h map_gbcommon.h map_gbkext.h 
	map_jisx0208.h map_jisx0212.h map_jisx0213.h 
	map_jisx0213_pairs.h map_jisxcommon.h map_ksx1001.h 
	mapdata_ja_JP.c mapdata_ko_KR.c mapdata_zh_CN.c 
	mapdata_zh_TW.c multibytecodec.c multibytecodec.h tweak_gbk.h 
Log Message:
Add CJK codecs support as discussed on python-dev. (SF #873597)

Several style fixes are suggested by Martin v. Loewis and
Marc-Andre Lemburg. Thanks!


--- NEW FILE: README ---
Notes on cjkcodecs
-------------------
This directory contains source files for cjkcodecs extension modules.
They are based on CJKCodecs (http://cjkpython.i18n.org/#CJKCodecs)
as of Jan 17 2004 currently.



To generate or modify mapping headers
-------------------------------------
Mapping headers are imported from CJKCodecs as pre-generated form.
If you need to tweak or add something on it, please look at tools/
subdirectory of CJKCodecs' distribution.



Notes on implmentation characteristics of each codecs
-----------------------------------------------------

1) Big5 codec

  The big5 codec maps the following characters as cp950 does rather
  than conforming Unicode.org's that maps to 0xFFFD.

    BIG5        Unicode     Description

    0xA15A      0x2574      SPACING UNDERSCORE
    0xA1C3      0xFFE3      SPACING HEAVY OVERSCORE
    0xA1C5      0x02CD      SPACING HEAVY UNDERSCORE
    0xA1FE      0xFF0F      LT DIAG UP RIGHT TO LOW LEFT
    0xA240      0xFF3C      LT DIAG UP LEFT TO LOW RIGHT
    0xA2CC      0x5341      HANGZHOU NUMERAL TEN
    0xA2CE      0x5345      HANGZHOU NUMERAL THIRTY

  Because unicode 0x5341, 0x5345, 0xFF0F, 0xFF3C is mapped to another
  big5 codes already, a roundtrip compatibility is not guaranteed for
  them.


2) cp932 codec

  To conform to Windows's real mapping, cp932 codec maps the following
  codepoints in addition of the official cp932 mapping.

    CP932     Unicode     Description

    0x80      0x80        UNDEFINED
    0xA0      0xF8F0      UNDEFINED
    0xFD      0xF8F1      UNDEFINED
    0xFE      0xF8F2      UNDEFINED
    0xFF      0xF8F3      UNDEFINED


3) euc-jisx0213 codec

  The euc-jisx0213 codec maps JIS X 0213 Plane 1 code 0x2140 into
  unicode U+FF3C instead of U+005C as on unicode.org's mapping.
  Because euc-jisx0213 has REVERSE SOLIDUS on 0x5c already and A140
  is shown as a full width character, mapping to U+FF3C can make
  more sense.

  The euc-jisx0213 codec is enabled to decode JIS X 0212 codes on
  codeset 2. Because JIS X 0212 and JIS X 0213 Plane 2 don't have
  overlapped by each other, it doesn't bother standard conformations
  (and JIS X 0213 Plane 2 is intended to use so.) On encoding
  sessions, the codec will try to encode kanji characters in this
  order:

    JIS X 0213 Plane 1 -> JIS X 0213 Plane 2 -> JIS X 0212


4) euc-jp codec

  The euc-jp codec is a compatibility instance on these points:
   - U+FF3C FULLWIDTH REVERSE SOLIDUS is mapped to EUC-JP A1C0 (vice versa)
   - U+00A5 YEN SIGN is mapped to EUC-JP 0x5c. (one way)
   - U+203E OVERLINE is mapped to EUC-JP 0x7e. (one way)


5) shift-jis codec

  The shift-jis codec is mapping 0x20-0x7e area to U+20-U+7E directly
  instead of using JIS X 0201 for compatibility. The differences are:
   - U+005C REVERSE SOLIDUS is mapped to SHIFT-JIS 0x5c.
   - U+007E TILDE is mapped to SHIFT-JIS 0x7e.
   - U+FF3C FULL-WIDTH REVERSE SOLIDUS is mapped to SHIFT-JIS 815f.


--- NEW FILE: _big5.c ---
/*
 * _big5.c: the Big5 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _big5.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(big5)
DECMAP(big5)

ENCODER(big5)
{
    while (inleft > 0) {
        Py_UNICODE  c = **inbuf;
        DBCHAR      code;

        if (c < 0x80) {
            RESERVE_OUTBUF(1)
            **outbuf = c;
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)

        RESERVE_OUTBUF(2)

        TRYMAP_ENC(big5, code, c);
        else return 1;

        (*outbuf)[0] = code >> 8;
        (*outbuf)[1] = code & 0xFF;
        NEXT(1, 2)
    }

    return 0;
}

DECODER(big5)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)
        TRYMAP_DEC(big5, **outbuf, c, IN2) {
            NEXT(2, 1)
        } else return 2;
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(big5)
    MAPOPEN(zh_TW)
        IMPORTMAP_ENCDEC(big5)
    MAPCLOSE()
END_CODEC_REGISTRY(big5)

--- NEW FILE: _cp932.c ---
/*
 * _cp932.c: the CP932 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _cp932.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(jisxcommon)
ENCMAP(cp932ext)
DECMAP(jisx0208)
DECMAP(cp932ext)

ENCODER(cp932)
{
    while (inleft > 0) {
        Py_UNICODE       c = IN1;
        DBCHAR           code;
        unsigned char    c1, c2;

        if (c <= 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        } else if (c >= 0xff61 && c <= 0xff9f) {
            WRITE1(c - 0xfec0)
            NEXT(1, 1)
            continue;
        } else if (c >= 0xf8f0 && c <= 0xf8f3) {
            /* Windows compatability */
            RESERVE_OUTBUF(1)
            if (c == 0xf8f0)
                OUT1(0xa0)
            else
                OUT1(c - 0xfef1 + 0xfd)
            NEXT(1, 1)
            continue;
        }

        UCS4INVALID(c)
        RESERVE_OUTBUF(2)

        TRYMAP_ENC(cp932ext, code, c) {
            OUT1(code >> 8)
            OUT2(code & 0xff)
        } else TRYMAP_ENC(jisxcommon, code, c) {
            if (code & 0x8000) /* MSB set: JIS X 0212 */
                return 1;

            /* JIS X 0208 */
            c1 = code >> 8;
            c2 = code & 0xff;
            c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
            c1 = (c1 - 0x21) >> 1;
            OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
            OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
        } else if (c >= 0xe000 && c < 0xe758) {
            /* User-defined area */
            c1 = (Py_UNICODE)(c - 0xe000) / 188;
            c2 = (Py_UNICODE)(c - 0xe000) % 188;
            OUT1(c1 + 0xf0)
            OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
        } else
            return 1;

        NEXT(1, 2)
    }

    return 0;
}

DECODER(cp932)
{
    while (inleft > 0) {
        unsigned char    c = IN1, c2;

        RESERVE_OUTBUF(1)
        if (c <= 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        } else if (c >= 0xa0 && c <= 0xdf) {
            if (c == 0xa0)
                OUT1(0xf8f0) /* half-width katakana */
            else
                OUT1(0xfec0 + c)
            NEXT(1, 1)
            continue;
        } else if (c >= 0xfd/* && c <= 0xff*/) {
            /* Windows compatibility */
            OUT1(0xf8f1 - 0xfd + c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)
        c2 = IN2;

        TRYMAP_DEC(cp932ext, **outbuf, c, c2);
        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)) {
            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
                return 2;

            c = (c < 0xe0 ? c - 0x81 : c - 0xc1);
            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
            c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;

            TRYMAP_DEC(jisx0208, **outbuf, c, c2);
            else return 2;
        } else if (c >= 0xf0 && c <= 0xf9) {
            if ((c2 >= 0x40 && c2 <= 0x7e) || (c2 >= 0x80 && c2 <= 0xfc))
                OUT1(0xe000 + 188 * (c - 0xf0) +
                       (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41))
            else
                return 2;
        } else
            return 2;

        NEXT(2, 1)
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(cp932)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_ENCDEC(cp932ext)
        IMPORTMAP_ENC(jisxcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(cp932)

--- NEW FILE: _cp949.c ---
/*
 * _cp949.c: the CP949 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _cp949.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(cp949)
DECMAP(ksx1001)
DECMAP(cp949ext)

ENCODER(cp949)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)

        RESERVE_OUTBUF(2)
        TRYMAP_ENC(cp949, code, c);
        else return 1;

        OUT1((code >> 8) | 0x80)
        if (code & 0x8000)
            OUT2(code & 0xFF) /* MSB set: CP949 */
        else
            OUT2((code & 0xFF) | 0x80) /* MSB unset: ks x 1001 */
        NEXT(1, 2)
    }

    return 0;
}

DECODER(cp949)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)
        TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80);
        else TRYMAP_DEC(cp949ext, **outbuf, c, IN2);
        else return 2;

        NEXT(2, 1)
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(cp949)
    MAPOPEN(ko_KR)
        IMPORTMAP_DEC(ksx1001)
        IMPORTMAP_DEC(cp949ext)
        IMPORTMAP_ENC(cp949)
    MAPCLOSE()
END_CODEC_REGISTRY(cp949)

--- NEW FILE: _cp950.c ---
/*
 * _cp950.c: the CP950 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _cp950.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(big5)
ENCMAP(cp950ext)
DECMAP(big5)
DECMAP(cp950ext)

ENCODER(cp950)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)

        RESERVE_OUTBUF(2)
        TRYMAP_ENC(cp950ext, code, c);
        else TRYMAP_ENC(big5, code, c);
        else return 1;

        OUT1(code >> 8)
        OUT2(code & 0xFF)
        NEXT(1, 2)
    }

    return 0;
}

DECODER(cp950)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)

        TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
        else TRYMAP_DEC(big5, **outbuf, c, IN2);
        else return 2;

        NEXT(2, 1)
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(cp950)
    MAPOPEN(zh_TW)
        IMPORTMAP_ENCDEC(big5)
        IMPORTMAP_ENCDEC(cp950ext)
    MAPCLOSE()
END_CODEC_REGISTRY(cp950)

--- NEW FILE: _euc_jisx0213.c ---
/*
 * _euc_jisx0213.c: the EUC-JISX0213 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _euc_jisx0213.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#define USING_BINARY_PAIR_SEARCH
#include "codeccommon.h"
#include "map_jisx0213_pairs.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)
DECMAP(jisx0212)
ENCMAP(jisx0213_bmp)
DECMAP(jisx0213_1_bmp)
DECMAP(jisx0213_2_bmp)
ENCMAP(jisx0213_emp)
DECMAP(jisx0213_1_emp)
DECMAP(jisx0213_2_emp)

#define EMPBASE     0x20000

ENCODER(euc_jisx0213)
{
    while (inleft > 0) {
        ucs4_t   c = IN1;
        DBCHAR   code;
        int      insize;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }

        DECODE_SURROGATE(c)
        insize = GET_INSIZE(c);

        if (c <= 0xFFFF) {
            /* try 0213 first because it might have MULTIC */
            TRYMAP_ENC(jisx0213_bmp, code, c) {
                if (code == MULTIC) {
                    if (inleft < 2) {
                        if (flags & MBENC_FLUSH) {
                            code = find_pairencmap(c, 0, jisx0213_pairencmap,
                                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                        } else
                            return MBERR_TOOFEW;
                    } else {
                        code = find_pairencmap(c, (*inbuf)[1],
                                    jisx0213_pairencmap, JISX0213_ENCPAIRS);
                        if (code == DBCINV) {
                            code = find_pairencmap(c, 0, jisx0213_pairencmap,
                                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                        } else
                            insize = 2;
                    }
                }
            } else TRYMAP_ENC(jisxcommon, code, c);
            else if (c >= 0xff61 && c <= 0xff9f) {
                /* JIS X 0201 half-width katakana */
                WRITE2(0x8e, c - 0xfec0)
                NEXT(1, 2)
                continue;
            } else if (c == 0xff3c)
                /* F/W REVERSE SOLIDUS (see NOTES.euc-jisx0213) */
                code = 0x2140;
            else if (c == 0xff5e)
                /* F/W TILDE (see NOTES.euc-jisx0213) */
                code = 0x2232;
            else
                return 1;
        } else if (c >> 16 == EMPBASE >> 16) {
            TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);
            else return insize;
        } else
            return insize;

        if (code & 0x8000) {
            /* Codeset 2 */
            WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
            NEXT(insize, 3)
        } else {
            /* Codeset 1 */
            WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
            NEXT(insize, 2)
        }
    }

    return 0;
}

DECODER(euc_jisx0213)
{
    while (inleft > 0) {
        unsigned char    c = IN1;
        ucs4_t           code;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        if (c == 0x8e) {
            /* JIS X 0201 half-width katakana */
            unsigned char    c2;

            RESERVE_INBUF(2)
            c2 = IN2;
            if (c2 >= 0xa1 && c2 <= 0xdf) {
                OUT1(0xfec0 + c2)
                NEXT(2, 1)
            } else
                return 2;
        } else if (c == 0x8f) {
            unsigned char    c2, c3;

            RESERVE_INBUF(3)
            c2 = IN2 ^ 0x80;
            c3 = IN3 ^ 0x80;

            /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES.euc-jisx0213) */
            TRYMAP_DEC(jisx0213_2_bmp, **outbuf, c2, c3) ;
            else TRYMAP_DEC(jisx0213_2_emp, code, c2, c3) {
                PUTUCS4(EMPBASE | code)
                NEXT_IN(3)
                continue;
            } else TRYMAP_DEC(jisx0212, **outbuf, c2, c3) ;
            else return 3;
            NEXT(3, 1)
        } else {
            unsigned char    c2;

            RESERVE_INBUF(2)
            c ^= 0x80;
            c2 = IN2 ^ 0x80;

            /* JIS X 0213 Plane 1 */
            if (c == 0x21 && c2 == 0x40) **outbuf = 0xff3c;
            else if (c == 0x22 && c2 == 0x32) **outbuf = 0xff5e;
            else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
            else TRYMAP_DEC(jisx0213_1_bmp, **outbuf, c, c2);
            else TRYMAP_DEC(jisx0213_1_emp, code, c, c2) {
                PUTUCS4(EMPBASE | code)
                NEXT_IN(2)
                continue;
            } else TRYMAP_DEC(jisx0213_pair, code, c, c2) {
                WRITE2(code >> 16, code & 0xffff)
                NEXT(2, 2)
                continue;
            } else return 2;
            NEXT(2, 1)
        }
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(euc_jisx0213)
    MAPOPEN(ja_JP)
        IMPORTMAP_ENC(jisxcommon)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_DEC(jisx0212)
        IMPORTMAP_ENC(jisx0213_bmp)
        IMPORTMAP_DEC(jisx0213_1_bmp)
        IMPORTMAP_DEC(jisx0213_2_bmp)
        IMPORTMAP_ENC(jisx0213_emp)
        IMPORTMAP_DEC(jisx0213_1_emp)
        IMPORTMAP_DEC(jisx0213_2_emp)
    MAPCLOSE()
END_CODEC_REGISTRY(euc_jisx0213)

--- NEW FILE: _euc_jp.c ---
/*
 * _euc_jp.c: the EUC-JP codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _euc_jp.c,v 1.5 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)
DECMAP(jisx0212)

ENCODER(euc_jp)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }

        UCS4INVALID(c)

        TRYMAP_ENC(jisxcommon, code, c);
        else if (c >= 0xff61 && c <= 0xff9f) {
            /* JIS X 0201 half-width katakana */
            WRITE2(0x8e, c - 0xfec0)
            NEXT(1, 2)
            continue;
        }
#ifndef STRICT_BUILD
        else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
            code = 0x2140;
        else if (c == 0xa5) { /* YEN SIGN */
            WRITE1(0x5c);
            NEXT(1, 1)
            continue;
        } else if (c == 0x203e) { /* OVERLINE */
            WRITE1(0x7e);
            NEXT(1, 1)
            continue;
        }
#endif
        else
            return 1;

        if (code & 0x8000) {
            /* JIS X 0212 */
            WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
            NEXT(1, 3)
        } else {
            /* JIS X 0208 */
            WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
            NEXT(1, 2)
        }
    }

    return 0;
}

DECODER(euc_jp)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        if (c == 0x8e) {
            /* JIS X 0201 half-width katakana */
            unsigned char    c2;

            RESERVE_INBUF(2)
            c2 = IN2;
            if (c2 >= 0xa1 && c2 <= 0xdf) {
                OUT1(0xfec0 + c2)
                NEXT(2, 1)
            } else
                return 2;
        } else if (c == 0x8f) {
            unsigned char    c2, c3;

            RESERVE_INBUF(3)
            c2 = IN2;
            c3 = IN3;
            /* JIS X 0212 */
            TRYMAP_DEC(jisx0212, **outbuf, c2 ^ 0x80, c3 ^ 0x80) {
                NEXT(3, 1)
            } else
                return 3;
        } else {
            unsigned char    c2;

            RESERVE_INBUF(2)
            c2 = IN2;
            /* JIS X 0208 */
#ifndef STRICT_BUILD
            if (c == 0xa1 && c2 == 0xc0) /* FULL-WIDTH REVERSE SOLIDUS */
                **outbuf = 0xff3c;
            else
#endif
            TRYMAP_DEC(jisx0208, **outbuf, c ^ 0x80, c2 ^ 0x80) ;
            else return 2;
            NEXT(2, 1)
        }
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(euc_jp)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_DEC(jisx0212)
        IMPORTMAP_ENC(jisxcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(euc_jp)

--- NEW FILE: _euc_kr.c ---
/*
 * _euc_kr.c: the EUC-KR codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _euc_kr.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(cp949)
DECMAP(ksx1001)

ENCODER(euc_kr)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)

        RESERVE_OUTBUF(2)
        TRYMAP_ENC(cp949, code, c);
        else return 1;

        if (code & 0x8000) /* MSB set: CP949 */
            return 1;

        OUT1((code >> 8) | 0x80)
        OUT2((code & 0xFF) | 0x80)
        NEXT(1, 2)
    }

    return 0;
}

DECODER(euc_kr)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)

        TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
            NEXT(2, 1)
        } else return 2;

    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(euc_kr)
    MAPOPEN(ko_KR)
        IMPORTMAP_DEC(ksx1001)
        IMPORTMAP_ENC(cp949)
    MAPCLOSE()
END_CODEC_REGISTRY(euc_kr)

--- NEW FILE: _gb18030.c ---
/*
 * _gb18030.c: the GB18030 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _gb18030.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"
#include "tweak_gbk.h"
#include "map_gb18030uni.h"

ENCMAP(gbcommon)
ENCMAP(gb18030ext)
DECMAP(gb2312)
DECMAP(gbkext)
DECMAP(gb18030ext)

ENCODER(gb18030)
{
    while (inleft > 0) {
        ucs4_t  c = IN1;
        DBCHAR  code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }

        DECODE_SURROGATE(c)
        if (c > 0x10FFFF)
#if Py_UNICODE_SIZE == 2
            return 2; /* surrogates pair */
#else
            return 1;
#endif
        else if (c >= 0x10000) {
            ucs4_t   tc = c - 0x10000;

            RESERVE_OUTBUF(4)

            OUT4((unsigned char)(tc % 10) + 0x30)
            tc /= 10;
            OUT3((unsigned char)(tc % 126) + 0x81)
            tc /= 126;
            OUT2((unsigned char)(tc % 10) + 0x30)
            tc /= 10;
            OUT1((unsigned char)(tc + 0x90))

#if Py_UNICODE_SIZE == 2
            NEXT(2, 4) /* surrogates pair */
#else
            NEXT(1, 4)
#endif
            continue;
        }

        RESERVE_OUTBUF(2)

        GBK_PREENCODE(c, code)
        else TRYMAP_ENC(gbcommon, code, c);
        else TRYMAP_ENC(gb18030ext, code, c);
        else {
            const struct _gb18030_to_unibmp_ranges  *utrrange;

            RESERVE_OUTBUF(4)

            for (utrrange = gb18030_to_unibmp_ranges;
                 utrrange->first != 0;
                 utrrange++)
                if (utrrange->first <= c && c <= utrrange->last) {
                    Py_UNICODE   tc;

                    tc = c - utrrange->first + utrrange->base;

                    OUT4((unsigned char)(tc % 10) + 0x30)
                    tc /= 10;
                    OUT3((unsigned char)(tc % 126) + 0x81)
                    tc /= 126;
                    OUT2((unsigned char)(tc % 10) + 0x30)
                    tc /= 10;
                    OUT1((unsigned char)tc + 0x81)

                    NEXT(1, 4)
                    break;
                }

            if (utrrange->first == 0) {
                PyErr_SetString(PyExc_RuntimeError,
                                "unicode mapping invalid");
                return 1;
            }
            continue;
        }

        OUT1((code >> 8) | 0x80)
        if (code & 0x8000)
            OUT2((code & 0xFF)) /* MSB set: GBK or GB18030ext */
        else
            OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */

        NEXT(1, 2)
    }

    return 0;
}

DECODER(gb18030)
{
    while (inleft > 0) {
        unsigned char    c = IN1, c2;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)

        c2 = IN2;
        if (c2 >= 0x30 && c2 <= 0x39) { /* 4 bytes seq */
            const struct _gb18030_to_unibmp_ranges *utr;
            unsigned char    c3, c4;
            ucs4_t           lseq;

            RESERVE_INBUF(4)
            c3 = IN3;
            c4 = IN4;
            if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39)
                return 4;
            c -= 0x81;  c2 -= 0x30;
            c3 -= 0x81; c4 -= 0x30;

            if (c < 4) { /* U+0080 - U+FFFF */
                lseq = ((ucs4_t)c * 10 + c2) * 1260 +
                        (ucs4_t)c3 * 10 + c4;
                if (lseq < 39420) {
                    for (utr = gb18030_to_unibmp_ranges;
                         lseq >= (utr + 1)->base;
                         utr++) ;
                    OUT1(utr->first - utr->base + lseq)
                    NEXT(4, 1)
                    continue;
                }
            }
            else if (c >= 15) { /* U+10000 - U+10FFFF */
                lseq = 0x10000 + (((ucs4_t)c-15) * 10 + c2) * 1260 +
                        (ucs4_t)c3 * 10 + c4;
                if (lseq <= 0x10FFFF) {
                    PUTUCS4(lseq);
                    NEXT_IN(4)
                    continue;
                }
            }
            return 4;
        }

        GBK_PREDECODE(c, c2, **outbuf)
        else TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, c2 ^ 0x80);
        else TRYMAP_DEC(gbkext, **outbuf, c, c2);
        else TRYMAP_DEC(gb18030ext, **outbuf, c, c2);
        else return 2;

        NEXT(2, 1)
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(gb18030)
    MAPOPEN(zh_CN)
        IMPORTMAP_DEC(gb2312)
        IMPORTMAP_DEC(gbkext)
        IMPORTMAP_ENC(gbcommon)
        IMPORTMAP_ENCDEC(gb18030ext)
    MAPCLOSE()
END_CODEC_REGISTRY(gb18030)

--- NEW FILE: _gb2312.c ---
/*
 * _gb2312.c: the GB2312 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _gb2312.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(gbcommon)
DECMAP(gb2312)

ENCODER(gb2312)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)

        RESERVE_OUTBUF(2)
        TRYMAP_ENC(gbcommon, code, c);
        else return 1;

        if (code & 0x8000) /* MSB set: GBK */
            return 1;

        OUT1((code >> 8) | 0x80)
        OUT2((code & 0xFF) | 0x80)
        NEXT(1, 2)
    }

    return 0;
}

DECODER(gb2312)
{
    while (inleft > 0) {
        unsigned char    c = **inbuf;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)
        TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
            NEXT(2, 1)
        } else return 2;
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(gb2312)
    MAPOPEN(zh_CN)
        IMPORTMAP_DEC(gb2312)
        IMPORTMAP_ENC(gbcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(gb2312)

--- NEW FILE: _gbk.c ---
/*
 * _gbk.c: the GBK codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _gbk.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"
#include "tweak_gbk.h"

ENCMAP(gbcommon)
DECMAP(gb2312)
DECMAP(gbkext)

ENCODER(gbk)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)

        RESERVE_OUTBUF(2)

        GBK_PREENCODE(c, code)
        else TRYMAP_ENC(gbcommon, code, c);
        else return 1;

        OUT1((code >> 8) | 0x80)
        if (code & 0x8000)
            OUT2((code & 0xFF)) /* MSB set: GBK */
        else
            OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
        NEXT(1, 2)
    }

    return 0;
}

DECODER(gbk)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)

        GBK_PREDECODE(c, IN2, **outbuf)
        else TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, IN2 ^ 0x80);
        else TRYMAP_DEC(gbkext, **outbuf, c, IN2);
        else return 2;

        NEXT(2, 1)
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(gbk)
    MAPOPEN(zh_CN)
        IMPORTMAP_DEC(gb2312)
        IMPORTMAP_DEC(gbkext)
        IMPORTMAP_ENC(gbcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(gbk)

--- NEW FILE: _hz.c ---
/*
 * _hz.c: the HZ codec (RFC1843)
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _hz.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(gbcommon)
DECMAP(gb2312)

#define HAVE_ENCODER_INIT
ENCODER_INIT(hz)
{
    state->i = 0;
    return 0;
}

#define HAVE_ENCODER_RESET
ENCODER_RESET(hz)
{
    if (state->i != 0) {
        WRITE2('~', '}')
        state->i = 0;
        NEXT_OUT(2)
    }
    return 0;
}

ENCODER(hz)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            if (state->i == 0) {
                WRITE1(c)
                NEXT(1, 1)
            } else {
                WRITE3('~', '}', c)
                NEXT(1, 3)
                state->i = 0;
            }
            continue;
        }

        UCS4INVALID(c)

        TRYMAP_ENC(gbcommon, code, c);
        else return 1;

        if (code & 0x8000) /* MSB set: GBK */
            return 1;

        if (state->i == 0) {
            WRITE4('~', '{', code >> 8, code & 0xff)
            NEXT(1, 4)
            state->i = 1;
        } else {
            WRITE2(code >> 8, code & 0xff)
            NEXT(1, 2)
        }
    }

    return 0;
}

#define HAVE_DECODER_INIT
DECODER_INIT(hz)
{
    state->i = 0;
    return 0;
}

#define HAVE_DECODER_RESET
DECODER_RESET(hz)
{
    state->i = 0;
    return 0;
}

DECODER(hz)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        if (c == '~') {
            unsigned char    c2 = IN2;

            RESERVE_INBUF(2)
            if (c2 == '~') {
                WRITE1('~')
                NEXT(2, 1)
                continue;
            } else if (c2 == '{' && state->i == 0)
                state->i = 1; /* set GB */
            else if (c2 == '}' && state->i == 1)
                state->i = 0; /* set ASCII */
            else if (c2 == '\n')
                ; /* line-continuation */
            else
                return 2;
            NEXT(2, 0);
            continue;
        }

        if (c & 0x80)
            return 1;

        if (state->i == 0) { /* ASCII mode */
            WRITE1(c)
            NEXT(1, 1)
        } else { /* GB mode */
            RESERVE_INBUF(2)
            RESERVE_OUTBUF(1)
            TRYMAP_DEC(gb2312, **outbuf, c, IN2) {
                NEXT(2, 1)
            } else
                return 2;
        }
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(hz)
    MAPOPEN(zh_CN)
        IMPORTMAP_DEC(gb2312)
        IMPORTMAP_ENC(gbcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(hz)

--- NEW FILE: _iso2022_jp.c ---
/*
 * _iso2022_jp.c: the ISO-2022-JP codec (RFC1468)
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _iso2022_jp.c,v 1.7 2003/12/31 05:46:55 perky Exp $
 */

#define ISO2022_DESIGNATIONS \
        CHARSET_ASCII, CHARSET_JISX0201_R, CHARSET_JISX0208, CHARSET_JISX0208_O
#define ISO2022_NO_SHIFT
#define ISO2022_USE_JISX0208EXT

#include "codeccommon.h"
#include "iso2022common.h"
#include "alg_jisx0201.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)

#define HAVE_ENCODER_INIT
ENCODER_INIT(iso2022_jp)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_ENCODER_RESET
ENCODER_RESET(iso2022_jp)
{
    if (STATE_GETG0(state) != CHARSET_ASCII) {
        RESERVE_OUTBUF(3)
        WRITE3(ESC, '(', 'B')
        STATE_SETG0(state, CHARSET_ASCII)
        NEXT_OUT(3)
    }
    return 0;
}

/* ISO-2022-JP changes designations instead of shifting-out */

ENCODER(iso2022_jp)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            switch (STATE_GETG0(state)) {
            case CHARSET_ASCII:
                WRITE1(c)
                NEXT(1, 1)
                break;
            case CHARSET_JISX0201_R:
                JISX0201_R_ENCODE(c, code)
                else { /* FALLTHROUGH (yay!) */
            default:
                    WRITE3(ESC, '(', 'B')
                    NEXT_OUT(3)
                    STATE_SETG0(state, CHARSET_ASCII)
                    code = c;
                }
                WRITE1(code)
                NEXT(1, 1)
                break;
            }
            if (c == '\n')
                STATE_CLEARFLAG(state, F_SHIFTED)
        }
        else UCS4INVALID(c)
        else {
            unsigned char    charset;

            charset = STATE_GETG0(state);
            if (charset == CHARSET_JISX0201_R) {
                code = DBCINV;
                JISX0201_R_ENCODE(c, code)
                if (code != DBCINV) {
                    WRITE1(code)
                    NEXT(1, 1)
                    continue;
                }
            }

            TRYMAP_ENC(jisxcommon, code, c) {
                if (code & 0x8000) /* MSB set: JIS X 0212 */
                    return 1;
jisx0208encode: if (charset != CHARSET_JISX0208) {
                    WRITE3(ESC, '$', 'B')
                    STATE_SETG0(state, CHARSET_JISX0208)
                    NEXT_OUT(3)
                }
                WRITE2(code >> 8, code & 0xff)
                NEXT(1, 2)
            } else if (c == 0xff3c) { /* FULL-WIDTH REVERSE SOLIDUS */
                code = 0x2140;
                goto jisx0208encode;
            } else {
                JISX0201_R_ENCODE(c, code)
                else
                    return 1;
                /* if (charset == CHARSET_JISX0201_R) : already checked */
                WRITE4(ESC, '(', 'J', code)
                STATE_SETG0(state, CHARSET_JISX0201_R)
                NEXT(1, 4)
            }
        }
    }

    return 0;
}

#define HAVE_DECODER_INIT
DECODER_INIT(iso2022_jp)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_DECODER_RESET
DECODER_RESET(iso2022_jp)
{
    STATE_CLEARFLAG(state, F_SHIFTED)
    return 0;
}

DECODER(iso2022_jp)
{
  ISO2022_LOOP_BEGIN
    unsigned char    charset, c2;

    ISO2022_GETCHARSET(charset, c)

    if (charset & CHARSET_DOUBLEBYTE) {
        /* all double byte character sets are in JIS X 0208 here.
         * this means that we don't distinguish :1978 from :1983. */
        RESERVE_INBUF(2)
        RESERVE_OUTBUF(1)
        c2 = IN2;
        if (c == 0x21 && c2 == 0x40) { /* FULL-WIDTH REVERSE SOLIDUS */
            **outbuf = 0xff3c;
            NEXT(2, 1)
        } else TRYMAP_DEC(jisx0208, **outbuf, c, c2) {
            NEXT(2, 1)
        } else
            return 2;
    } else if (charset == CHARSET_ASCII) {
        RESERVE_OUTBUF(1)
        OUT1(c)
        NEXT(1, 1)
    } else if (charset == CHARSET_JISX0201_R) {
        RESERVE_OUTBUF(1)
        JISX0201_R_DECODE(c, **outbuf)
        else
            return 1;
        NEXT(1, 1)
    } else
        return MBERR_INTERNAL;
  ISO2022_LOOP_END

  return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(iso2022_jp)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_ENC(jisxcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(iso2022_jp)

--- NEW FILE: _iso2022_jp_1.c ---
/*
 * _iso2022_jp_1.c: the ISO-2022-JP-1 codec (RFC2237)
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _iso2022_jp_1.c,v 1.8 2003/12/31 05:46:55 perky Exp $
 */

#define ISO2022_DESIGNATIONS \
        CHARSET_ASCII, CHARSET_JISX0201_R, CHARSET_JISX0208, \
        CHARSET_JISX0208_O, CHARSET_JISX0212
#define ISO2022_NO_SHIFT
#define ISO2022_USE_JISX0208EXT

#include "codeccommon.h"
#include "iso2022common.h"
#include "alg_jisx0201.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)
DECMAP(jisx0212)

#define HAVE_ENCODER_INIT
ENCODER_INIT(iso2022_jp_1)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_ENCODER_RESET
ENCODER_RESET(iso2022_jp_1)
{
    if (STATE_GETG0(state) != CHARSET_ASCII) {
        RESERVE_OUTBUF(3)
        WRITE3(ESC, '(', 'B')
        STATE_SETG0(state, CHARSET_ASCII)
        NEXT_OUT(3)
    }
    return 0;
}

/* ISO-2022-JP-1 changes designations instead of shifting-out */

ENCODER(iso2022_jp_1)
{
    while (inleft > 0) {
        Py_UNICODE  c = **inbuf;
        DBCHAR      code;

        if (c < 0x80) {
            switch (STATE_GETG0(state)) {
            case CHARSET_ASCII:
                WRITE1(c)
                NEXT(1, 1)
                break;
            case CHARSET_JISX0201_R:
                JISX0201_R_ENCODE(c, code)
                else { /* FALLTHROUGH (yay!) */
            default:
                    WRITE3(ESC, '(', 'B')
                    NEXT_OUT(3)
                    STATE_SETG0(state, CHARSET_ASCII)
                    code = c;
                }
                WRITE1(code)
                NEXT(1, 1)
                break;
            }
            if (c == '\n')
                STATE_CLEARFLAG(state, F_SHIFTED)
        }
        else UCS4INVALID(c)
        else {
            unsigned char    charset;

            charset = STATE_GETG0(state);
            if (charset == CHARSET_JISX0201_R) {
                code = DBCINV;
                JISX0201_R_ENCODE(c, code)
                if (code != DBCINV) {
                    WRITE1(code)
                    NEXT(1, 1)
                    continue;
                }
            }

            TRYMAP_ENC(jisxcommon, code, c) {
                if (code & 0x8000) { /* MSB set: JIS X 0212 */
                    if (charset != CHARSET_JISX0212) {
                        WRITE4(ESC, '$', '(', 'D')
                        STATE_SETG0(state, CHARSET_JISX0212)
                        NEXT_OUT(4)
                    }
                    WRITE2((code >> 8) & 0x7f, code & 0x7f)
                } else { /* MSB unset: JIS X 0208 */
jisx0208encode:     if (charset != CHARSET_JISX0208) {
                        WRITE3(ESC, '$', 'B')
                        STATE_SETG0(state, CHARSET_JISX0208)
                        NEXT_OUT(3)
                    }
                    WRITE2(code >> 8, code & 0xff)
                }
                NEXT(1, 2)
            } else if (c == 0xff3c) { /* FULL-WIDTH REVERSE SOLIDUS */
                code = 0x2140;
                goto jisx0208encode;
            } else {
                JISX0201_R_ENCODE(c, code)
                else
                    return 1;
                /* if (charset == CHARSET_JISX0201_R) : already checked */
                WRITE4(ESC, '(', 'J', code)
                STATE_SETG0(state, CHARSET_JISX0201_R)
                NEXT(1, 4)
            }
        }
    }

    return 0;
}

#define HAVE_DECODER_INIT
DECODER_INIT(iso2022_jp_1)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_DECODER_RESET
DECODER_RESET(iso2022_jp_1)
{
    STATE_CLEARFLAG(state, F_SHIFTED)
    return 0;
}

DECODER(iso2022_jp_1)
{
  ISO2022_LOOP_BEGIN
    unsigned char    charset, c2;

    ISO2022_GETCHARSET(charset, c)

    if (charset & CHARSET_DOUBLEBYTE) {
        RESERVE_INBUF(2)
        RESERVE_OUTBUF(1)
        c2 = IN2;
        if (charset == CHARSET_JISX0208 || charset == CHARSET_JISX0208_O) {
            if (c == 0x21 && c2 == 0x40) /* FULL-WIDTH REVERSE SOLIDUS */
                **outbuf = 0xff3c;
            else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
            else return 2;
        } else if (charset == CHARSET_JISX0212) {
            TRYMAP_DEC(jisx0212, **outbuf, c, c2);
            else return 2;
        } else
            return MBERR_INTERNAL;
        NEXT(2, 1)
    } else if (charset == CHARSET_ASCII) {
        RESERVE_OUTBUF(1)
        OUT1(c)
        NEXT(1, 1)
    } else if (charset == CHARSET_JISX0201_R) {
        RESERVE_OUTBUF(1)
        JISX0201_R_DECODE(c, **outbuf)
        else
            return 1;
        NEXT(1, 1)
    } else
        return MBERR_INTERNAL;
  ISO2022_LOOP_END

  return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(iso2022_jp_1)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_DEC(jisx0212)
        IMPORTMAP_ENC(jisxcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(iso2022_jp_1)

--- NEW FILE: _iso2022_jp_2.c ---
/*
 * _iso2022_jp_2.c: the ISO-2022-JP-2 codec (RFC1554)
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _iso2022_jp_2.c,v 1.8 2003/12/31 05:46:55 perky Exp $
 */

#define ISO2022_DESIGNATIONS \
        CHARSET_ASCII, CHARSET_JISX0201_R, CHARSET_JISX0208, \
        CHARSET_JISX0208_O, CHARSET_JISX0212, CHARSET_GB2312, \
        CHARSET_KSX1001, CHARSET_JISX0212, \
        CHARSET_ISO8859_1, CHARSET_ISO8859_7
#define ISO2022_USE_G2_DESIGNATION  yo!
#define ISO2022_USE_JISX0208EXT

#include "codeccommon.h"
#include "iso2022common.h"
#include "alg_jisx0201.h"
#include "alg_iso8859_1.h"
#include "alg_iso8859_7.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)
DECMAP(jisx0212)
ENCMAP(cp949)
DECMAP(ksx1001)
ENCMAP(gbcommon)
DECMAP(gb2312)

#define HAVE_ENCODER_INIT
ENCODER_INIT(iso2022_jp_2)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    STATE_SETG2(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_ENCODER_RESET
ENCODER_RESET(iso2022_jp_2)
{
    if (STATE_GETG0(state) != CHARSET_ASCII) {
        WRITE3(ESC, '(', 'B')
        STATE_SETG0(state, CHARSET_ASCII)
        NEXT_OUT(3)
    }
    return 0;
}

ENCODER(iso2022_jp_2)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            switch (STATE_GETG0(state)) {
            case CHARSET_ASCII:
                WRITE1(c)
                NEXT(1, 1)
                break;
            case CHARSET_JISX0201_R:
                JISX0201_R_ENCODE(c, code)
                else { /* FALLTHROUGH (yay!) */
            default:
                    WRITE3(ESC, '(', 'B')
                    NEXT_OUT(3)
                    STATE_SETG0(state, CHARSET_ASCII)
                    code = c;
                }
                WRITE1(code)
                NEXT(1, 1)
                break;
            }
            if (c == '\n')
                STATE_CLEARFLAG(state, F_SHIFTED)
        }
        else UCS4INVALID(c)
        else {
            unsigned char    charset;

            charset = STATE_GETG0(state);
            if (charset == CHARSET_JISX0201_R) {
                code = DBCINV;
                JISX0201_R_ENCODE(c, code)
                if (code != DBCINV) {
                    WRITE1(code)
                    NEXT(1, 1)
                    continue;
                }
            }

            TRYMAP_ENC(jisxcommon, code, c) {
                if (code & 0x8000) { /* MSB set: JIS X 0212 */
                    if (charset != CHARSET_JISX0212) {
                        WRITE4(ESC, '$', '(', 'D')
                        STATE_SETG0(state, CHARSET_JISX0212)
                        NEXT_OUT(4)
                    }
                    WRITE2((code >> 8) & 0x7f, code & 0x7f)
                } else { /* MSB unset: JIS X 0208 */
jisx0208encode:     if (charset != CHARSET_JISX0208) {
                        WRITE3(ESC, '$', 'B')
                        STATE_SETG0(state, CHARSET_JISX0208)
                        NEXT_OUT(3)
                    }
                    WRITE2(code >> 8, code & 0xff)
                }
                NEXT(1, 2)
            } else TRYMAP_ENC(cp949, code, c) {
                if (code & 0x8000) /* MSB set: CP949 */
                    return 2;
                if (charset != CHARSET_KSX1001) {
                    WRITE4(ESC, '$', '(', 'C')
                    STATE_SETG0(state, CHARSET_KSX1001)
                    NEXT_OUT(4)
                }
                WRITE2(code >> 8, code & 0xff)
                NEXT(1, 2)
            } else TRYMAP_ENC(gbcommon, code, c) {
                if (code & 0x8000) /* MSB set: GBK */
                    return 2;
                if (charset != CHARSET_GB2312) {
                    WRITE4(ESC, '$', '(', 'A')
                    STATE_SETG0(state, CHARSET_GB2312)
                    NEXT_OUT(4)
                }
                WRITE2(code >> 8, code & 0xff)
                NEXT(1, 2)
            } else if (c == 0xff3c) { /* FULL-WIDTH REVERSE SOLIDUS */
                code = 0x2140;
                goto jisx0208encode;
            } else {
                JISX0201_R_ENCODE(c, code)
                else {
                    /* There's no need to try to encode as ISO-8859-1 or
                     * ISO-8859-7 because JIS X 0212 includes them already.
                     */
                    return 1;
                }
                /* if (charset == CHARSET_JISX0201_R) : already checked */
                WRITE4(ESC, '(', 'J', code)
                STATE_SETG0(state, CHARSET_JISX0201_R)
                NEXT(1, 4)
            }
        }
    }

    return 0;
}

#define HAVE_DECODER_INIT
DECODER_INIT(iso2022_jp_2)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    STATE_SETG2(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_DECODER_RESET
DECODER_RESET(iso2022_jp_2)
{
    STATE_CLEARFLAG(state, F_SHIFTED)
    return 0;
}

DECODER(iso2022_jp_2)
{
  ISO2022_LOOP_BEGIN
    unsigned char    charset, c2;

    ISO2022_GETCHARSET(charset, c)

    if (charset & CHARSET_DOUBLEBYTE) {
        RESERVE_INBUF(2)
        RESERVE_OUTBUF(1)
        c2 = IN2;
        if (charset == CHARSET_JISX0208 || charset == CHARSET_JISX0208_O) {
            if (c == 0x21 && c2 == 0x40) /* FULL-WIDTH REVERSE SOLIDUS */
                **outbuf = 0xff3c;
            else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
            else return 2;
        } else if (charset == CHARSET_JISX0212) {
            TRYMAP_DEC(jisx0212, **outbuf, c, c2);
            else return 2;
        } else if (charset == CHARSET_KSX1001) {
            TRYMAP_DEC(ksx1001, **outbuf, c, c2);
            else return 2;
        } else if (charset == CHARSET_GB2312) {
            TRYMAP_DEC(gb2312, **outbuf, c, c2);
            else return 2;
        } else
            return MBERR_INTERNAL;
        NEXT(2, 1)
    } else if (charset == CHARSET_ASCII) {
        RESERVE_OUTBUF(1)
        OUT1(c)
        NEXT(1, 1)
    } else if (charset == CHARSET_JISX0201_R) {
        RESERVE_OUTBUF(1)
        JISX0201_R_DECODE(c, **outbuf)
        else
            return 1;
        NEXT(1, 1)
    } else
        return MBERR_INTERNAL;
  ISO2022_LOOP_END

  return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(iso2022_jp_2)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_DEC(jisx0212)
        IMPORTMAP_ENC(jisxcommon)
    MAPCLOSE()
    MAPOPEN(ko_KR)
        IMPORTMAP_ENC(cp949)
        IMPORTMAP_DEC(ksx1001)
    MAPCLOSE()
    MAPOPEN(zh_CN)
        IMPORTMAP_ENC(gbcommon)
        IMPORTMAP_DEC(gb2312)
    MAPCLOSE()
END_CODEC_REGISTRY(iso2022_jp_2)

--- NEW FILE: _iso2022_jp_3.c ---
/*
 * _iso2022_jp_3.c: the ISO-2022-JP-3 codec (JIS X 0213)
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _iso2022_jp_3.c,v 1.7 2003/12/31 05:46:55 perky Exp $
 */

#define USING_BINARY_PAIR_SEARCH
#define ISO2022_DESIGNATIONS    \
        CHARSET_ASCII, CHARSET_JISX0208, CHARSET_JISX0213_1, CHARSET_JISX0213_2
#define ISO2022_NO_SHIFT
#define ISO2022_USE_JISX0208EXT

#include "codeccommon.h"
#include "iso2022common.h"
#include "map_jisx0213_pairs.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)
DECMAP(jisx0212)
ENCMAP(jisx0213_bmp)
DECMAP(jisx0213_1_bmp)
DECMAP(jisx0213_2_bmp)
ENCMAP(jisx0213_emp)
DECMAP(jisx0213_1_emp)
DECMAP(jisx0213_2_emp)

#define EMPBASE     0x20000

#define HAVE_ENCODER_INIT
ENCODER_INIT(iso2022_jp_3)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_ENCODER_RESET
ENCODER_RESET(iso2022_jp_3)
{
    if (STATE_GETG0(state) != CHARSET_ASCII) {
        WRITE3(ESC, '(', 'B')
        STATE_SETG0(state, CHARSET_ASCII)
        NEXT_OUT(3)
    }
    return 0;
}

ENCODER(iso2022_jp_3)
{
  while (inleft > 0) {
    unsigned char charset;
    ucs4_t   c = IN1;
    DBCHAR   code;
    size_t   insize;

    if (c < 0x80) {
        switch (STATE_GETG0(state)) {
        case CHARSET_ASCII:
            WRITE1(c)
            NEXT(1, 1)
            break;
        default:
            WRITE4(ESC, '(', 'B', c)
            STATE_SETG0(state, CHARSET_ASCII)
            NEXT(1, 4)
            break;
        }
        if (c == '\n')
            STATE_CLEARFLAG(state, F_SHIFTED)
        continue;
    }

    DECODE_SURROGATE(c)
    insize = GET_INSIZE(c);

    if (c <= 0xffff) {
        TRYMAP_ENC(jisx0213_bmp, code, c) {
            if (code == MULTIC) {
                if (inleft < 2) {
                    if (flags & MBENC_FLUSH) {
                        code = find_pairencmap(c, 0, jisx0213_pairencmap,
                                            JISX0213_ENCPAIRS);
                        if (code == DBCINV)
                            return 1;
                    } else
                        return MBERR_TOOFEW;
                } else {
                    code = find_pairencmap(c, IN2,
                                jisx0213_pairencmap, JISX0213_ENCPAIRS);
                    if (code == DBCINV) {
                        code = find_pairencmap(c, 0, jisx0213_pairencmap,
                                            JISX0213_ENCPAIRS);
                        if (code == DBCINV)
                            return 1;
                    } else
                        insize = 2;
                }
            }
        } else TRYMAP_ENC(jisxcommon, code, c) {
            if (code & 0x8000)
                return 1; /* avoid JIS X 0212 codes */
        } else if (c == 0xff3c) /* F/W REVERSE SOLIDUS */
            code = 0x2140;
        else
            return 1;
    } else if (c >> 16 == EMPBASE >> 16) {
        TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);
        else return insize;
    } else
        return insize;

    charset = STATE_GETG0(state);
    if (code & 0x8000) { /* MSB set: Plane 2 */
        if (charset != CHARSET_JISX0213_2) {
            WRITE4(ESC, '$', '(', 'P')
            STATE_SETG0(state, CHARSET_JISX0213_2)
            NEXT_OUT(4)
        }
        WRITE2((code >> 8) & 0x7f, code & 0x7f)
    } else { /* MSB unset: Plane 1 */
        if (charset != CHARSET_JISX0213_1) {
            WRITE4(ESC, '$', '(', 'O')
            STATE_SETG0(state, CHARSET_JISX0213_1)
            NEXT_OUT(4)
        }
        WRITE2(code >> 8, code & 0xff)
    }
    NEXT(insize, 2)
  }

  return 0;
}

#define HAVE_DECODER_INIT
DECODER_INIT(iso2022_jp_3)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_DECODER_RESET
DECODER_RESET(iso2022_jp_3)
{
    STATE_CLEARFLAG(state, F_SHIFTED)
    return 0;
}

DECODER(iso2022_jp_3)
{
  ISO2022_LOOP_BEGIN
    unsigned char    charset, c2;
    ucs4_t           code;

    ISO2022_GETCHARSET(charset, c)

    if (charset & CHARSET_DOUBLEBYTE) {
        RESERVE_INBUF(2)
        RESERVE_OUTBUF(1)
        c2 = IN2;
        if (charset == CHARSET_JISX0213_1) {
            if (c == 0x21 && c2 == 0x40) **outbuf = 0xff3c;
            else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
            else TRYMAP_DEC(jisx0213_1_bmp, **outbuf, c, c2);
            else TRYMAP_DEC(jisx0213_1_emp, code, c, c2) {
                PUTUCS4(EMPBASE | code)
                NEXT_IN(2)
                continue;
            } else TRYMAP_DEC(jisx0213_pair, code, c, c2) {
                WRITE2(code >> 16, code & 0xffff)
                NEXT(2, 2)
                continue;
            } else return 2;
        } else if (charset == CHARSET_JISX0213_2) {
            TRYMAP_DEC(jisx0213_2_bmp, **outbuf, c, c2);
            else TRYMAP_DEC(jisx0213_2_emp, code, c, c2) {
                PUTUCS4(EMPBASE | code)
                NEXT_IN(2)
                continue;
            } else return 2;
        } else
            return MBERR_INTERNAL;
        NEXT(2, 1)
    } else if (charset == CHARSET_ASCII) {
        RESERVE_OUTBUF(1)
        OUT1(c)
        NEXT(1, 1)
    } else
        return MBERR_INTERNAL;
  ISO2022_LOOP_END

  return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(iso2022_jp_3)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_DEC(jisx0212)
        IMPORTMAP_ENC(jisxcommon)
        IMPORTMAP_ENC(jisx0213_bmp)
        IMPORTMAP_DEC(jisx0213_1_bmp)
        IMPORTMAP_DEC(jisx0213_2_bmp)
        IMPORTMAP_ENC(jisx0213_emp)
        IMPORTMAP_DEC(jisx0213_1_emp)
        IMPORTMAP_DEC(jisx0213_2_emp)
    MAPCLOSE()
END_CODEC_REGISTRY(iso2022_jp_3)

--- NEW FILE: _iso2022_jp_ext.c ---
/*
 * _iso2022_jp_ext.c: the ISO-2022-JP-EXT codec (RFC2237 + alpha)
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _iso2022_jp_ext.c,v 1.3 2003/12/31 05:46:55 perky Exp $
 */

#define ISO2022_DESIGNATIONS \
        CHARSET_ASCII, CHARSET_JISX0201_R, CHARSET_JISX0201_K,  \
        CHARSET_JISX0208, CHARSET_JISX0208_O, CHARSET_JISX0212
#define ISO2022_NO_SHIFT
#define ISO2022_USE_JISX0208EXT

#include "codeccommon.h"
#include "iso2022common.h"
#include "alg_jisx0201.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)
DECMAP(jisx0212)

#define HAVE_ENCODER_INIT
ENCODER_INIT(iso2022_jp_ext)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_ENCODER_RESET
ENCODER_RESET(iso2022_jp_ext)
{
    if (STATE_GETG0(state) != CHARSET_ASCII) {
        RESERVE_OUTBUF(3)
        WRITE3(ESC, '(', 'B')
        STATE_SETG0(state, CHARSET_ASCII)
        NEXT_OUT(3)
    }
    return 0;
}

ENCODER(iso2022_jp_ext)
{
    while (inleft > 0) {
        Py_UNICODE  c = **inbuf;
        DBCHAR      code;

        if (c < 0x80) {
            switch (STATE_GETG0(state)) {
            case CHARSET_ASCII:
                WRITE1(c)
                NEXT(1, 1)
                break;
            case CHARSET_JISX0201_R:
                JISX0201_R_ENCODE(c, code)
                else { /* FALLTHROUGH (yay!) */
            default:
                    WRITE3(ESC, '(', 'B')
                    NEXT_OUT(3)
                    STATE_SETG0(state, CHARSET_ASCII)
                    code = c;
                }
                WRITE1(code)
                NEXT(1, 1)
                break;
            }
            if (c == '\n')
                STATE_CLEARFLAG(state, F_SHIFTED)
        }
        else UCS4INVALID(c)
        else {
            unsigned char    charset;

            charset = STATE_GETG0(state);
            if (charset == CHARSET_JISX0201_R) {
                code = DBCINV;
                JISX0201_R_ENCODE(c, code)
                if (code != DBCINV) {
                    WRITE1(code)
                    NEXT(1, 1)
                    continue;
                }
            }

            TRYMAP_ENC(jisxcommon, code, c) {
                if (code & 0x8000) { /* MSB set: JIS X 0212 */
                    if (charset != CHARSET_JISX0212) {
                        WRITE4(ESC, '$', '(', 'D')
                        STATE_SETG0(state, CHARSET_JISX0212)
                        NEXT_OUT(4)
                    }
                    WRITE2((code >> 8) & 0x7f, code & 0x7f)
                } else { /* MSB unset: JIS X 0208 */
jisx0208encode:     if (charset != CHARSET_JISX0208) {
                        WRITE3(ESC, '$', 'B')
                        STATE_SETG0(state, CHARSET_JISX0208)
                        NEXT_OUT(3)
                    }
                    WRITE2(code >> 8, code & 0xff)
                }
                NEXT(1, 2)
            } else if (c == 0xff3c) { /* FULL-WIDTH REVERSE SOLIDUS */
                code = 0x2140;
                goto jisx0208encode;
            } else {
                JISX0201_ENCODE(c, code)
                else
                    return 1;

                if (code < 0x80) { /* JIS X 0201 Roman */
                    /* if (charset == CHARSET_JISX0201_R) : already checked */
                    WRITE4(ESC, '(', 'J', code)
                    STATE_SETG0(state, CHARSET_JISX0201_R)
                    NEXT(1, 4)
                } else { /* JIS X 0201 Katakana */
                    if (charset != CHARSET_JISX0201_K) {
                        WRITE3(ESC, '(', 'I')
                        STATE_SETG0(state, CHARSET_JISX0201_K)
                        NEXT_OUT(3)
                    }
                    WRITE1(code - 0x80)
                    NEXT(1, 1)
                }
            }
        }
    }

    return 0;
}

#define HAVE_DECODER_INIT
DECODER_INIT(iso2022_jp_ext)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_DECODER_RESET
DECODER_RESET(iso2022_jp_ext)
{
    STATE_CLEARFLAG(state, F_SHIFTED)
    return 0;
}

DECODER(iso2022_jp_ext)
{
  ISO2022_LOOP_BEGIN
    unsigned char    charset, c2;

    ISO2022_GETCHARSET(charset, c)

    if (charset & CHARSET_DOUBLEBYTE) {
        RESERVE_INBUF(2)
        RESERVE_OUTBUF(1)
        c2 = IN2;
        if (charset == CHARSET_JISX0208 || charset == CHARSET_JISX0208_O) {
            if (c == 0x21 && c2 == 0x40) /* FULL-WIDTH REVERSE SOLIDUS */
                **outbuf = 0xff3c;
            else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
            else return 2;
        } else if (charset == CHARSET_JISX0212) {
            TRYMAP_DEC(jisx0212, **outbuf, c, c2);
            else return 2;
        } else
            return MBERR_INTERNAL;
        NEXT(2, 1)
    } else if (charset == CHARSET_ASCII) {
        RESERVE_OUTBUF(1)
        OUT1(c)
        NEXT(1, 1)
    } else if (charset == CHARSET_JISX0201_R) {
        RESERVE_OUTBUF(1)
        JISX0201_R_DECODE(c, **outbuf)
        else
            return 1;
        NEXT(1, 1)
    } else if (charset == CHARSET_JISX0201_K) {
        RESERVE_OUTBUF(1)
        JISX0201_K_DECODE(c ^ 0x80, **outbuf)
        else
            return 1;
        NEXT(1, 1)
    } else
        return MBERR_INTERNAL;
  ISO2022_LOOP_END

  return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(iso2022_jp_ext)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_DEC(jisx0212)
        IMPORTMAP_ENC(jisxcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(iso2022_jp_ext)

--- NEW FILE: _iso2022_kr.c ---
/*
 * _iso2022_kr.c: the ISO-2022-KR codec (RFC1557)
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _iso2022_kr.c,v 1.3 2003/12/31 05:46:55 perky Exp $
 */

#define ISO2022_DESIGNATIONS \
        CHARSET_ASCII, CHARSET_KSX1001

#include "codeccommon.h"
#include "iso2022common.h"

ENCMAP(cp949)
DECMAP(ksx1001)

#define HAVE_ENCODER_INIT
ENCODER_INIT(iso2022_kr)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_ENCODER_RESET
ENCODER_RESET(iso2022_kr)
{
    if (STATE_GETFLAG(state, F_SHIFTED)) {
        RESERVE_OUTBUF(1)
        OUT1(SI)
        NEXT_OUT(1)
        STATE_CLEARFLAG(state, F_SHIFTED)
    }
    return 0;
}

ENCODER(iso2022_kr)
{
    while (inleft > 0) {
        Py_UNICODE  c = **inbuf;
        DBCHAR      code;

        if (c < 0x80) {
            if (STATE_GETFLAG(state, F_SHIFTED)) {
                WRITE2(SI, c)
                STATE_CLEARFLAG(state, F_SHIFTED)
                NEXT(1, 2)
            } else {
                WRITE1(c)
                NEXT(1, 1)
            }
            if (c == '\n')
                STATE_CLEARFLAG(state, F_SHIFTED)
        } else UCS4INVALID(c)
        else {
            if (STATE_GETG1(state) != CHARSET_KSX1001) {
                WRITE4(ESC, '$', ')', 'C')
                STATE_SETG1(state, CHARSET_KSX1001)
                NEXT_OUT(4)
            }

            if (!STATE_GETFLAG(state, F_SHIFTED)) {
                WRITE1(SO)
                STATE_SETFLAG(state, F_SHIFTED)
                NEXT_OUT(1)
            }

            TRYMAP_ENC(cp949, code, c) {
                if (code & 0x8000) /* MSB set: CP949 */
                    return 1;
                WRITE2(code >> 8, code & 0xff)
                NEXT(1, 2)
            } else
                return 1;
        }
    }

    return 0;
}

#define HAVE_DECODER_INIT
DECODER_INIT(iso2022_kr)
{
    STATE_CLEARFLAGS(state)
    STATE_SETG0(state, CHARSET_ASCII)
    STATE_SETG1(state, CHARSET_ASCII)
    return 0;
}

#define HAVE_DECODER_RESET
DECODER_RESET(iso2022_kr)
{
    STATE_CLEARFLAG(state, F_SHIFTED)
    return 0;
}

DECODER(iso2022_kr)
{
  ISO2022_LOOP_BEGIN
    unsigned char    charset, c2;

    ISO2022_GETCHARSET(charset, c)

    if (charset & CHARSET_DOUBLEBYTE) {
        /* all double byte character sets are in KS X 1001 here */
        RESERVE_INBUF(2)
        RESERVE_OUTBUF(1)
        c2 = IN2;
        if (c2 >= 0x80)
            return 1;
        TRYMAP_DEC(ksx1001, **outbuf, c, c2) {
            NEXT(2, 1)
        } else
            return 2;
    } else {
        RESERVE_OUTBUF(1)
        OUT1(c);
        NEXT(1, 1)
    }
  ISO2022_LOOP_END
  return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(iso2022_kr)
    MAPOPEN(ko_KR)
        IMPORTMAP_DEC(ksx1001)
        IMPORTMAP_ENC(cp949)
    MAPCLOSE()
END_CODEC_REGISTRY(iso2022_kr)

--- NEW FILE: _johab.c ---
/*
 * _johab.c: the Johab codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _johab.c,v 1.3 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"

ENCMAP(cp949)
DECMAP(ksx1001)

static const unsigned char u2johabidx_choseong[32] = {
                0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    0x10, 0x11, 0x12, 0x13, 0x14,
};
static const unsigned char u2johabidx_jungseong[32] = {
                      0x03, 0x04, 0x05, 0x06, 0x07,
                0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
                0x1a, 0x1b, 0x1c, 0x1d,
};
static const unsigned char u2johabidx_jongseong[32] = {
          0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    0x10, 0x11,       0x13, 0x14, 0x15, 0x16, 0x17,
    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
};
static const DBCHAR u2johabjamo[] = {
            0x8841, 0x8c41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441,
    0x9841, 0x9c41, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f,
    0x8450, 0xa041, 0xa441, 0xa841, 0x8454, 0xac41, 0xb041, 0xb441,
    0xb841, 0xbc41, 0xc041, 0xc441, 0xc841, 0xcc41, 0xd041, 0x8461,
    0x8481, 0x84a1, 0x84c1, 0x84e1, 0x8541, 0x8561, 0x8581, 0x85a1,
    0x85c1, 0x85e1, 0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1,
    0x8741, 0x8761, 0x8781, 0x87a1,
};

ENCODER(johab)
{
    while (inleft > 0) {
        Py_UNICODE  c = IN1;
        DBCHAR      code;

        if (c < 0x80) {
            WRITE1(c)
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)

        RESERVE_OUTBUF(2)

        if (c >= 0xac00 && c <= 0xd7a3) {
            c -= 0xac00;
            code = 0x8000 |
                   (u2johabidx_choseong[c / 588] << 10) |
                   (u2johabidx_jungseong[(c / 28) % 21] << 5) |
                    u2johabidx_jongseong[c % 28];
        } else if (c >= 0x3131 && c <= 0x3163)
            code = u2johabjamo[c - 0x3131];
        else TRYMAP_ENC(cp949, code, c) {
            unsigned char    c1, c2, t2;
            unsigned short   t1;

            assert((code & 0x8000) == 0);
            c1 = code >> 8;
            c2 = code & 0xff;
            if (((c1 >= 0x21 && c1 <= 0x2c) || (c1 >= 0x4a && c1 <= 0x7d))
                    && (c2 >= 0x21 && c2 <= 0x7e)) {
                t1 = (c1 < 0x4a ? (c1 - 0x21 + 0x1b2) : (c1 - 0x21 + 0x197));
                t2 = ((t1 & 1) ? 0x5e : 0) + (c2 - 0x21);
                OUT1(t1 >> 1)
                OUT2(t2 < 0x4e ? t2 + 0x31 : t2 + 0x43)
                NEXT(1, 2)
                continue;
            } else
                return 1;
        } else
            return 1;

        OUT1(code >> 8)
        OUT2(code & 0xff)
        NEXT(1, 2)
    }

    return 0;
}

#define FILL 0xfd
#define NONE 0xff

static const unsigned char johabidx_choseong[32] = {
    NONE, FILL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
    0x0e, 0x0f, 0x10, 0x11, 0x12, NONE, NONE, NONE,
    NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
};
static const unsigned char johabidx_jungseong[32] = {
    NONE, NONE, FILL, 0x00, 0x01, 0x02, 0x03, 0x04,
    NONE, NONE, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
    NONE, NONE, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
    NONE, NONE, 0x11, 0x12, 0x13, 0x14, NONE, NONE,
};
static const unsigned char johabidx_jongseong[32] = {
    NONE, FILL, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
    0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
    0x0f, 0x10, NONE, 0x11, 0x12, 0x13, 0x14, 0x15,
    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, NONE, NONE,
};

static const unsigned char johabjamo_choseong[32] = {
    NONE, FILL, 0x31, 0x32, 0x34, 0x37, 0x38, 0x39,
    0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49,
    0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE, NONE, NONE,
    NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
};
static const unsigned char johabjamo_jungseong[32] = {
    NONE, NONE, FILL, 0x4f, 0x50, 0x51, 0x52, 0x53,
    NONE, NONE, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
    NONE, NONE, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
    NONE, NONE, 0x60, 0x61, 0x62, 0x63, NONE, NONE,
};
static const unsigned char johabjamo_jongseong[32] = {
    NONE, FILL, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
    0x37, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
    0x40, 0x41, NONE, 0x42, 0x44, 0x45, 0x46, 0x47,
    0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE, NONE,
};

DECODER(johab)
{
    while (inleft > 0) {
        unsigned char    c = IN1, c2;

        RESERVE_OUTBUF(1)

        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }

        RESERVE_INBUF(2)
        c2 = IN2;

        if (c < 0xd8) {
            /* johab hangul */
            unsigned char    c_cho, c_jung, c_jong;
            unsigned char    i_cho, i_jung, i_jong;

            c_cho = (c >> 2) & 0x1f;
            c_jung = ((c << 3) | c2 >> 5) & 0x1f;
            c_jong = c2 & 0x1f;

            i_cho = johabidx_choseong[c_cho];
            i_jung = johabidx_jungseong[c_jung];
            i_jong = johabidx_jongseong[c_jong];

            if (i_cho == NONE || i_jung == NONE || i_jong == NONE)
                return 2;

            /* we don't use U+1100 hangul jamo yet. */
            if (i_cho == FILL) {
                if (i_jung == FILL) {
                    if (i_jong == FILL)
                        OUT1(0x3000)
                    else
                        OUT1(0x3100 | johabjamo_jongseong[c_jong])
                } else {
                    if (i_jong == FILL)
                        OUT1(0x3100 | johabjamo_jungseong[c_jung])
                    else
                        return 2;
                }
            } else {
                if (i_jung == FILL) {
                    if (i_jong == FILL)
                        OUT1(0x3100 | johabjamo_choseong[c_cho])
                    else
                        return 2;
                } else
                    OUT1(0xac00 +
                         i_cho * 588 +
                         i_jung * 28 +
                         (i_jong == FILL ? 0 : i_jong))
            }
            NEXT(2, 1)
        } else {
            /* KS X 1001 except hangul jamos and syllables */
            if (c == 0xdf || c > 0xf9 ||
                    c2 < 0x31 || (c2 >= 0x80 && c2 < 0x91) ||
                    (c2 & 0x7f) == 0x7f ||
                    (c == 0xda && (c2 >= 0xa1 && c2 <= 0xd3)))
                return 2;
            else {
                unsigned char    t1, t2;

                t1 = (c < 0xe0 ? 2 * (c - 0xd9) : 2 * c - 0x197);
                t2 = (c2 < 0x91 ? c2 - 0x31 : c2 - 0x43);
                t1 = t1 + (t2 < 0x5e ? 0 : 1) + 0x21;
                t2 = (t2 < 0x5e ? t2 : t2 - 0x5e) + 0x21;

                TRYMAP_DEC(ksx1001, **outbuf, t1, t2);
                else return 2;
                NEXT(2, 1)
            }
        }
    }

    return 0;
}
#undef NONE
#undef FILL

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(johab)
    MAPOPEN(ko_KR)
        IMPORTMAP_DEC(ksx1001)
        IMPORTMAP_ENC(cp949)
    MAPCLOSE()
END_CODEC_REGISTRY(johab)

--- NEW FILE: _shift_jis.c ---
/*
 * _shift_jis.c: the SHIFT-JIS codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _shift_jis.c,v 1.4 2003/12/31 05:46:55 perky Exp $
 */

#include "codeccommon.h"
#include "alg_jisx0201.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)

ENCODER(shift_jis)
{
    while (inleft > 0) {
        Py_UNICODE       c = IN1;
        DBCHAR           code;
        unsigned char    c1, c2;

#ifdef STRICT_BUILD
        JISX0201_R_ENCODE(c, code)
#else
        if (c < 0x80) code = c;
        else if (c == 0x00a5) code = 0x5c; /* YEN SIGN */
        else if (c == 0x203e) code = 0x7e; /* OVERLINE */
#endif
        else JISX0201_K_ENCODE(c, code)
        else UCS4INVALID(c)
        else code = NOCHAR;

        if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
            RESERVE_OUTBUF(1)

            OUT1(code)
            NEXT(1, 1)
            continue;
        }

        RESERVE_OUTBUF(2)

        if (code == NOCHAR) {
            TRYMAP_ENC(jisxcommon, code, c);
#ifndef STRICT_BUILD
            else if (c == 0xff3c)
                code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
#endif
            else
                return 1;

            if (code & 0x8000) /* MSB set: JIS X 0212 */
                return 1;
        }

        c1 = code >> 8;
        c2 = code & 0xff;
        c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
        c1 = (c1 - 0x21) >> 1;
        OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
        OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
        NEXT(1, 2)
    }

    return 0;
}

DECODER(shift_jis)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)

#ifdef STRICT_BUILD
        JISX0201_R_DECODE(c, **outbuf)
#else
        if (c < 0x80) **outbuf = c;
#endif
        else JISX0201_K_DECODE(c, **outbuf)
        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)) {
            unsigned char    c1, c2;

            RESERVE_INBUF(2)
            c2 = IN2;
            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
                return 2;

            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);
            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;

#ifndef STRICT_BUILD
            if (c1 == 0x21 && c2 == 0x40) {
                /* FULL-WIDTH REVERSE SOLIDUS */
                OUT1(0xff3c)
                NEXT(2, 1)
                continue;
            }
#endif
            TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
                NEXT(2, 1)
                continue;
            } else
                return 2;
        } else
            return 2;

        NEXT(1, 1) /* JIS X 0201 */
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(shift_jis)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_ENC(jisxcommon)
    MAPCLOSE()
END_CODEC_REGISTRY(shift_jis)

--- NEW FILE: _shift_jisx0213.c ---
/*
 * _shift_jisx0213.c: the SHIFT-JISX0213 codec
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: _shift_jisx0213.c,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#define USING_BINARY_PAIR_SEARCH
#include "codeccommon.h"
#include "alg_jisx0201.h"
#include "map_jisx0213_pairs.h"

ENCMAP(jisxcommon)
DECMAP(jisx0208)
ENCMAP(jisx0213_bmp)
DECMAP(jisx0213_1_bmp)
DECMAP(jisx0213_2_bmp)
ENCMAP(jisx0213_emp)
DECMAP(jisx0213_1_emp)
DECMAP(jisx0213_2_emp)

#define EMPBASE 0x20000

ENCODER(shift_jisx0213)
{
  while (inleft > 0) {
    ucs4_t   c = IN1;
    DBCHAR   code = NOCHAR;
    int      c1, c2;
    size_t   insize;

    JISX0201_ENCODE(c, code)
    else DECODE_SURROGATE(c)

    if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
        WRITE1(code)
        NEXT(1, 1)
        continue;
    }

    RESERVE_OUTBUF(2)
    insize = GET_INSIZE(c);

    if (code == NOCHAR) {
        if (c <= 0xffff) {
            TRYMAP_ENC(jisx0213_bmp, code, c) {
                if (code == MULTIC) {
                    if (inleft < 2) {
                        if (flags & MBENC_FLUSH) {
                            code = find_pairencmap(c, 0, jisx0213_pairencmap,
                                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                        } else
                            return MBERR_TOOFEW;
                    } else {
                        code = find_pairencmap(c, IN2,
                                    jisx0213_pairencmap, JISX0213_ENCPAIRS);
                        if (code == DBCINV) {
                            code = find_pairencmap(c, 0, jisx0213_pairencmap,
                                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                        } else
                            insize = 2;
                    }
                }
            } else TRYMAP_ENC(jisxcommon, code, c) {
                if (code & 0x8000)
                    return 1; /* abandon JIS X 0212 codes */
            } else return 1;
        } else if (c >> 16 == EMPBASE >> 16) {
            TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);
            else return insize;
        } else
            return insize;
    }

    c1 = code >> 8;
    c2 = (code & 0xff) - 0x21;

    if (c1 & 0x80) { /* Plane 2 */
        if (c1 >= 0xee) c1 -= 0x87;
        else if (c1 >= 0xac || c1 == 0xa8) c1 -= 0x49;
        else c1 -= 0x43;
    } else /* Plane 1 */
        c1 -= 0x21;

    if (c1 & 1) c2 += 0x5e;
    c1 >>= 1;
    OUT1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
    OUT2(c2 + (c2 < 0x3f ? 0x40 : 0x41))

    NEXT(insize, 2)
  }

  return 0;
}

DECODER(shift_jisx0213)
{
    while (inleft > 0) {
        unsigned char    c = IN1;

        RESERVE_OUTBUF(1)
        JISX0201_DECODE(c, **outbuf)
        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)) {
            unsigned char    c1, c2 = IN2;
            ucs4_t           code;

            RESERVE_INBUF(2)
            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
                return 2;

            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));
            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;

            if (c1 < 0x5e) { /* Plane 1 */
                c1 += 0x21;
                TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
                    NEXT_OUT(1)
                } else TRYMAP_DEC(jisx0213_1_bmp, **outbuf, c1, c2) {
                    NEXT_OUT(1)
                } else TRYMAP_DEC(jisx0213_1_emp, code, c1, c2) {
                    PUTUCS4(EMPBASE | code)
                } else TRYMAP_DEC(jisx0213_pair, code, c1, c2) {
                    WRITE2(code >> 16, code & 0xffff)
                    NEXT_OUT(2)
                } else
                    return 2;
                NEXT_IN(2)
            } else { /* Plane 2 */
                if (c1 >= 0x67) c1 += 0x07;
                else if (c1 >= 0x63 || c1 == 0x5f) c1 -= 0x37;
                else c1 -= 0x3d;

                TRYMAP_DEC(jisx0213_2_bmp, **outbuf, c1, c2) {
                    NEXT_OUT(1)
                } else TRYMAP_DEC(jisx0213_2_emp, code, c1, c2) {
                    PUTUCS4(EMPBASE | code)
                } else
                    return 2;
                NEXT_IN(2)
            }
            continue;
        } else
            return 2;

        NEXT(1, 1) /* JIS X 0201 */
    }

    return 0;
}

#include "codecentry.h"
BEGIN_CODEC_REGISTRY(shift_jisx0213)
    MAPOPEN(ja_JP)
        IMPORTMAP_DEC(jisx0208)
        IMPORTMAP_ENC(jisxcommon)
        IMPORTMAP_ENC(jisx0213_bmp)
        IMPORTMAP_DEC(jisx0213_1_bmp)
        IMPORTMAP_DEC(jisx0213_2_bmp)
        IMPORTMAP_ENC(jisx0213_emp)
        IMPORTMAP_DEC(jisx0213_1_emp)
        IMPORTMAP_DEC(jisx0213_2_emp)
    MAPCLOSE()
END_CODEC_REGISTRY(shift_jisx0213)

--- NEW FILE: alg_iso8859_1.h ---
/*
 * alg_iso8859_1.c: Encoder/Decoder macro for ISO8859-1
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: alg_iso8859_1.h,v 1.3 2003/12/31 05:46:55 perky Exp $
 */

#define ISO8859_1_ENCODE(c, assi)                               \
    if ((c) <= 0xff) (assi) = (c);

#define ISO8859_1_DECODE(c, assi)                               \
    if (1/*(c) <= 0xff*/) (assi) = (c);

--- NEW FILE: alg_iso8859_7.h ---
/*
 * alg_iso8859_7.c: Encoder/Decoder macro for ISO8859-7
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: alg_iso8859_7.h,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

/*
 * 0x2888fbc9 and 0xbffffd77 are magic number that indicates availability
 * of mapping for each differences. (0 and 0x2d0)
 */

#define ISO8859_7_ENCODE(c, assi)                               \
    if ((c) <= 0xa0) (assi) = (c);                              \
    else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0))))  \
        (assi) = (c);                                           \
    else if ((c) >= 0x0384 && (c) <= 0x03ce && ((c) >= 0x03a4 ||\
             (0xbffffd77L & (1L << ((c)-0x0384)))))             \
        (assi) = (c) - 0x02d0;                                  \
    else if ((c)>>1 == 0x2018>>1) (assi) = (c) - 0x1f77;        \
    else if ((c) == 0x2015) (assi) = 0xaf;

#define ISO8859_7_DECODE(c, assi)                               \
    if ((c) < 0xa0) (assi) = (c);                               \
    else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0))))  \
        (assi) = (c);                                           \
    else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 ||      \
             (0xbffffd77L & (1L << ((c)-0xb4)))))               \
        (assi) = 0x02d0 + (c);                                  \
    else if ((c) == 0xa1) (assi) = 0x2018;                      \
    else if ((c) == 0xa2) (assi) = 0x2019;                      \
    else if ((c) == 0xaf) (assi) = 0x2015;

--- NEW FILE: alg_jisx0201.h ---
/* $CJKCodecs: alg_jisx0201.h,v 1.2 2003/11/27 16:42:20 perky Exp $ */

#define JISX0201_R_ENCODE(c, assi)              \
    if ((c) < 0x80 && (c) != 0x5c && (c) != 0x7e) \
        (assi) = (c);                           \
    else if ((c) == 0x00a5) (assi) = 0x5c;      \
    else if ((c) == 0x203e) (assi) = 0x7e;
#define JISX0201_K_ENCODE(c, assi)              \
    if ((c) >= 0xff61 && (c) <= 0xff9f)         \
        (assi) = (c) - 0xfec0;
#define JISX0201_ENCODE(c, assi)                \
    JISX0201_R_ENCODE(c, assi)                  \
    else JISX0201_K_ENCODE(c, assi)

#define JISX0201_R_DECODE(c, assi)              \
    if ((c) < 0x5c) (assi) = (c);               \
    else if ((c) == 0x5c) (assi) = 0x00a5;      \
    else if ((c) < 0x7e) (assi) = (c);          \
    else if ((c) == 0x7e) (assi) = 0x203e;      \
    else if ((c) == 0x7f) (assi) = 0x7f;
#define JISX0201_K_DECODE(c, assi)              \
    if ((c) >= 0xa1 && (c) <= 0xdf)             \
        (assi) = 0xfec0 + (c);
#define JISX0201_DECODE(c, assi)                \
    JISX0201_R_DECODE(c, assi)                  \
    else JISX0201_K_DECODE(c, assi)


--- NEW FILE: cjkcommon.h ---
/*
 * cjkcommon.h: Common Constants and Macroes for CJK Character Sets
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: cjkcommon.h,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#ifndef _CJKCOMMON_H_
#define _CJKCOMMON_H_

#ifdef uint32_t
typedef uint32_t ucs4_t;
#else
typedef unsigned int ucs4_t;
#endif

#ifdef uint16_t
typedef uint16_t ucs2_t, DBCHAR;
#else
typedef unsigned short ucs2_t, DBCHAR;
#endif

#define UNIINV  Py_UNICODE_REPLACEMENT_CHARACTER
#define NOCHAR  0xFFFF
#define MULTIC  0xFFFE
#define DBCINV  0xFFFD

struct dbcs_index {
    const ucs2_t   *map;
    unsigned char   bottom, top;
};
typedef struct dbcs_index decode_map;

struct widedbcs_index {
    const ucs4_t   *map;
    unsigned char   bottom, top;
};
typedef struct widedbcs_index widedecode_map;

struct unim_index {
    const DBCHAR   *map;
    unsigned char   bottom, top;
};
typedef struct unim_index encode_map;

struct dbcs_map {
    const char *charset;
    const struct unim_index *encmap;
    const struct dbcs_index *decmap;
};

struct pair_encodemap {
    ucs4_t   uniseq;
    DBCHAR   code;
};

#endif

--- NEW FILE: codeccommon.h ---
/*
 * codeccommon.h: Common Codec Routines
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: codeccommon.h,v 1.4 2003/12/31 05:46:55 perky Exp $
 */

#include "Python.h"
#include "multibytecodec.h"


#ifdef STRICT_BUILD
#define STRICT_SUFX     "_strict"
#else
#define STRICT_SUFX
#endif

#define ENCMAP(encoding)                                    \
    const static encode_map *encoding##encmap;
#define DECMAP(encoding)                                    \
    const static decode_map *encoding##decmap;

#define ENCODER_INIT(encoding)                              \
    static int encoding##_encode_init(                      \
        MultibyteCodec_State *state)
#define ENCODER(encoding)                                   \
    static int encoding##_encode(                           \
        MultibyteCodec_State *state,                        \
        const Py_UNICODE **inbuf, size_t inleft,            \
        unsigned char **outbuf, size_t outleft, int flags)
#define ENCODER_RESET(encoding)                             \
    static int encoding##_encode_reset(                     \
        MultibyteCodec_State *state,                        \
        unsigned char **outbuf, size_t outleft)

#define DECODER_INIT(encoding)                              \
    static int encoding##_decode_init(                      \
        MultibyteCodec_State *state)
#define DECODER(encoding)                                   \
    static int encoding##_decode(                           \
        MultibyteCodec_State *state,                        \
        const unsigned char **inbuf, size_t inleft,         \
        Py_UNICODE **outbuf, size_t outleft)
#define DECODER_RESET(encoding)                             \
    static int encoding##_decode_reset(                     \
        MultibyteCodec_State *state)

#if Py_UNICODE_SIZE == 4
#define UCS4INVALID(code)                                   \
    if ((code) > 0xFFFF)                                    \
        return 1;
#else
#define UCS4INVALID(code)                                   \
    if (0) ;
#endif

#define NEXT_IN(i)                                          \
    (*inbuf) += (i);                                        \
    (inleft) -= (i);
#define NEXT_OUT(o)                                         \
    (*outbuf) += (o);                                       \
    (outleft) -= (o);
#define NEXT(i, o)  NEXT_IN(i) NEXT_OUT(o)

#define RESERVE_INBUF(n)                                    \
    if (inleft < (n))                                       \
        return MBERR_TOOFEW;
#define RESERVE_OUTBUF(n)                                   \
    if (outleft < (n))                                      \
        return MBERR_TOOSMALL;

#define IN1 ((*inbuf)[0])
#define IN2 ((*inbuf)[1])
#define IN3 ((*inbuf)[2])
#define IN4 ((*inbuf)[3])

#define OUT1(c) ((*outbuf)[0]) = (c);
#define OUT2(c) ((*outbuf)[1]) = (c);
#define OUT3(c) ((*outbuf)[2]) = (c);
#define OUT4(c) ((*outbuf)[3]) = (c);

#define WRITE1(c1)                                          \
    RESERVE_OUTBUF(1)                                       \
    (*outbuf)[0] = (c1);
#define WRITE2(c1, c2)                                      \
    RESERVE_OUTBUF(2)                                       \
    (*outbuf)[0] = (c1);                                    \
    (*outbuf)[1] = (c2);
#define WRITE3(c1, c2, c3)                                  \
    RESERVE_OUTBUF(3)                                       \
    (*outbuf)[0] = (c1);                                    \
    (*outbuf)[1] = (c2);                                    \
    (*outbuf)[2] = (c3);
#define WRITE4(c1, c2, c3, c4)                              \
    RESERVE_OUTBUF(4)                                       \
    (*outbuf)[0] = (c1);                                    \
    (*outbuf)[1] = (c2);                                    \
    (*outbuf)[2] = (c3);                                    \
    (*outbuf)[3] = (c4);

#if Py_UNICODE_SIZE == 2
# define PUTUCS4(c)                                         \
    RESERVE_OUTBUF(2)                                       \
    (*outbuf)[0] = 0xd800 + (((c) - 0x10000) >> 10);        \
    (*outbuf)[1] = 0xdc00 + (((c) - 0x10000) & 0x3ff);      \
    NEXT_OUT(2)
#else
# define PUTUCS4(c)                                         \
    RESERVE_OUTBUF(1)                                       \
    **outbuf = (Py_UNICODE)(c);                             \
    NEXT_OUT(1)
#endif

#define _TRYMAP_ENC(m, assi, val)                           \
    if ((m)->map != NULL && (val) >= (m)->bottom &&         \
        (val)<= (m)->top && ((assi) = (m)->map[(val) -      \
            (m)->bottom]) != NOCHAR)
#define TRYMAP_ENC(charset, assi, uni)                      \
    _TRYMAP_ENC(&charset##encmap[(uni) >> 8], assi, (uni) & 0xff)
#define _TRYMAP_DEC(m, assi, val)                           \
    if ((m)->map != NULL && (val) >= (m)->bottom &&         \
        (val)<= (m)->top && ((assi) = (m)->map[(val) -      \
            (m)->bottom]) != UNIINV)
#define TRYMAP_DEC(charset, assi, c1, c2)                   \
    _TRYMAP_DEC(&charset##decmap[c1], assi, c2)

#if Py_UNICODE_SIZE == 2
#define DECODE_SURROGATE(c)                                 \
    if (c >> 10 == 0xd800 >> 10) { /* high surrogate */     \
        RESERVE_INBUF(2)                                    \
        if (IN2 >> 10 == 0xdc00 >> 10) { /* low surrogate */ \
            c = 0x10000 + ((ucs4_t)(c - 0xd800) << 10) +    \
                          ((ucs4_t)(IN2) - 0xdc00);         \
        }                                                   \
    }
#define GET_INSIZE(c)   ((c) > 0xffff ? 2 : 1)
#else
#define DECODE_SURROGATE(c) {;}
#define GET_INSIZE(c)   1
#endif

#ifdef USING_BINARY_PAIR_SEARCH
static DBCHAR find_pairencmap(ucs2_t , ucs2_t, struct pair_encodemap *, int);
#endif

--- NEW FILE: codecentry.h ---
/*
 * codecentry.h: Common Codec Entry Routines
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: codecentry.h,v 1.5 2004/01/17 11:26:10 perky Exp $
 */

#ifdef HAVE_ENCODER_INIT
#define ENCODER_INIT_FUNC(encoding)     encoding##_encode_init
#else
#define ENCODER_INIT_FUNC(encoding)     NULL
#endif

#ifdef HAVE_ENCODER_RESET
#define ENCODER_RESET_FUNC(encoding)    encoding##_encode_reset
#else
#define ENCODER_RESET_FUNC(encoding)    NULL
#endif

#ifdef HAVE_DECODER_INIT
#define DECODER_INIT_FUNC(encoding)     encoding##_decode_init
#else
#define DECODER_INIT_FUNC(encoding)     NULL
#endif

#ifdef HAVE_DECODER_RESET
#define DECODER_RESET_FUNC(encoding)    encoding##_decode_reset
#else
#define DECODER_RESET_FUNC(encoding)    NULL
#endif

#ifdef STRICT_BUILD
#define BEGIN_CODEC_REGISTRY(encoding)                      \
    __BEGIN_CODEC_REGISTRY(encoding, init_codecs_##encoding##_strict)
#else
#define BEGIN_CODEC_REGISTRY(encoding)                      \
    __BEGIN_CODEC_REGISTRY(encoding, init_codecs_##encoding)
#endif

#define __BEGIN_CODEC_REGISTRY(encoding, initname)          \
    static MultibyteCodec __codec = {                       \
        #encoding STRICT_SUFX,                              \
        encoding##_encode,                                  \
        ENCODER_INIT_FUNC(encoding),                        \
        ENCODER_RESET_FUNC(encoding),                       \
        encoding##_decode,                                  \
        DECODER_INIT_FUNC(encoding),                        \
        DECODER_RESET_FUNC(encoding),                       \
    };                                                      \
                                                            \
    static struct PyMethodDef __methods[] = {               \
        {NULL, NULL},                                       \
    };                                                      \
                                                            \
    void                                                    \
    initname(void)                                          \
    {                                                       \
        PyObject    *codec;                                 \
        PyObject    *m = NULL, *mod = NULL, *o = NULL;      \
                                                            \
        m = Py_InitModule("_codecs_" #encoding STRICT_SUFX, __methods);

#define MAPOPEN(locale)                                     \
    mod = PyImport_ImportModule("_codecs_mapdata_" #locale);\
    if (mod == NULL) goto errorexit;                        \
    if (
#define IMPORTMAP_ENCDEC(charset)                           \
    importmap(mod, "__map_" #charset, &charset##encmap,     \
        &charset##decmap) ||
#define IMPORTMAP_ENC(charset)                              \
    importmap(mod, "__map_" #charset, &charset##encmap,     \
        NULL) ||
#define IMPORTMAP_DEC(charset)                              \
    importmap(mod, "__map_" #charset, NULL,                 \
        &charset##decmap) ||
#define MAPCLOSE()                                          \
    0) goto errorexit;                                      \
    Py_DECREF(mod);

#define END_CODEC_REGISTRY(encoding)                        \
    mod = PyImport_ImportModule("_multibytecodec");         \
    if (mod == NULL) goto errorexit;                        \
    o = PyObject_GetAttrString(mod, "__create_codec");      \
    if (o == NULL || !PyCallable_Check(o))                  \
        goto errorexit;                                     \
                                                            \
    codec = createcodec(o, &__codec);                       \
    if (codec == NULL)                                      \
        goto errorexit;                                     \
    PyModule_AddObject(m, "codec", codec);                  \
    Py_DECREF(o); Py_DECREF(mod);                           \
                                                            \
    if (PyErr_Occurred())                                   \
        Py_FatalError("can't initialize the _" #encoding    \
            STRICT_SUFX " module");                         \
                                                            \
    return;                                                 \
                                                            \
errorexit:                                                  \
    Py_XDECREF(m);                                          \
    Py_XDECREF(mod);                                        \
    Py_XDECREF(o);                                          \
}

#define CODEC_REGISTRY(encoding)                            \
    BEGIN_CODEC_REGISTRY(encoding)                          \
    END_CODEC_REGISTRY(encoding)

#ifdef USING_BINARY_PAIR_SEARCH
static DBCHAR
find_pairencmap(ucs2_t body, ucs2_t modifier,
                struct pair_encodemap *haystack, int haystacksize)
{
    int      pos, min, max;
    ucs4_t   value = body << 16 | modifier;

    min = 0;
    max = haystacksize;

    for (pos = haystacksize >> 1; min != max; pos = (min + max) >> 1)
        if (value < haystack[pos].uniseq) {
            if (max == pos) break;
            else max = pos;
        } else if (value > haystack[pos].uniseq) {
            if (min == pos) break;
            else min = pos;
        } else
            break;

    if (value == haystack[pos].uniseq)
        return haystack[pos].code;
    else
        return DBCINV;
}
#endif

#ifndef CODEC_WITHOUT_MAPS
static int
importmap(PyObject *mod, const char *symbol,
          const struct unim_index **encmap, const struct dbcs_index **decmap)
{
    PyObject    *o;

    o = PyObject_GetAttrString(mod, (char*)symbol);
    if (o == NULL)
        return -1;
    else if (!PyCObject_Check(o)) {
        PyErr_SetString(PyExc_ValueError, "map data must be a CObject.");
        return -1;
    } else {
        struct dbcs_map *map;
        map = PyCObject_AsVoidPtr(o);
        if (encmap != NULL)
            *encmap = map->encmap;
        if (decmap != NULL)
            *decmap = map->decmap;
        Py_DECREF(o);
    }

    return 0;
}
#endif

static PyObject *
createcodec(PyObject *cofunc, MultibyteCodec *codec)
{
    PyObject    *args, *r;

    args = PyTuple_New(1);
    if (args == NULL) return NULL;
    PyTuple_SET_ITEM(args, 0, PyCObject_FromVoidPtr(codec, NULL));

    r = PyObject_CallObject(cofunc, args);
    Py_DECREF(args);

    return r;
}

--- NEW FILE: iso2022common.h ---
/*
 * iso2022common.h: Common Codec Routines for ISO-2022 codecs.
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: iso2022common.h,v 1.8 2003/12/31 05:46:55 perky Exp $
 */

/* This ISO-2022 implementation is intended to comply ECMA-43 Level 1
 * rather than RFCs itself */

#define ESC     0x1b
#define SO      0x0e
#define SI      0x0f

#define MAX_ESCSEQLEN       16

#define IS_ESCEND(c)        (((c) >= 'A' && (c) <= 'Z') || (c) == '@')
#define IS_ISO2022ESC(c2)   ((c2) == '(' || (c2) == ')' || (c2) == '$' || \
                             (c2) == '.' || (c2) == '&')
        /* this is not a full list of ISO-2022 escape sequence headers.
         * but, it's enough to implement CJK instances of iso-2022. */

/* STATE

  state->c[0-3]

        00000000
        ||^^^^^|
        |+-----+----  G0-3 Character Set
        +-----------  Is G0-3 double byte?

  state->c[4]

        00000000
              ||
              |+----  Locked-Shift?
              +-----  ESC Throughout
*/

#define CHARSET_DOUBLEBYTE  0x80

#define CHARSET_ASCII       'B'

#define CHARSET_ISO8859_1   'A'
#define CHARSET_ISO8859_7   'F'

#define CHARSET_KSX1001     ('C'|CHARSET_DOUBLEBYTE)

#define CHARSET_JISX0201_R  'J'
#define CHARSET_JISX0201_K  'I'
#define CHARSET_JISX0208    ('B'|CHARSET_DOUBLEBYTE)
#define CHARSET_JISX0208_O  ('@'|CHARSET_DOUBLEBYTE)
#define CHARSET_JISX0212    ('D'|CHARSET_DOUBLEBYTE)
#define CHARSET_JISX0213_1  ('O'|CHARSET_DOUBLEBYTE)
#define CHARSET_JISX0213_2  ('P'|CHARSET_DOUBLEBYTE)

#define CHARSET_GB2312      ('A'|CHARSET_DOUBLEBYTE)
#define CHARSET_GB2312_8565 ('E'|CHARSET_DOUBLEBYTE)

#define CHARSET_DESIGN(c)   ((c) & 0x7f)
#define CHARSET_ISDBCS(c)   ((c) & 0x80)

#define F_SHIFTED           0x01
#define F_ESCTHROUGHOUT     0x02

#define STATE_SETG(dn, s, v)    ((s)->c[dn]) = (v);
#define STATE_GETG(dn, s)       ((s)->c[dn])

#define STATE_SETG0(s, v)   STATE_SETG(0, s, v)
#define STATE_GETG0(s)      STATE_GETG(0, s)
#define STATE_SETG1(s, v)   STATE_SETG(1, s, v)
#define STATE_GETG1(s)      STATE_GETG(1, s)
#define STATE_SETG2(s, v)   STATE_SETG(2, s, v)
#define STATE_GETG2(s)      STATE_GETG(2, s)
#define STATE_SETG3(s, v)   STATE_SETG(3, s, v)
#define STATE_GETG3(s)      STATE_GETG(3, s)

#define STATE_SETFLAG(s, f)     ((s)->c[4]) |= (f);
#define STATE_GETFLAG(s, f)     ((s)->c[4] & (f))
#define STATE_CLEARFLAG(s, f)   ((s)->c[4]) &= ~(f);
#define STATE_CLEARFLAGS(s)     ((s)->c[4]) = 0;

#define ISO2022_GETCHARSET(charset, c1)                             \
    if ((c) >= 0x80)                                                \
        return 1;                                                   \
    if (STATE_GETFLAG(state, F_SHIFTED)) /* G1 */                   \
        (charset) = STATE_GETG1(state);                             \
    else /* G1 */                                                   \
        (charset) = STATE_GETG0(state);                             \

#ifdef ISO2022_USE_G2_DESIGNATION
/* hardcoded for iso-2022-jp-2 for now. we'll need to generalize it
   when we have more G2 designating encodings */
#define SS2_ROUTINE                                                 \
    if (IN2 == 'N') { /* SS2 */                                     \
        RESERVE_INBUF(3)                                            \
        if (STATE_GETG2(state) == CHARSET_ISO8859_1) {              \
            ISO8859_1_DECODE(IN3 ^ 0x80, **outbuf)                  \
            else return 3;                                          \
        } else if (STATE_GETG2(state) == CHARSET_ISO8859_7) {       \
            ISO8859_7_DECODE(IN3 ^ 0x80, **outbuf)                  \
            else return 3;                                          \
        } else if (STATE_GETG2(state) == CHARSET_ASCII) {           \
            if (IN3 & 0x80) return 3;                               \
            else **outbuf = IN3;                                    \
        } else                                                      \
            return MBERR_INTERNAL;                                  \
        NEXT(3, 1)                                                  \
    } else
#else
#define SS2_ROUTINE
#endif

#ifndef ISO2022_NO_SHIFT
#define SHIFT_CASES                                                 \
    case SI:                                                        \
        STATE_CLEARFLAG(state, F_SHIFTED)                           \
        NEXT_IN(1)                                                  \
        break;                                                      \
    case SO:                                                        \
        STATE_SETFLAG(state, F_SHIFTED)                             \
        NEXT_IN(1)                                                  \
        break;
#else
/* for compatibility with JapaneseCodecs */
#define SHIFT_CASES
#endif

#define ISO2022_BASECASES(c1)                                       \
    case ESC:                                                       \
        RESERVE_INBUF(2)                                            \
        if (IS_ISO2022ESC(IN2)) {                                   \
            int err;                                                \
            err = iso2022processesc(state, inbuf, &inleft);         \
            if (err != 0)                                           \
                return err;                                         \
        } else SS2_ROUTINE {                                        \
            STATE_SETFLAG(state, F_ESCTHROUGHOUT)                   \
            OUT1(ESC)                                               \
            NEXT(1, 1)                                              \
        }                                                           \
        break;                                                      \
    SHIFT_CASES                                                     \
    case '\n':                                                      \
        STATE_CLEARFLAG(state, F_SHIFTED)                           \
        WRITE1('\n')                                                \
        NEXT(1, 1)                                                  \
        break;

#define ISO2022_ESCTHROUGHOUT(c)                                    \
    if (STATE_GETFLAG(state, F_ESCTHROUGHOUT)) {                    \
        /* ESC throughout mode: for non-iso2022 escape sequences */ \
        RESERVE_OUTBUF(1)                                           \
        OUT1(c) /* assume as ISO-8859-1 */                          \
        NEXT(1, 1)                                                  \
        if (IS_ESCEND(c)) {                                         \
            STATE_CLEARFLAG(state, F_ESCTHROUGHOUT)                 \
        }                                                           \
        continue;                                                   \
    }

#define ISO2022_LOOP_BEGIN                                          \
    while (inleft > 0) {                                            \
        unsigned char c = IN1;                                      \
        ISO2022_ESCTHROUGHOUT(c)                                    \
        switch(c) {                                                 \
        ISO2022_BASECASES(c)                                        \
        default:                                                    \
            if (c < 0x20) { /* C0 */                                \
                RESERVE_OUTBUF(1)                                   \
                OUT1(c)                                             \
                NEXT(1, 1)                                          \
            } else if (c >= 0x80)                                   \
                return 1;                                           \
            else {
#define ISO2022_LOOP_END                                            \
            }                                                       \
        }                                                           \
    }

static int
iso2022processesc(MultibyteCodec_State *state,
                  const unsigned char **inbuf, size_t *inleft)
{
    unsigned char charset, designation;
    int  i, esclen;

    for (i = 1;i < MAX_ESCSEQLEN;i++) {
        if (i >= *inleft)
            return MBERR_TOOFEW;
        if (IS_ESCEND((*inbuf)[i])) {
            esclen = i + 1;
            break;
        }
#ifdef ISO2022_USE_JISX0208EXT
        else if (i+1 < *inleft && (*inbuf)[i] == '&' && (*inbuf)[i+1] == '@')
            i += 2;
#endif
    }

    if (i >= MAX_ESCSEQLEN)
        return 1; /* unterminated escape sequence */

    switch (esclen) {
    case 3:
        if (IN2 == '$') {
            charset = IN3 | CHARSET_DOUBLEBYTE;
            designation = 0;
        } else {
            charset = IN3;
            if (IN2 == '(') designation = 0;
            else if (IN2 == ')') designation = 1;
#ifdef ISO2022_USE_G2_DESIGNATION
            else if (IN2 == '.') designation = 2;
#endif
            else return 3;
        }
        break;
    case 4:
        if (IN2 != '$')
            return 4;

        charset = IN4 | CHARSET_DOUBLEBYTE;
        if (IN3 == '(') designation = 0;
        else if (IN3 == ')') designation = 1;
        else return 4;
        break;
#ifdef ISO2022_USE_JISX0208EXT
    case 6: /* designation with prefix */
        if ((*inbuf)[3] == ESC && (*inbuf)[4] == '$' && (*inbuf)[5] == 'B') {
            charset = 'B' | CHARSET_DOUBLEBYTE;
            designation = 0;
        } else
            return 6;
        break;
#endif
    default:
        return esclen;
    }

    { /* raise error when the charset is not designated for this encoding */
        const unsigned char dsgs[] = {ISO2022_DESIGNATIONS, '\x00'};

        for (i = 0; dsgs[i] != '\x00'; i++)
            if (dsgs[i] == charset)
                break;

        if (dsgs[i] == '\x00')
            return esclen;
    }

    STATE_SETG(designation, state, charset)
    *inleft -= esclen;
    (*inbuf) += esclen;
    return 0;
}

--- NEW FILE: map_big5.h ---
/*
 * $CJKCodecs: map_big5.h,v 1.1.1.1 2003/09/24 17:45:19 perky Exp $
 */

static const ucs2_t __big5_decmap[16702] = {
  0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a,
  0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52,
  0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31,
  0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35,
  0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39,
  0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d,
  0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41,
  0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c,
  0x201d, 0x301d, 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a,
[...5299 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {__big5_encmap+21475, 0x0c, 0x0d},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {__big5_encmap+21477, 0x30, 0x6b},
/* 0xFF */ {__big5_encmap+21537, 0x01, 0xe3},
};



--- NEW FILE: map_cp932ext.h ---
/*
 * $CJKCodecs: map_cp932ext.h,v 1.1.1.1 2003/09/24 17:45:26 perky Exp $
 */

static const ucs2_t __cp932ext_decmap[969] = {
  0xff3c, 0xff5e, 0x2225, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019,
  0x201c, 0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d,
  0xff5b, 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d,
  0x300e, 0x300f, 0x3010, 0x3011, 0xff0b, 0xff0d, 0x00b1, 0x00d7,
  UNIINV, 0x00f7, 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267,
  0x221e, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103,
  0xffe5, 0xff04, 0xffe0, 0xffe1, 0xff05, 0xff03, 0xff06, 0xff0a,
  0xff20, 0x00a7, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7,
  0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b,
  0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a,
  0x2229, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, 0x2227, 0x2228, 0xffe2, 0x2460, 0x2461, 0x2462, 0x2463,
[...1823 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {__cp932ext_encmap+9247, 0x29, 0xdc},
/* 0xFA */ {__cp932ext_encmap+9427, 0x0e, 0x2d},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {__cp932ext_encmap+9459, 0x02, 0xe4},
};



--- NEW FILE: map_cp949.h ---
/*
 * $CJKCodecs: map_cp949.h,v 1.1.1.1 2003/09/24 17:45:40 perky Exp $
 */

static const DBCHAR __cp949_encmap[33133] = {
  0x222e, NOCHAR, NOCHAR, 0x2234, NOCHAR, NOCHAR, 0x2157, 0x2127,
  NOCHAR, 0x2823, NOCHAR, NOCHAR, 0x2129, 0x2267, NOCHAR, 0x2146,
  0x213e, 0x2977, 0x2978, 0x2225, NOCHAR, 0x2252, 0x2124, 0x222c,
  0x2976, 0x282c, NOCHAR, 0x2879, 0x2876, 0x287a, 0x222f, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2821, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2822,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x213f, 0x282a,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x282d, 0x292c, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2921, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2923,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2140, 0x292a,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x292d, 0x2922, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
[...4370 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {__cp949_encmap+32635, 0x00, 0xff},
/* 0xFA */ {__cp949_encmap+32891, 0x00, 0x0b},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {__cp949_encmap+32903, 0x01, 0xe6},
};



--- NEW FILE: map_cp949ext.h ---
/*
 * $CJKCodecs: map_cp949ext.h,v 1.1.1.1 2003/09/24 17:45:45 perky Exp $
 */

static const ucs2_t __cp949ext_decmap[9650] = {
  0xac02, 0xac03, 0xac05, 0xac06, 0xac0b, 0xac0c, 0xac0d, 0xac0e,
  0xac0f, 0xac18, 0xac1e, 0xac1f, 0xac21, 0xac22, 0xac23, 0xac25,
  0xac26, 0xac27, 0xac28, 0xac29, 0xac2a, 0xac2b, 0xac2e, 0xac32,
  0xac33, 0xac34, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  0xac35, 0xac36, 0xac37, 0xac3a, 0xac3b, 0xac3d, 0xac3e, 0xac3f,
  0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48,
  0xac49, 0xac4a, 0xac4c, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52,
  0xac53, 0xac55, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  0xac56, 0xac57, 0xac59, 0xac5a, 0xac5b, 0xac5d, 0xac5e, 0xac5f,
  0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67,
  0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f,
  0xac72, 0xac73, 0xac75, 0xac76, 0xac79, 0xac7b, 0xac7c, 0xac7d,
  0xac7e, 0xac7f, 0xac82, 0xac87, 0xac88, 0xac8d, 0xac8e, 0xac8f,
  0xac91, 0xac92, 0xac93, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99,
[...1435 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: map_cp950ext.h ---
/*
 * $CJKCodecs: map_cp950ext.h,v 1.1.1.1 2003/09/24 17:45:47 perky Exp $
 */

static const ucs2_t __cp950ext_decmap[224] = {
  0x2027, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, 0xfe51, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, 0x00af, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, 0xff5e, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, 0x2295, 0x2299, 0x2215,
  0xfe68, UNIINV, 0xffe5, UNIINV, 0xffe0, 0xffe1, 0x20ac, 0x7881,
  0x92b9, 0x88cf, 0x58bb, 0x6052, 0x7ca7, 0x5afa, 0x2554, 0x2566,
  0x2557, 0x2560, 0x256c, 0x2563, 0x255a, 0x2569, 0x255d, 0x2552,
  0x2564, 0x2555, 0x255e, 0x256a, 0x2561, 0x2558, 0x2567, 0x255b,
  0x2553, 0x2565, 0x2556, 0x255f, 0x256b, 0x2562, 0x2559, 0x2568,
  0x255c, 0x2551, 0x2550, 0x256d, 0x256e, 0x2570, 0x256f, 0x2593,
};

static const struct dbcs_index cp950ext_decmap[256] = {
/* 0x00 */ {0, 0, 0},
/* 0x01 */ {0, 0, 0},
/* 0x02 */ {0, 0, 0},
/* 0x03 */ {0, 0, 0},
/* 0x04 */ {0, 0, 0},
/* 0x05 */ {0, 0, 0},
/* 0x06 */ {0, 0, 0},
/* 0x07 */ {0, 0, 0},
/* 0x08 */ {0, 0, 0},
/* 0x09 */ {0, 0, 0},
/* 0x0A */ {0, 0, 0},
/* 0x0B */ {0, 0, 0},
/* 0x0C */ {0, 0, 0},
/* 0x0D */ {0, 0, 0},
/* 0x0E */ {0, 0, 0},
/* 0x0F */ {0, 0, 0},
/* 0x10 */ {0, 0, 0},
/* 0x11 */ {0, 0, 0},
/* 0x12 */ {0, 0, 0},
/* 0x13 */ {0, 0, 0},
/* 0x14 */ {0, 0, 0},
/* 0x15 */ {0, 0, 0},
/* 0x16 */ {0, 0, 0},
/* 0x17 */ {0, 0, 0},
/* 0x18 */ {0, 0, 0},
/* 0x19 */ {0, 0, 0},
/* 0x1A */ {0, 0, 0},
/* 0x1B */ {0, 0, 0},
/* 0x1C */ {0, 0, 0},
/* 0x1D */ {0, 0, 0},
/* 0x1E */ {0, 0, 0},
/* 0x1F */ {0, 0, 0},
/* 0x20 */ {0, 0, 0},
/* 0x21 */ {0, 0, 0},
/* 0x22 */ {0, 0, 0},
/* 0x23 */ {0, 0, 0},
/* 0x24 */ {0, 0, 0},
/* 0x25 */ {0, 0, 0},
/* 0x26 */ {0, 0, 0},
/* 0x27 */ {0, 0, 0},
/* 0x28 */ {0, 0, 0},
/* 0x29 */ {0, 0, 0},
/* 0x2A */ {0, 0, 0},
/* 0x2B */ {0, 0, 0},
/* 0x2C */ {0, 0, 0},
/* 0x2D */ {0, 0, 0},
/* 0x2E */ {0, 0, 0},
/* 0x2F */ {0, 0, 0},
/* 0x30 */ {0, 0, 0},
/* 0x31 */ {0, 0, 0},
/* 0x32 */ {0, 0, 0},
/* 0x33 */ {0, 0, 0},
/* 0x34 */ {0, 0, 0},
/* 0x35 */ {0, 0, 0},
/* 0x36 */ {0, 0, 0},
/* 0x37 */ {0, 0, 0},
/* 0x38 */ {0, 0, 0},
/* 0x39 */ {0, 0, 0},
/* 0x3A */ {0, 0, 0},
/* 0x3B */ {0, 0, 0},
/* 0x3C */ {0, 0, 0},
/* 0x3D */ {0, 0, 0},
/* 0x3E */ {0, 0, 0},
/* 0x3F */ {0, 0, 0},
/* 0x40 */ {0, 0, 0},
/* 0x41 */ {0, 0, 0},
/* 0x42 */ {0, 0, 0},
/* 0x43 */ {0, 0, 0},
/* 0x44 */ {0, 0, 0},
/* 0x45 */ {0, 0, 0},
/* 0x46 */ {0, 0, 0},
/* 0x47 */ {0, 0, 0},
/* 0x48 */ {0, 0, 0},
/* 0x49 */ {0, 0, 0},
/* 0x4A */ {0, 0, 0},
/* 0x4B */ {0, 0, 0},
/* 0x4C */ {0, 0, 0},
/* 0x4D */ {0, 0, 0},
/* 0x4E */ {0, 0, 0},
/* 0x4F */ {0, 0, 0},
/* 0x50 */ {0, 0, 0},
/* 0x51 */ {0, 0, 0},
/* 0x52 */ {0, 0, 0},
/* 0x53 */ {0, 0, 0},
/* 0x54 */ {0, 0, 0},
/* 0x55 */ {0, 0, 0},
/* 0x56 */ {0, 0, 0},
/* 0x57 */ {0, 0, 0},
/* 0x58 */ {0, 0, 0},
/* 0x59 */ {0, 0, 0},
/* 0x5A */ {0, 0, 0},
/* 0x5B */ {0, 0, 0},
/* 0x5C */ {0, 0, 0},
/* 0x5D */ {0, 0, 0},
/* 0x5E */ {0, 0, 0},
/* 0x5F */ {0, 0, 0},
/* 0x60 */ {0, 0, 0},
/* 0x61 */ {0, 0, 0},
/* 0x62 */ {0, 0, 0},
/* 0x63 */ {0, 0, 0},
/* 0x64 */ {0, 0, 0},
/* 0x65 */ {0, 0, 0},
/* 0x66 */ {0, 0, 0},
/* 0x67 */ {0, 0, 0},
/* 0x68 */ {0, 0, 0},
/* 0x69 */ {0, 0, 0},
/* 0x6A */ {0, 0, 0},
/* 0x6B */ {0, 0, 0},
/* 0x6C */ {0, 0, 0},
/* 0x6D */ {0, 0, 0},
/* 0x6E */ {0, 0, 0},
/* 0x6F */ {0, 0, 0},
/* 0x70 */ {0, 0, 0},
/* 0x71 */ {0, 0, 0},
/* 0x72 */ {0, 0, 0},
/* 0x73 */ {0, 0, 0},
/* 0x74 */ {0, 0, 0},
/* 0x75 */ {0, 0, 0},
/* 0x76 */ {0, 0, 0},
/* 0x77 */ {0, 0, 0},
/* 0x78 */ {0, 0, 0},
/* 0x79 */ {0, 0, 0},
/* 0x7A */ {0, 0, 0},
/* 0x7B */ {0, 0, 0},
/* 0x7C */ {0, 0, 0},
/* 0x7D */ {0, 0, 0},
/* 0x7E */ {0, 0, 0},
/* 0x7F */ {0, 0, 0},
/* 0x80 */ {0, 0, 0},
/* 0x81 */ {0, 0, 0},
/* 0x82 */ {0, 0, 0},
/* 0x83 */ {0, 0, 0},
/* 0x84 */ {0, 0, 0},
/* 0x85 */ {0, 0, 0},
/* 0x86 */ {0, 0, 0},
/* 0x87 */ {0, 0, 0},
/* 0x88 */ {0, 0, 0},
/* 0x89 */ {0, 0, 0},
/* 0x8A */ {0, 0, 0},
/* 0x8B */ {0, 0, 0},
/* 0x8C */ {0, 0, 0},
/* 0x8D */ {0, 0, 0},
/* 0x8E */ {0, 0, 0},
/* 0x8F */ {0, 0, 0},
/* 0x90 */ {0, 0, 0},
/* 0x91 */ {0, 0, 0},
/* 0x92 */ {0, 0, 0},
/* 0x93 */ {0, 0, 0},
/* 0x94 */ {0, 0, 0},
/* 0x95 */ {0, 0, 0},
/* 0x96 */ {0, 0, 0},
/* 0x97 */ {0, 0, 0},
/* 0x98 */ {0, 0, 0},
/* 0x99 */ {0, 0, 0},
/* 0x9A */ {0, 0, 0},
/* 0x9B */ {0, 0, 0},
/* 0x9C */ {0, 0, 0},
/* 0x9D */ {0, 0, 0},
/* 0x9E */ {0, 0, 0},
/* 0x9F */ {0, 0, 0},
/* 0xA0 */ {0, 0, 0},
/* 0xA1 */ {__cp950ext_decmap+0, 0x45, 0xf3},
/* 0xA2 */ {__cp950ext_decmap+175, 0x41, 0x47},
/* 0xA3 */ {__cp950ext_decmap+182, 0xe1, 0xe1},
/* 0xA4 */ {0, 0, 0},
/* 0xA5 */ {0, 0, 0},
/* 0xA6 */ {0, 0, 0},
/* 0xA7 */ {0, 0, 0},
/* 0xA8 */ {0, 0, 0},
/* 0xA9 */ {0, 0, 0},
/* 0xAA */ {0, 0, 0},
/* 0xAB */ {0, 0, 0},
/* 0xAC */ {0, 0, 0},
/* 0xAD */ {0, 0, 0},
/* 0xAE */ {0, 0, 0},
/* 0xAF */ {0, 0, 0},
/* 0xB0 */ {0, 0, 0},
/* 0xB1 */ {0, 0, 0},
/* 0xB2 */ {0, 0, 0},
/* 0xB3 */ {0, 0, 0},
/* 0xB4 */ {0, 0, 0},
/* 0xB5 */ {0, 0, 0},
/* 0xB6 */ {0, 0, 0},
/* 0xB7 */ {0, 0, 0},
/* 0xB8 */ {0, 0, 0},
/* 0xB9 */ {0, 0, 0},
/* 0xBA */ {0, 0, 0},
/* 0xBB */ {0, 0, 0},
/* 0xBC */ {0, 0, 0},
/* 0xBD */ {0, 0, 0},
/* 0xBE */ {0, 0, 0},
/* 0xBF */ {0, 0, 0},
/* 0xC0 */ {0, 0, 0},
/* 0xC1 */ {0, 0, 0},
/* 0xC2 */ {0, 0, 0},
/* 0xC3 */ {0, 0, 0},
/* 0xC4 */ {0, 0, 0},
/* 0xC5 */ {0, 0, 0},
/* 0xC6 */ {0, 0, 0},
/* 0xC7 */ {0, 0, 0},
/* 0xC8 */ {0, 0, 0},
/* 0xC9 */ {0, 0, 0},
/* 0xCA */ {0, 0, 0},
/* 0xCB */ {0, 0, 0},
/* 0xCC */ {0, 0, 0},
/* 0xCD */ {0, 0, 0},
/* 0xCE */ {0, 0, 0},
/* 0xCF */ {0, 0, 0},
/* 0xD0 */ {0, 0, 0},
/* 0xD1 */ {0, 0, 0},
/* 0xD2 */ {0, 0, 0},
/* 0xD3 */ {0, 0, 0},
/* 0xD4 */ {0, 0, 0},
/* 0xD5 */ {0, 0, 0},
/* 0xD6 */ {0, 0, 0},
/* 0xD7 */ {0, 0, 0},
/* 0xD8 */ {0, 0, 0},
/* 0xD9 */ {0, 0, 0},
/* 0xDA */ {0, 0, 0},
/* 0xDB */ {0, 0, 0},
/* 0xDC */ {0, 0, 0},
/* 0xDD */ {0, 0, 0},
/* 0xDE */ {0, 0, 0},
/* 0xDF */ {0, 0, 0},
/* 0xE0 */ {0, 0, 0},
/* 0xE1 */ {0, 0, 0},
/* 0xE2 */ {0, 0, 0},
/* 0xE3 */ {0, 0, 0},
/* 0xE4 */ {0, 0, 0},
/* 0xE5 */ {0, 0, 0},
/* 0xE6 */ {0, 0, 0},
/* 0xE7 */ {0, 0, 0},
/* 0xE8 */ {0, 0, 0},
/* 0xE9 */ {0, 0, 0},
/* 0xEA */ {0, 0, 0},
/* 0xEB */ {0, 0, 0},
/* 0xEC */ {0, 0, 0},
/* 0xED */ {0, 0, 0},
/* 0xEE */ {0, 0, 0},
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {__cp950ext_decmap+183, 0xd6, 0xfe},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};

static const DBCHAR __cp950ext_encmap[581] = {
  0xa1c2, 0xa145, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0xa3e1, 0xa241,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0xa1f2,
  NOCHAR, NOCHAR, NOCHAR, 0xa1f3, 0xf9f8, 0xf9e6, 0xf9ef, 0xf9dd,
  0xf9e8, 0xf9f1, 0xf9df, 0xf9ec, 0xf9f5, 0xf9e3, 0xf9ee, 0xf9f7,
  0xf9e5, NOCHAR, 0xf9f2, 0xf9e0, NOCHAR, 0xf9f4, 0xf9e2, 0xf9e7,
  0xf9f0, 0xf9de, 0xf9ed, 0xf9f6, 0xf9e4, NOCHAR, 0xf9f3, 0xf9e1,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0xf9fe, 0xf9d9,
  0xf9dc, 0xf9da, 0xf9d6, 0xf9db, 0xf9d8, 0xf9d7, 0xa14e, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0xa242, 0xa1fe, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, 0xa240, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0xa1e3, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0xa246,
  0xa247, NOCHAR, NOCHAR, NOCHAR, 0xa244,
};

static const struct unim_index cp950ext_encmap[256] = {
/* 0x00 */ {__cp950ext_encmap+0, 0xaf, 0xaf},
/* 0x01 */ {0, 0, 0},
/* 0x02 */ {0, 0, 0},
/* 0x03 */ {0, 0, 0},
/* 0x04 */ {0, 0, 0},
/* 0x05 */ {0, 0, 0},
/* 0x06 */ {0, 0, 0},
/* 0x07 */ {0, 0, 0},
/* 0x08 */ {0, 0, 0},
/* 0x09 */ {0, 0, 0},
/* 0x0A */ {0, 0, 0},
/* 0x0B */ {0, 0, 0},
/* 0x0C */ {0, 0, 0},
/* 0x0D */ {0, 0, 0},
/* 0x0E */ {0, 0, 0},
/* 0x0F */ {0, 0, 0},
/* 0x10 */ {0, 0, 0},
/* 0x11 */ {0, 0, 0},
/* 0x12 */ {0, 0, 0},
/* 0x13 */ {0, 0, 0},
/* 0x14 */ {0, 0, 0},
/* 0x15 */ {0, 0, 0},
/* 0x16 */ {0, 0, 0},
/* 0x17 */ {0, 0, 0},
/* 0x18 */ {0, 0, 0},
/* 0x19 */ {0, 0, 0},
/* 0x1A */ {0, 0, 0},
/* 0x1B */ {0, 0, 0},
/* 0x1C */ {0, 0, 0},
/* 0x1D */ {0, 0, 0},
/* 0x1E */ {0, 0, 0},
/* 0x1F */ {0, 0, 0},
/* 0x20 */ {__cp950ext_encmap+1, 0x27, 0xac},
/* 0x21 */ {0, 0, 0},
/* 0x22 */ {__cp950ext_encmap+135, 0x15, 0x99},
/* 0x23 */ {0, 0, 0},
/* 0x24 */ {0, 0, 0},
/* 0x25 */ {__cp950ext_encmap+268, 0x51, 0x93},
/* 0x26 */ {0, 0, 0},
/* 0x27 */ {0, 0, 0},
/* 0x28 */ {0, 0, 0},
/* 0x29 */ {0, 0, 0},
/* 0x2A */ {0, 0, 0},
/* 0x2B */ {0, 0, 0},
/* 0x2C */ {0, 0, 0},
/* 0x2D */ {0, 0, 0},
/* 0x2E */ {0, 0, 0},
/* 0x2F */ {0, 0, 0},
/* 0x30 */ {0, 0, 0},
/* 0x31 */ {0, 0, 0},
/* 0x32 */ {0, 0, 0},
/* 0x33 */ {0, 0, 0},
/* 0x34 */ {0, 0, 0},
/* 0x35 */ {0, 0, 0},
/* 0x36 */ {0, 0, 0},
/* 0x37 */ {0, 0, 0},
/* 0x38 */ {0, 0, 0},
/* 0x39 */ {0, 0, 0},
/* 0x3A */ {0, 0, 0},
/* 0x3B */ {0, 0, 0},
/* 0x3C */ {0, 0, 0},
/* 0x3D */ {0, 0, 0},
/* 0x3E */ {0, 0, 0},
/* 0x3F */ {0, 0, 0},
/* 0x40 */ {0, 0, 0},
/* 0x41 */ {0, 0, 0},
/* 0x42 */ {0, 0, 0},
/* 0x43 */ {0, 0, 0},
/* 0x44 */ {0, 0, 0},
/* 0x45 */ {0, 0, 0},
/* 0x46 */ {0, 0, 0},
/* 0x47 */ {0, 0, 0},
/* 0x48 */ {0, 0, 0},
/* 0x49 */ {0, 0, 0},
/* 0x4A */ {0, 0, 0},
/* 0x4B */ {0, 0, 0},
/* 0x4C */ {0, 0, 0},
/* 0x4D */ {0, 0, 0},
/* 0x4E */ {0, 0, 0},
/* 0x4F */ {0, 0, 0},
/* 0x50 */ {0, 0, 0},
/* 0x51 */ {0, 0, 0},
/* 0x52 */ {0, 0, 0},
/* 0x53 */ {0, 0, 0},
/* 0x54 */ {0, 0, 0},
/* 0x55 */ {0, 0, 0},
/* 0x56 */ {0, 0, 0},
/* 0x57 */ {0, 0, 0},
/* 0x58 */ {__cp950ext_encmap+335, 0xbb, 0xbb},
/* 0x59 */ {0, 0, 0},
/* 0x5A */ {__cp950ext_encmap+336, 0xfa, 0xfa},
/* 0x5B */ {0, 0, 0},
/* 0x5C */ {0, 0, 0},
/* 0x5D */ {0, 0, 0},
/* 0x5E */ {0, 0, 0},
/* 0x5F */ {0, 0, 0},
/* 0x60 */ {__cp950ext_encmap+337, 0x52, 0x52},
/* 0x61 */ {0, 0, 0},
/* 0x62 */ {0, 0, 0},
/* 0x63 */ {0, 0, 0},
/* 0x64 */ {0, 0, 0},
/* 0x65 */ {0, 0, 0},
/* 0x66 */ {0, 0, 0},
/* 0x67 */ {0, 0, 0},
/* 0x68 */ {0, 0, 0},
/* 0x69 */ {0, 0, 0},
/* 0x6A */ {0, 0, 0},
/* 0x6B */ {0, 0, 0},
/* 0x6C */ {0, 0, 0},
/* 0x6D */ {0, 0, 0},
/* 0x6E */ {0, 0, 0},
/* 0x6F */ {0, 0, 0},
/* 0x70 */ {0, 0, 0},
/* 0x71 */ {0, 0, 0},
/* 0x72 */ {0, 0, 0},
/* 0x73 */ {0, 0, 0},
/* 0x74 */ {0, 0, 0},
/* 0x75 */ {0, 0, 0},
/* 0x76 */ {0, 0, 0},
/* 0x77 */ {0, 0, 0},
/* 0x78 */ {__cp950ext_encmap+338, 0x81, 0x81},
/* 0x79 */ {0, 0, 0},
/* 0x7A */ {0, 0, 0},
/* 0x7B */ {0, 0, 0},
/* 0x7C */ {__cp950ext_encmap+339, 0xa7, 0xa7},
/* 0x7D */ {0, 0, 0},
/* 0x7E */ {0, 0, 0},
/* 0x7F */ {0, 0, 0},
/* 0x80 */ {0, 0, 0},
/* 0x81 */ {0, 0, 0},
/* 0x82 */ {0, 0, 0},
/* 0x83 */ {0, 0, 0},
/* 0x84 */ {0, 0, 0},
/* 0x85 */ {0, 0, 0},
/* 0x86 */ {0, 0, 0},
/* 0x87 */ {0, 0, 0},
/* 0x88 */ {__cp950ext_encmap+340, 0xcf, 0xcf},
/* 0x89 */ {0, 0, 0},
/* 0x8A */ {0, 0, 0},
/* 0x8B */ {0, 0, 0},
/* 0x8C */ {0, 0, 0},
/* 0x8D */ {0, 0, 0},
/* 0x8E */ {0, 0, 0},
/* 0x8F */ {0, 0, 0},
/* 0x90 */ {0, 0, 0},
/* 0x91 */ {0, 0, 0},
/* 0x92 */ {__cp950ext_encmap+341, 0xb9, 0xb9},
/* 0x93 */ {0, 0, 0},
/* 0x94 */ {0, 0, 0},
/* 0x95 */ {0, 0, 0},
/* 0x96 */ {0, 0, 0},
/* 0x97 */ {0, 0, 0},
/* 0x98 */ {0, 0, 0},
/* 0x99 */ {0, 0, 0},
/* 0x9A */ {0, 0, 0},
/* 0x9B */ {0, 0, 0},
/* 0x9C */ {0, 0, 0},
/* 0x9D */ {0, 0, 0},
/* 0x9E */ {0, 0, 0},
/* 0x9F */ {0, 0, 0},
/* 0xA0 */ {0, 0, 0},
/* 0xA1 */ {0, 0, 0},
/* 0xA2 */ {0, 0, 0},
/* 0xA3 */ {0, 0, 0},
/* 0xA4 */ {0, 0, 0},
/* 0xA5 */ {0, 0, 0},
/* 0xA6 */ {0, 0, 0},
/* 0xA7 */ {0, 0, 0},
/* 0xA8 */ {0, 0, 0},
/* 0xA9 */ {0, 0, 0},
/* 0xAA */ {0, 0, 0},
/* 0xAB */ {0, 0, 0},
/* 0xAC */ {0, 0, 0},
/* 0xAD */ {0, 0, 0},
/* 0xAE */ {0, 0, 0},
/* 0xAF */ {0, 0, 0},
/* 0xB0 */ {0, 0, 0},
/* 0xB1 */ {0, 0, 0},
/* 0xB2 */ {0, 0, 0},
/* 0xB3 */ {0, 0, 0},
/* 0xB4 */ {0, 0, 0},
/* 0xB5 */ {0, 0, 0},
/* 0xB6 */ {0, 0, 0},
/* 0xB7 */ {0, 0, 0},
/* 0xB8 */ {0, 0, 0},
/* 0xB9 */ {0, 0, 0},
/* 0xBA */ {0, 0, 0},
/* 0xBB */ {0, 0, 0},
/* 0xBC */ {0, 0, 0},
/* 0xBD */ {0, 0, 0},
/* 0xBE */ {0, 0, 0},
/* 0xBF */ {0, 0, 0},
/* 0xC0 */ {0, 0, 0},
/* 0xC1 */ {0, 0, 0},
/* 0xC2 */ {0, 0, 0},
/* 0xC3 */ {0, 0, 0},
/* 0xC4 */ {0, 0, 0},
/* 0xC5 */ {0, 0, 0},
/* 0xC6 */ {0, 0, 0},
/* 0xC7 */ {0, 0, 0},
/* 0xC8 */ {0, 0, 0},
/* 0xC9 */ {0, 0, 0},
/* 0xCA */ {0, 0, 0},
/* 0xCB */ {0, 0, 0},
/* 0xCC */ {0, 0, 0},
/* 0xCD */ {0, 0, 0},
/* 0xCE */ {0, 0, 0},
/* 0xCF */ {0, 0, 0},
/* 0xD0 */ {0, 0, 0},
/* 0xD1 */ {0, 0, 0},
/* 0xD2 */ {0, 0, 0},
/* 0xD3 */ {0, 0, 0},
/* 0xD4 */ {0, 0, 0},
/* 0xD5 */ {0, 0, 0},
/* 0xD6 */ {0, 0, 0},
/* 0xD7 */ {0, 0, 0},
/* 0xD8 */ {0, 0, 0},
/* 0xD9 */ {0, 0, 0},
/* 0xDA */ {0, 0, 0},
/* 0xDB */ {0, 0, 0},
/* 0xDC */ {0, 0, 0},
/* 0xDD */ {0, 0, 0},
/* 0xDE */ {0, 0, 0},
/* 0xDF */ {0, 0, 0},
/* 0xE0 */ {0, 0, 0},
/* 0xE1 */ {0, 0, 0},
/* 0xE2 */ {0, 0, 0},
/* 0xE3 */ {0, 0, 0},
/* 0xE4 */ {0, 0, 0},
/* 0xE5 */ {0, 0, 0},
/* 0xE6 */ {0, 0, 0},
/* 0xE7 */ {0, 0, 0},
/* 0xE8 */ {0, 0, 0},
/* 0xE9 */ {0, 0, 0},
/* 0xEA */ {0, 0, 0},
/* 0xEB */ {0, 0, 0},
/* 0xEC */ {0, 0, 0},
/* 0xED */ {0, 0, 0},
/* 0xEE */ {0, 0, 0},
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {__cp950ext_encmap+342, 0x51, 0x68},
/* 0xFF */ {__cp950ext_encmap+366, 0x0f, 0xe5},
};



--- NEW FILE: map_gb18030ext.h ---
/*
 * $CJKCodecs: map_gb18030ext.h,v 1.1.1.1 2003/09/24 17:45:51 perky Exp $
 */

static const ucs2_t __gb18030ext_decmap[2729] = {
  0xe4c6, 0xe4c7, 0xe4c8, 0xe4c9, 0xe4ca, 0xe4cb, 0xe4cc, 0xe4cd,
  0xe4ce, 0xe4cf, 0xe4d0, 0xe4d1, 0xe4d2, 0xe4d3, 0xe4d4, 0xe4d5,
  0xe4d6, 0xe4d7, 0xe4d8, 0xe4d9, 0xe4da, 0xe4db, 0xe4dc, 0xe4dd,
  0xe4de, 0xe4df, 0xe4e0, 0xe4e1, 0xe4e2, 0xe4e3, 0xe4e4, 0xe4e5,
  0xe4e6, 0xe4e7, 0xe4e8, 0xe4e9, 0xe4ea, 0xe4eb, 0xe4ec, 0xe4ed,
  0xe4ee, 0xe4ef, 0xe4f0, 0xe4f1, 0xe4f2, 0xe4f3, 0xe4f4, 0xe4f5,
  0xe4f6, 0xe4f7, 0xe4f8, 0xe4f9, 0xe4fa, 0xe4fb, 0xe4fc, 0xe4fd,
  0xe4fe, 0xe4ff, 0xe500, 0xe501, 0xe502, 0xe503, 0xe504, UNIINV,
  0xe505, 0xe506, 0xe507, 0xe508, 0xe509, 0xe50a, 0xe50b, 0xe50c,
  0xe50d, 0xe50e, 0xe50f, 0xe510, 0xe511, 0xe512, 0xe513, 0xe514,
  0xe515, 0xe516, 0xe517, 0xe518, 0xe519, 0xe51a, 0xe51b, 0xe51c,
  0xe51d, 0xe51e, 0xe51f, 0xe520, 0xe521, 0xe522, 0xe523, 0xe524,
  0xe525, 0xe526, 0xe527, 0xe528, 0xe529, 0xe52a, 0xe52b, 0xe52c,
  0xe52d, 0xe52e, 0xe52f, 0xe530, 0xe531, 0xe532, 0xe533, 0xe534,
[...1236 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: map_gb18030uni.h ---
/*
 * $CJKCodecs: map_gb18030uni.h,v 1.1.1.1 2003/09/24 17:45:51 perky Exp $
 */


static const struct _gb18030_to_unibmp_ranges {
    Py_UNICODE   first, last;
    DBCHAR       base;
} gb18030_to_unibmp_ranges[] = {
  { 0x0080, 0x00a3, 0x0000 },
  { 0x00a5, 0x00a6, 0x0024 },
  { 0x00a9, 0x00af, 0x0026 },
  { 0x00b2, 0x00b6, 0x002d },
  { 0x00b8, 0x00d6, 0x0032 },
  { 0x00d8, 0x00df, 0x0051 },
  { 0x00e2, 0x00e7, 0x0059 },
  { 0x00eb, 0x00eb, 0x005f },
  { 0x00ee, 0x00f1, 0x0060 },
  { 0x00f4, 0x00f6, 0x0064 },
  { 0x00f8, 0x00f8, 0x0067 },
  { 0x00fb, 0x00fb, 0x0068 },
  { 0x00fd, 0x0100, 0x0069 },
  { 0x0102, 0x0112, 0x006d },
  { 0x0114, 0x011a, 0x007e },
  { 0x011c, 0x012a, 0x0085 },
  { 0x012c, 0x0143, 0x0094 },
  { 0x0145, 0x0147, 0x00ac },
  { 0x0149, 0x014c, 0x00af },
  { 0x014e, 0x016a, 0x00b3 },
  { 0x016c, 0x01cd, 0x00d0 },
  { 0x01cf, 0x01cf, 0x0132 },
  { 0x01d1, 0x01d1, 0x0133 },
  { 0x01d3, 0x01d3, 0x0134 },
  { 0x01d5, 0x01d5, 0x0135 },
  { 0x01d7, 0x01d7, 0x0136 },
  { 0x01d9, 0x01d9, 0x0137 },
  { 0x01db, 0x01db, 0x0138 },
  { 0x01dd, 0x01f8, 0x0139 },
  { 0x01fa, 0x0250, 0x0155 },
  { 0x0252, 0x0260, 0x01ac },
  { 0x0262, 0x02c6, 0x01bb },
  { 0x02c8, 0x02c8, 0x0220 },
  { 0x02cc, 0x02d8, 0x0221 },
  { 0x02da, 0x0390, 0x022e },
  { 0x03a2, 0x03a2, 0x02e5 },
  { 0x03aa, 0x03b0, 0x02e6 },
  { 0x03c2, 0x03c2, 0x02ed },
  { 0x03ca, 0x0400, 0x02ee },
  { 0x0402, 0x040f, 0x0325 },
  { 0x0450, 0x0450, 0x0333 },
  { 0x0452, 0x200f, 0x0334 },
  { 0x2011, 0x2012, 0x1ef2 },
  { 0x2017, 0x2017, 0x1ef4 },
  { 0x201a, 0x201b, 0x1ef5 },
  { 0x201e, 0x2024, 0x1ef7 },
  { 0x2027, 0x202f, 0x1efe },
  { 0x2031, 0x2031, 0x1f07 },
  { 0x2034, 0x2034, 0x1f08 },
  { 0x2036, 0x203a, 0x1f09 },
  { 0x203c, 0x20ab, 0x1f0e },
  { 0x20ad, 0x2102, 0x1f7e },
  { 0x2104, 0x2104, 0x1fd4 },
  { 0x2106, 0x2108, 0x1fd5 },
  { 0x210a, 0x2115, 0x1fd8 },
  { 0x2117, 0x2120, 0x1fe4 },
  { 0x2122, 0x215f, 0x1fee },
  { 0x216c, 0x216f, 0x202c },
  { 0x217a, 0x218f, 0x2030 },
  { 0x2194, 0x2195, 0x2046 },
  { 0x219a, 0x2207, 0x2048 },
  { 0x2209, 0x220e, 0x20b6 },
  { 0x2210, 0x2210, 0x20bc },
  { 0x2212, 0x2214, 0x20bd },
  { 0x2216, 0x2219, 0x20c0 },
  { 0x221b, 0x221c, 0x20c4 },
  { 0x2221, 0x2222, 0x20c6 },
  { 0x2224, 0x2224, 0x20c8 },
  { 0x2226, 0x2226, 0x20c9 },
  { 0x222c, 0x222d, 0x20ca },
  { 0x222f, 0x2233, 0x20cc },
  { 0x2238, 0x223c, 0x20d1 },
  { 0x223e, 0x2247, 0x20d6 },
  { 0x2249, 0x224b, 0x20e0 },
  { 0x224d, 0x2251, 0x20e3 },
  { 0x2253, 0x225f, 0x20e8 },
  { 0x2262, 0x2263, 0x20f5 },
  { 0x2268, 0x226d, 0x20f7 },
  { 0x2270, 0x2294, 0x20fd },
  { 0x2296, 0x2298, 0x2122 },
  { 0x229a, 0x22a4, 0x2125 },
  { 0x22a6, 0x22be, 0x2130 },
  { 0x22c0, 0x2311, 0x2149 },
  { 0x2313, 0x245f, 0x219b },
  { 0x246a, 0x2473, 0x22e8 },
  { 0x249c, 0x24ff, 0x22f2 },
  { 0x254c, 0x254f, 0x2356 },
  { 0x2574, 0x2580, 0x235a },
  { 0x2590, 0x2592, 0x2367 },
  { 0x2596, 0x259f, 0x236a },
  { 0x25a2, 0x25b1, 0x2374 },
  { 0x25b4, 0x25bb, 0x2384 },
  { 0x25be, 0x25c5, 0x238c },
  { 0x25c8, 0x25ca, 0x2394 },
  { 0x25cc, 0x25cd, 0x2397 },
  { 0x25d0, 0x25e1, 0x2399 },
  { 0x25e6, 0x2604, 0x23ab },
  { 0x2607, 0x2608, 0x23ca },
  { 0x260a, 0x263f, 0x23cc },
  { 0x2641, 0x2641, 0x2402 },
  { 0x2643, 0x2e80, 0x2403 },
  { 0x2e82, 0x2e83, 0x2c41 },
  { 0x2e85, 0x2e87, 0x2c43 },
  { 0x2e89, 0x2e8a, 0x2c46 },
  { 0x2e8d, 0x2e96, 0x2c48 },
  { 0x2e98, 0x2ea6, 0x2c52 },
  { 0x2ea8, 0x2ea9, 0x2c61 },
  { 0x2eab, 0x2ead, 0x2c63 },
  { 0x2eaf, 0x2eb2, 0x2c66 },
  { 0x2eb4, 0x2eb5, 0x2c6a },
  { 0x2eb8, 0x2eba, 0x2c6c },
  { 0x2ebc, 0x2ec9, 0x2c6f },
  { 0x2ecb, 0x2fef, 0x2c7d },
  { 0x2ffc, 0x2fff, 0x2da2 },
  { 0x3004, 0x3004, 0x2da6 },
  { 0x3018, 0x301c, 0x2da7 },
  { 0x301f, 0x3020, 0x2dac },
  { 0x302a, 0x303d, 0x2dae },
  { 0x303f, 0x3040, 0x2dc2 },
  { 0x3094, 0x309a, 0x2dc4 },
  { 0x309f, 0x30a0, 0x2dcb },
  { 0x30f7, 0x30fb, 0x2dcd },
  { 0x30ff, 0x3104, 0x2dd2 },
  { 0x312a, 0x321f, 0x2dd8 },
  { 0x322a, 0x3230, 0x2ece },
  { 0x3232, 0x32a2, 0x2ed5 },
  { 0x32a4, 0x338d, 0x2f46 },
  { 0x3390, 0x339b, 0x3030 },
  { 0x339f, 0x33a0, 0x303c },
  { 0x33a2, 0x33c3, 0x303e },
  { 0x33c5, 0x33cd, 0x3060 },
  { 0x33cf, 0x33d0, 0x3069 },
  { 0x33d3, 0x33d4, 0x306b },
  { 0x33d6, 0x3446, 0x306d },
  { 0x3448, 0x3472, 0x30de },
  { 0x3474, 0x359d, 0x3109 },
  { 0x359f, 0x360d, 0x3233 },
  { 0x360f, 0x3619, 0x32a2 },
  { 0x361b, 0x3917, 0x32ad },
  { 0x3919, 0x396d, 0x35aa },
  { 0x396f, 0x39ce, 0x35ff },
  { 0x39d1, 0x39de, 0x365f },
  { 0x39e0, 0x3a72, 0x366d },
  { 0x3a74, 0x3b4d, 0x3700 },
  { 0x3b4f, 0x3c6d, 0x37da },
  { 0x3c6f, 0x3cdf, 0x38f9 },
  { 0x3ce1, 0x4055, 0x396a },
  { 0x4057, 0x415e, 0x3cdf },
  { 0x4160, 0x4336, 0x3de7 },
  { 0x4338, 0x43ab, 0x3fbe },
  { 0x43ad, 0x43b0, 0x4032 },
  { 0x43b2, 0x43dc, 0x4036 },
  { 0x43de, 0x44d5, 0x4061 },
  { 0x44d7, 0x464b, 0x4159 },
  { 0x464d, 0x4660, 0x42ce },
  { 0x4662, 0x4722, 0x42e2 },
  { 0x4724, 0x4728, 0x43a3 },
  { 0x472a, 0x477b, 0x43a8 },
  { 0x477d, 0x478c, 0x43fa },
  { 0x478e, 0x4946, 0x440a },
  { 0x4948, 0x4979, 0x45c3 },
  { 0x497b, 0x497c, 0x45f5 },
  { 0x497e, 0x4981, 0x45f7 },
  { 0x4984, 0x4984, 0x45fb },
  { 0x4987, 0x499a, 0x45fc },
  { 0x499c, 0x499e, 0x4610 },
  { 0x49a0, 0x49b5, 0x4613 },
  { 0x49b8, 0x4c76, 0x4629 },
  { 0x4c78, 0x4c9e, 0x48e8 },
  { 0x4ca4, 0x4d12, 0x490f },
  { 0x4d1a, 0x4dad, 0x497e },
  { 0x4daf, 0x4dff, 0x4a12 },
  { 0x9fa6, 0xd7ff, 0x4a63 },
  { 0xe76c, 0xe76c, 0x82bd },
  { 0xe7c8, 0xe7c8, 0x82be },
  { 0xe7e7, 0xe7f3, 0x82bf },
  { 0xe815, 0xe815, 0x82cc },
  { 0xe819, 0xe81d, 0x82cd },
  { 0xe81f, 0xe825, 0x82d2 },
  { 0xe827, 0xe82a, 0x82d9 },
  { 0xe82d, 0xe830, 0x82dd },
  { 0xe833, 0xe83a, 0x82e1 },
  { 0xe83c, 0xe842, 0x82e9 },
  { 0xe844, 0xe853, 0x82f0 },
  { 0xe856, 0xe863, 0x8300 },
  { 0xe865, 0xf92b, 0x830e },
  { 0xf92d, 0xf978, 0x93d5 },
  { 0xf97a, 0xf994, 0x9421 },
  { 0xf996, 0xf9e6, 0x943c },
  { 0xf9e8, 0xf9f0, 0x948d },
  { 0xf9f2, 0xfa0b, 0x9496 },
  { 0xfa10, 0xfa10, 0x94b0 },
  { 0xfa12, 0xfa12, 0x94b1 },
  { 0xfa15, 0xfa17, 0x94b2 },
  { 0xfa19, 0xfa1e, 0x94b5 },
  { 0xfa22, 0xfa22, 0x94bb },
  { 0xfa25, 0xfa26, 0x94bc },
  { 0xfa2a, 0xfe2f, 0x94be },
  { 0xfe32, 0xfe32, 0x98c4 },
  { 0xfe45, 0xfe48, 0x98c5 },
  { 0xfe53, 0xfe53, 0x98c9 },
  { 0xfe58, 0xfe58, 0x98ca },
  { 0xfe67, 0xfe67, 0x98cb },
  { 0xfe6c, 0xff00, 0x98cc },
  { 0xff5f, 0xffdf, 0x9961 },
  { 0xffe6, 0xffff, 0x99e2 },
  { 0x0000, 0x0000, 0x99fc },
};


--- NEW FILE: map_gb2312.h ---
/*
 * $CJKCodecs: map_gb2312.h,v 1.1.1.1 2003/09/24 17:45:54 perky Exp $
 */

static const ucs2_t __gb2312_decmap[7482] = {
  0x3000, 0x3001, 0x3002, 0x30fb, 0x02c9, 0x02c7, 0x00a8, 0x3003,
  0x3005, 0x2015, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c,
  0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
  0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1,
  0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a,
  0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312,
  0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d,
  0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234,
  0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4,
  0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb,
  0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2,
  0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2488, 0x2489,
  0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, 0x2490, 0x2491,
  0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499,
[...1164 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: map_gbcommon.h ---
/*
 * $CJKCodecs: map_gbcommon.h,v 1.1.1.1 2003/09/24 17:46:08 perky Exp $
 */

static const DBCHAR __gbcommon_encmap[23231] = {
  0x2168, NOCHAR, NOCHAR, 0x216c, 0x2127, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2163, 0x2140, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, 0xa1a4, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, 0x2141, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2824, 0x2822, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2828, 0x2826, 0x283a, NOCHAR,
  0x282c, 0x282a, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0x2830, 0x282e,
  NOCHAR, NOCHAR, NOCHAR, 0x2142, NOCHAR, 0x2834, 0x2832, NOCHAR,
  0x2839, 0x2821, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, 0x2825, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
[...3132 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {__gbcommon_encmap+22714, 0x2c, 0xf1},
/* 0xFA */ {__gbcommon_encmap+22912, 0x0c, 0x29},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {__gbcommon_encmap+22942, 0x30, 0x6b},
/* 0xFF */ {__gbcommon_encmap+23002, 0x01, 0xe5},
};



--- NEW FILE: map_gbkext.h ---
/*
 * $CJKCodecs: map_gbkext.h,v 1.1.1.1 2003/09/24 17:46:15 perky Exp $
 */

static const ucs2_t __gbkext_decmap[14531] = {
  0x4e02, 0x4e04, 0x4e05, 0x4e06, 0x4e0f, 0x4e12, 0x4e17, 0x4e1f,
  0x4e20, 0x4e21, 0x4e23, 0x4e26, 0x4e29, 0x4e2e, 0x4e2f, 0x4e31,
  0x4e33, 0x4e35, 0x4e37, 0x4e3c, 0x4e40, 0x4e41, 0x4e42, 0x4e44,
  0x4e46, 0x4e4a, 0x4e51, 0x4e55, 0x4e57, 0x4e5a, 0x4e5b, 0x4e62,
  0x4e63, 0x4e64, 0x4e65, 0x4e67, 0x4e68, 0x4e6a, 0x4e6b, 0x4e6c,
  0x4e6d, 0x4e6e, 0x4e6f, 0x4e72, 0x4e74, 0x4e75, 0x4e76, 0x4e77,
  0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7f, 0x4e80,
  0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e87, 0x4e8a, UNIINV,
  0x4e90, 0x4e96, 0x4e97, 0x4e99, 0x4e9c, 0x4e9d, 0x4e9e, 0x4ea3,
  0x4eaa, 0x4eaf, 0x4eb0, 0x4eb1, 0x4eb4, 0x4eb6, 0x4eb7, 0x4eb8,
  0x4eb9, 0x4ebc, 0x4ebd, 0x4ebe, 0x4ec8, 0x4ecc, 0x4ecf, 0x4ed0,
  0x4ed2, 0x4eda, 0x4edb, 0x4edc, 0x4ee0, 0x4ee2, 0x4ee6, 0x4ee7,
  0x4ee9, 0x4eed, 0x4eee, 0x4eef, 0x4ef1, 0x4ef4, 0x4ef8, 0x4ef9,
  0x4efa, 0x4efc, 0x4efe, 0x4f00, 0x4f02, 0x4f03, 0x4f04, 0x4f05,
[...2045 lines suppressed...]
/* 0xEF */ {__gbkext_decmap+13060, 0x40, 0xa0},
/* 0xF0 */ {__gbkext_decmap+13157, 0x40, 0xa0},
/* 0xF1 */ {__gbkext_decmap+13254, 0x40, 0xa0},
/* 0xF2 */ {__gbkext_decmap+13351, 0x40, 0xa0},
/* 0xF3 */ {__gbkext_decmap+13448, 0x40, 0xa0},
/* 0xF4 */ {__gbkext_decmap+13545, 0x40, 0xa0},
/* 0xF5 */ {__gbkext_decmap+13642, 0x40, 0xa0},
/* 0xF6 */ {__gbkext_decmap+13739, 0x40, 0xa0},
/* 0xF7 */ {__gbkext_decmap+13836, 0x40, 0xa0},
/* 0xF8 */ {__gbkext_decmap+13933, 0x40, 0xa0},
/* 0xF9 */ {__gbkext_decmap+14030, 0x40, 0xa0},
/* 0xFA */ {__gbkext_decmap+14127, 0x40, 0xa0},
/* 0xFB */ {__gbkext_decmap+14224, 0x40, 0xa0},
/* 0xFC */ {__gbkext_decmap+14321, 0x40, 0xa0},
/* 0xFD */ {__gbkext_decmap+14418, 0x40, 0xa0},
/* 0xFE */ {__gbkext_decmap+14515, 0x40, 0x4f},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: map_jisx0208.h ---
/*
 * $CJKCodecs: map_jisx0208.h,v 1.1.1.1 2003/09/24 17:46:20 perky Exp $
 */

static const ucs2_t __jisx0208_decmap[6956] = {
  0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b,
  0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e,
  0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd,
  0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0x005c,
  0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019, 0x201c,
  0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b,
  0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e,
  0x300f, 0x3010, 0x3011, 0xff0b, 0x2212, 0x00b1, 0x00d7, 0x00f7,
  0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234,
  0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04,
  0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7,
  0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1,
  0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, 0x3012, 0x2192,
  0x2190, 0x2191, 0x2193, 0x3013, UNIINV, UNIINV, UNIINV, UNIINV,
[...1098 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: map_jisx0212.h ---
/*
 * $CJKCodecs: map_jisx0212.h,v 1.1.1.1 2003/09/24 17:46:24 perky Exp $
 */

static const ucs2_t __jisx0212_decmap[6179] = {
  0x02d8, 0x02c7, 0x00b8, 0x02d9, 0x02dd, 0x00af, 0x02db, 0x02da,
  0x007e, 0x0384, 0x0385, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, 0x00a1, 0x00a6, 0x00bf, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, 0x00ba, 0x00aa, 0x00a9, 0x00ae,
  0x2122, 0x00a4, 0x2116, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa,
  UNIINV, 0x038c, UNIINV, 0x038e, 0x03ab, UNIINV, 0x038f, UNIINV,
  UNIINV, UNIINV, UNIINV, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca,
  0x0390, 0x03cc, 0x03c2, 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0402,
  0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a,
  0x040b, 0x040c, 0x040e, 0x040f, UNIINV, UNIINV, UNIINV, UNIINV,
[...1001 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: map_jisx0213.h ---
/*
 * $CJKCodecs: map_jisx0213.h,v 1.1.1.1 2003/09/24 17:46:45 perky Exp $
 */

static const ucs2_t __jisx0213_1_bmp_decmap[2187] = {
  0xff07, 0xff02, 0xff0d, 0x007e, 0x3033, 0x3034, 0x3035, 0x303b,
  0x303c, 0x30ff, 0x309f, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, 0x2284, 0x2285, 0x228a, 0x228b, 0x2209,
  0x2205, 0x2305, 0x2306, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, 0x2295, 0x2296, 0x2297, 0x2225, 0x2226, 0x2985,
  0x2986, 0x3018, 0x3019, 0x3016, 0x3017, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, 0x2262, 0x2243, 0x2245, 0x2248,
  0x2276, 0x2277, 0x2194, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, 0x266e, 0x266b, 0x266c, 0x2669, 0x25b7,
  0x25b6, 0x25c1, 0x25c0, 0x2197, 0x2198, 0x2196, 0x2199, 0x21c4,
  0x21e8, 0x21e6, 0x21e7, 0x21e9, 0x2934, 0x2935, UNIINV, UNIINV,
  UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV, UNIINV,
  0x29bf, 0x25c9, 0x303d, 0xfe46, 0xfe45, 0x25e6, 0x2022, UNIINV,
[...6907 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: map_jisx0213_pairs.h ---
/*
 * $CJKCodecs: map_jisx0213_pairs.h,v 1.2 2003/11/27 13:29:01 perky Exp $
 */

static const ucs4_t __jisx0213_pairdecmap[49] = {
  0x304b309a, 0x304d309a, 0x304f309a, 0x3051309a,
  0x3053309a, 0x30ab309a, 0x30ad309a, 0x30af309a,
  0x30b1309a, 0x30b3309a, 0x30bb309a, 0x30c4309a,
  0x30c8309a, 0x31f7309a, 0x00e60300,     UNIINV,
      UNIINV,     UNIINV, 0x02540300, 0x02540301,
  0x028c0300, 0x028c0301, 0x02590300, 0x02590301,
  0x025a0300, 0x025a0301,     UNIINV,     UNIINV,
      UNIINV,     UNIINV,     UNIINV,     UNIINV,
      UNIINV,     UNIINV,     UNIINV,     UNIINV,
      UNIINV,     UNIINV,     UNIINV,     UNIINV,
      UNIINV,     UNIINV,     UNIINV,     UNIINV,
      UNIINV,     UNIINV,     UNIINV, 0x02e902e5,
  0x02e502e9,
};

static const struct widedbcs_index jisx0213_pairdecmap[256] = {
/* 0x00 */ {0, 0, 0},
/* 0x01 */ {0, 0, 0},
/* 0x02 */ {0, 0, 0},
/* 0x03 */ {0, 0, 0},
/* 0x04 */ {0, 0, 0},
/* 0x05 */ {0, 0, 0},
/* 0x06 */ {0, 0, 0},
/* 0x07 */ {0, 0, 0},
/* 0x08 */ {0, 0, 0},
/* 0x09 */ {0, 0, 0},
/* 0x0A */ {0, 0, 0},
/* 0x0B */ {0, 0, 0},
/* 0x0C */ {0, 0, 0},
/* 0x0D */ {0, 0, 0},
/* 0x0E */ {0, 0, 0},
/* 0x0F */ {0, 0, 0},
/* 0x10 */ {0, 0, 0},
/* 0x11 */ {0, 0, 0},
/* 0x12 */ {0, 0, 0},
/* 0x13 */ {0, 0, 0},
/* 0x14 */ {0, 0, 0},
/* 0x15 */ {0, 0, 0},
/* 0x16 */ {0, 0, 0},
/* 0x17 */ {0, 0, 0},
/* 0x18 */ {0, 0, 0},
/* 0x19 */ {0, 0, 0},
/* 0x1A */ {0, 0, 0},
/* 0x1B */ {0, 0, 0},
/* 0x1C */ {0, 0, 0},
/* 0x1D */ {0, 0, 0},
/* 0x1E */ {0, 0, 0},
/* 0x1F */ {0, 0, 0},
/* 0x20 */ {0, 0, 0},
/* 0x21 */ {0, 0, 0},
/* 0x22 */ {0, 0, 0},
/* 0x23 */ {0, 0, 0},
/* 0x24 */ {__jisx0213_pairdecmap+0, 0x77, 0x7b},
/* 0x25 */ {__jisx0213_pairdecmap+5, 0x77, 0x7e},
/* 0x26 */ {__jisx0213_pairdecmap+13, 0x78, 0x78},
/* 0x27 */ {0, 0, 0},
/* 0x28 */ {0, 0, 0},
/* 0x29 */ {0, 0, 0},
/* 0x2A */ {0, 0, 0},
/* 0x2B */ {__jisx0213_pairdecmap+14, 0x44, 0x66},
/* 0x2C */ {0, 0, 0},
/* 0x2D */ {0, 0, 0},
/* 0x2E */ {0, 0, 0},
/* 0x2F */ {0, 0, 0},
/* 0x30 */ {0, 0, 0},
/* 0x31 */ {0, 0, 0},
/* 0x32 */ {0, 0, 0},
/* 0x33 */ {0, 0, 0},
/* 0x34 */ {0, 0, 0},
/* 0x35 */ {0, 0, 0},
/* 0x36 */ {0, 0, 0},
/* 0x37 */ {0, 0, 0},
/* 0x38 */ {0, 0, 0},
/* 0x39 */ {0, 0, 0},
/* 0x3A */ {0, 0, 0},
/* 0x3B */ {0, 0, 0},
/* 0x3C */ {0, 0, 0},
/* 0x3D */ {0, 0, 0},
/* 0x3E */ {0, 0, 0},
/* 0x3F */ {0, 0, 0},
/* 0x40 */ {0, 0, 0},
/* 0x41 */ {0, 0, 0},
/* 0x42 */ {0, 0, 0},
/* 0x43 */ {0, 0, 0},
/* 0x44 */ {0, 0, 0},
/* 0x45 */ {0, 0, 0},
/* 0x46 */ {0, 0, 0},
/* 0x47 */ {0, 0, 0},
/* 0x48 */ {0, 0, 0},
/* 0x49 */ {0, 0, 0},
/* 0x4A */ {0, 0, 0},
/* 0x4B */ {0, 0, 0},
/* 0x4C */ {0, 0, 0},
/* 0x4D */ {0, 0, 0},
/* 0x4E */ {0, 0, 0},
/* 0x4F */ {0, 0, 0},
/* 0x50 */ {0, 0, 0},
/* 0x51 */ {0, 0, 0},
/* 0x52 */ {0, 0, 0},
/* 0x53 */ {0, 0, 0},
/* 0x54 */ {0, 0, 0},
/* 0x55 */ {0, 0, 0},
/* 0x56 */ {0, 0, 0},
/* 0x57 */ {0, 0, 0},
/* 0x58 */ {0, 0, 0},
/* 0x59 */ {0, 0, 0},
/* 0x5A */ {0, 0, 0},
/* 0x5B */ {0, 0, 0},
/* 0x5C */ {0, 0, 0},
/* 0x5D */ {0, 0, 0},
/* 0x5E */ {0, 0, 0},
/* 0x5F */ {0, 0, 0},
/* 0x60 */ {0, 0, 0},
/* 0x61 */ {0, 0, 0},
/* 0x62 */ {0, 0, 0},
/* 0x63 */ {0, 0, 0},
/* 0x64 */ {0, 0, 0},
/* 0x65 */ {0, 0, 0},
/* 0x66 */ {0, 0, 0},
/* 0x67 */ {0, 0, 0},
/* 0x68 */ {0, 0, 0},
/* 0x69 */ {0, 0, 0},
/* 0x6A */ {0, 0, 0},
/* 0x6B */ {0, 0, 0},
/* 0x6C */ {0, 0, 0},
/* 0x6D */ {0, 0, 0},
/* 0x6E */ {0, 0, 0},
/* 0x6F */ {0, 0, 0},
/* 0x70 */ {0, 0, 0},
/* 0x71 */ {0, 0, 0},
/* 0x72 */ {0, 0, 0},
/* 0x73 */ {0, 0, 0},
/* 0x74 */ {0, 0, 0},
/* 0x75 */ {0, 0, 0},
/* 0x76 */ {0, 0, 0},
/* 0x77 */ {0, 0, 0},
/* 0x78 */ {0, 0, 0},
/* 0x79 */ {0, 0, 0},
/* 0x7A */ {0, 0, 0},
/* 0x7B */ {0, 0, 0},
/* 0x7C */ {0, 0, 0},
/* 0x7D */ {0, 0, 0},
/* 0x7E */ {0, 0, 0},
/* 0x7F */ {0, 0, 0},
/* 0x80 */ {0, 0, 0},
/* 0x81 */ {0, 0, 0},
/* 0x82 */ {0, 0, 0},
/* 0x83 */ {0, 0, 0},
/* 0x84 */ {0, 0, 0},
/* 0x85 */ {0, 0, 0},
/* 0x86 */ {0, 0, 0},
/* 0x87 */ {0, 0, 0},
/* 0x88 */ {0, 0, 0},
/* 0x89 */ {0, 0, 0},
/* 0x8A */ {0, 0, 0},
/* 0x8B */ {0, 0, 0},
/* 0x8C */ {0, 0, 0},
/* 0x8D */ {0, 0, 0},
/* 0x8E */ {0, 0, 0},
/* 0x8F */ {0, 0, 0},
/* 0x90 */ {0, 0, 0},
/* 0x91 */ {0, 0, 0},
/* 0x92 */ {0, 0, 0},
/* 0x93 */ {0, 0, 0},
/* 0x94 */ {0, 0, 0},
/* 0x95 */ {0, 0, 0},
/* 0x96 */ {0, 0, 0},
/* 0x97 */ {0, 0, 0},
/* 0x98 */ {0, 0, 0},
/* 0x99 */ {0, 0, 0},
/* 0x9A */ {0, 0, 0},
/* 0x9B */ {0, 0, 0},
/* 0x9C */ {0, 0, 0},
/* 0x9D */ {0, 0, 0},
/* 0x9E */ {0, 0, 0},
/* 0x9F */ {0, 0, 0},
/* 0xA0 */ {0, 0, 0},
/* 0xA1 */ {0, 0, 0},
/* 0xA2 */ {0, 0, 0},
/* 0xA3 */ {0, 0, 0},
/* 0xA4 */ {0, 0, 0},
/* 0xA5 */ {0, 0, 0},
/* 0xA6 */ {0, 0, 0},
/* 0xA7 */ {0, 0, 0},
/* 0xA8 */ {0, 0, 0},
/* 0xA9 */ {0, 0, 0},
/* 0xAA */ {0, 0, 0},
/* 0xAB */ {0, 0, 0},
/* 0xAC */ {0, 0, 0},
/* 0xAD */ {0, 0, 0},
/* 0xAE */ {0, 0, 0},
/* 0xAF */ {0, 0, 0},
/* 0xB0 */ {0, 0, 0},
/* 0xB1 */ {0, 0, 0},
/* 0xB2 */ {0, 0, 0},
/* 0xB3 */ {0, 0, 0},
/* 0xB4 */ {0, 0, 0},
/* 0xB5 */ {0, 0, 0},
/* 0xB6 */ {0, 0, 0},
/* 0xB7 */ {0, 0, 0},
/* 0xB8 */ {0, 0, 0},
/* 0xB9 */ {0, 0, 0},
/* 0xBA */ {0, 0, 0},
/* 0xBB */ {0, 0, 0},
/* 0xBC */ {0, 0, 0},
/* 0xBD */ {0, 0, 0},
/* 0xBE */ {0, 0, 0},
/* 0xBF */ {0, 0, 0},
/* 0xC0 */ {0, 0, 0},
/* 0xC1 */ {0, 0, 0},
/* 0xC2 */ {0, 0, 0},
/* 0xC3 */ {0, 0, 0},
/* 0xC4 */ {0, 0, 0},
/* 0xC5 */ {0, 0, 0},
/* 0xC6 */ {0, 0, 0},
/* 0xC7 */ {0, 0, 0},
/* 0xC8 */ {0, 0, 0},
/* 0xC9 */ {0, 0, 0},
/* 0xCA */ {0, 0, 0},
/* 0xCB */ {0, 0, 0},
/* 0xCC */ {0, 0, 0},
/* 0xCD */ {0, 0, 0},
/* 0xCE */ {0, 0, 0},
/* 0xCF */ {0, 0, 0},
/* 0xD0 */ {0, 0, 0},
/* 0xD1 */ {0, 0, 0},
/* 0xD2 */ {0, 0, 0},
/* 0xD3 */ {0, 0, 0},
/* 0xD4 */ {0, 0, 0},
/* 0xD5 */ {0, 0, 0},
/* 0xD6 */ {0, 0, 0},
/* 0xD7 */ {0, 0, 0},
/* 0xD8 */ {0, 0, 0},
/* 0xD9 */ {0, 0, 0},
/* 0xDA */ {0, 0, 0},
/* 0xDB */ {0, 0, 0},
/* 0xDC */ {0, 0, 0},
/* 0xDD */ {0, 0, 0},
/* 0xDE */ {0, 0, 0},
/* 0xDF */ {0, 0, 0},
/* 0xE0 */ {0, 0, 0},
/* 0xE1 */ {0, 0, 0},
/* 0xE2 */ {0, 0, 0},
/* 0xE3 */ {0, 0, 0},
/* 0xE4 */ {0, 0, 0},
/* 0xE5 */ {0, 0, 0},
/* 0xE6 */ {0, 0, 0},
/* 0xE7 */ {0, 0, 0},
/* 0xE8 */ {0, 0, 0},
/* 0xE9 */ {0, 0, 0},
/* 0xEA */ {0, 0, 0},
/* 0xEB */ {0, 0, 0},
/* 0xEC */ {0, 0, 0},
/* 0xED */ {0, 0, 0},
/* 0xEE */ {0, 0, 0},
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};

#define JISX0213_ENCPAIRS   46
static struct pair_encodemap jisx0213_pairencmap[JISX0213_ENCPAIRS] = {
    { 0x00e60000, 0x295c },
    { 0x00e60300, 0x2b44 },
    { 0x02540000, 0x2b38 },
    { 0x02540300, 0x2b48 },
    { 0x02540301, 0x2b49 },
    { 0x02590000, 0x2b30 },
    { 0x02590300, 0x2b4c },
    { 0x02590301, 0x2b4d },
    { 0x025a0000, 0x2b43 },
    { 0x025a0300, 0x2b4e },
    { 0x025a0301, 0x2b4f },
    { 0x028c0000, 0x2b37 },
    { 0x028c0300, 0x2b4a },
    { 0x028c0301, 0x2b4b },
    { 0x02e50000, 0x2b60 },
    { 0x02e502e9, 0x2b66 },
    { 0x02e90000, 0x2b64 },
    { 0x02e902e5, 0x2b65 },
    { 0x304b0000, 0x242b },
    { 0x304b309a, 0x2477 },
    { 0x304d0000, 0x242d },
    { 0x304d309a, 0x2478 },
    { 0x304f0000, 0x242f },
    { 0x304f309a, 0x2479 },
    { 0x30510000, 0x2431 },
    { 0x3051309a, 0x247a },
    { 0x30530000, 0x2433 },
    { 0x3053309a, 0x247b },
    { 0x30ab0000, 0x252b },
    { 0x30ab309a, 0x2577 },
    { 0x30ad0000, 0x252d },
    { 0x30ad309a, 0x2578 },
    { 0x30af0000, 0x252f },
    { 0x30af309a, 0x2579 },
    { 0x30b10000, 0x2531 },
    { 0x30b1309a, 0x257a },
    { 0x30b30000, 0x2533 },
    { 0x30b3309a, 0x257b },
    { 0x30bb0000, 0x253b },
    { 0x30bb309a, 0x257c },
    { 0x30c40000, 0x2544 },
    { 0x30c4309a, 0x257d },
    { 0x30c80000, 0x2548 },
    { 0x30c8309a, 0x257e },
    { 0x31f70000, 0x2675 },
    { 0x31f7309a, 0x2678 },
};


--- NEW FILE: map_jisxcommon.h ---
/*
 * $CJKCodecs: map_jisxcommon.h,v 1.1.1.1 2003/09/24 17:46:57 perky Exp $
 */

static const DBCHAR __jisxcommon_encmap[22016] = {
  0x2140, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, 0xa237, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, NOCHAR, NOCHAR, 0xa242, 0x2171, 0x2172,
  0xa270, NOCHAR, 0xa243, 0x2178, 0x212f, 0xa26d, 0xa26c, NOCHAR,
  0x224c, NOCHAR, 0xa26e, 0xa234, 0x216b, 0x215e, NOCHAR, NOCHAR,
  0x212d, NOCHAR, 0x2279, NOCHAR, 0xa231, NOCHAR, 0xa26b, NOCHAR,
  NOCHAR, NOCHAR, NOCHAR, 0xa244, 0xaa22, 0xaa21, 0xaa24, 0xaa2a,
  0xaa23, 0xaa29, 0xa921, 0xaa2e, 0xaa32, 0xaa31, 0xaa34, 0xaa33,
[...2980 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {__jisxcommon_encmap+21787, 0x01, 0xe5},
};



--- NEW FILE: map_ksx1001.h ---
/*
 * $CJKCodecs: map_ksx1001.h,v 1.1.1.1 2003/09/24 17:47:00 perky Exp $
 */

static const ucs2_t __ksx1001_decmap[8264] = {
  0x3000, 0x3001, 0x3002, 0x00b7, 0x2025, 0x2026, 0x00a8, 0x3003,
  0x00ad, 0x2015, 0x2225, 0xff3c, 0x223c, 0x2018, 0x2019, 0x201c,
  0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
  0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7,
  0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033,
  0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220,
  0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b,
  0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1,
  0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191,
  0x2193, 0x2194, 0x3013, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d,
  0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282,
  0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2, 0x21d2, 0x21d4,
  0x2200, 0x2203, 0x00b4, 0xff5e, 0x02c7, 0x02d8, 0x02dd, 0x02da,
  0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x02d0, 0x222e, 0x2211,
[...1261 lines suppressed...]
/* 0xEF */ {0, 0, 0},
/* 0xF0 */ {0, 0, 0},
/* 0xF1 */ {0, 0, 0},
/* 0xF2 */ {0, 0, 0},
/* 0xF3 */ {0, 0, 0},
/* 0xF4 */ {0, 0, 0},
/* 0xF5 */ {0, 0, 0},
/* 0xF6 */ {0, 0, 0},
/* 0xF7 */ {0, 0, 0},
/* 0xF8 */ {0, 0, 0},
/* 0xF9 */ {0, 0, 0},
/* 0xFA */ {0, 0, 0},
/* 0xFB */ {0, 0, 0},
/* 0xFC */ {0, 0, 0},
/* 0xFD */ {0, 0, 0},
/* 0xFE */ {0, 0, 0},
/* 0xFF */ {0, 0, 0},
};



--- NEW FILE: mapdata_ja_JP.c ---
/*
 * mapdata_ja_JP.c: Map Provider for Japanese Encodings
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: mapdata_ja_JP.c,v 1.3 2004/01/17 11:26:10 perky Exp $
 */

#include "Python.h"
#include "cjkcommon.h"
#include "map_jisx0208.h"
#include "map_jisx0212.h"
#include "map_jisx0213.h"
#include "map_jisxcommon.h"
#include "map_cp932ext.h"

static struct dbcs_map mapholders[] = {
    {"jisx0208",        NULL,               jisx0208_decmap},
    {"jisx0212",        NULL,               jisx0212_decmap},
    {"jisxcommon",      jisxcommon_encmap,  NULL},
    {"jisx0213_1_bmp",  NULL,               jisx0213_1_bmp_decmap},
    {"jisx0213_2_bmp",  NULL,               jisx0213_2_bmp_decmap},
    {"jisx0213_bmp",    jisx0213_bmp_encmap, NULL},
    {"jisx0213_1_emp",  NULL,               jisx0213_1_emp_decmap},
    {"jisx0213_2_emp",  NULL,               jisx0213_2_emp_decmap},
    {"jisx0213_emp",    jisx0213_emp_encmap, NULL},
    {"cp932ext",        cp932ext_encmap,    cp932ext_decmap},
    {"",                NULL,               NULL},
};

static struct PyMethodDef __methods[] = {
    {NULL, NULL},
};

void
init_codecs_mapdata_ja_JP(void)
{
    struct dbcs_map *h;
    PyObject        *m;

    m = Py_InitModule("_codecs_mapdata_ja_JP", __methods);

    for (h = mapholders; h->charset[0] != '\0'; h++) {
        char     mhname[256] = "__map_";

        strcpy(mhname + sizeof("__map_") - 1, h->charset);
        PyModule_AddObject(m, mhname, PyCObject_FromVoidPtr(h, NULL));
    }

    if (PyErr_Occurred())
        Py_FatalError("can't initialize the _codecs_mapdata_ja_JP module");
}

--- NEW FILE: mapdata_ko_KR.c ---
/*
 * mapdata_ko_KR.c: Map Provider for Korean Encodings
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: mapdata_ko_KR.c,v 1.3 2004/01/17 11:26:10 perky Exp $
 */

#include "Python.h"
#include "cjkcommon.h"
#include "map_ksx1001.h"
#include "map_cp949.h"
#include "map_cp949ext.h"

static struct dbcs_map mapholders[] = {
    {"ksx1001",         NULL,           ksx1001_decmap},
    {"cp949",           cp949_encmap,   NULL},
    {"cp949ext",        NULL,           cp949ext_decmap},
    {"",                NULL,           NULL},
};

static struct PyMethodDef __methods[] = {
    {NULL, NULL},
};

void
init_codecs_mapdata_ko_KR(void)
{
    struct dbcs_map *h;
    PyObject        *m;

    m = Py_InitModule("_codecs_mapdata_ko_KR", __methods);

    for (h = mapholders; h->charset[0] != '\0'; h++) {
        char     mhname[256] = "__map_";

        strcpy(mhname + sizeof("__map_") - 1, h->charset);
        PyModule_AddObject(m, mhname, PyCObject_FromVoidPtr(h, NULL));
    }

    if (PyErr_Occurred())
        Py_FatalError("can't initialize the _codecs_mapdata_ko_KR module");
}

--- NEW FILE: mapdata_zh_CN.c ---
/*
 * mapdata_zh_CN.c: Map Provider for Simplified Chinese Encodings
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: mapdata_zh_CN.c,v 1.3 2004/01/17 11:26:10 perky Exp $
 */

#include "Python.h"
#include "cjkcommon.h"
#include "map_gb2312.h"
#include "map_gbkext.h"
#include "map_gbcommon.h"
#include "map_gb18030ext.h"

static struct dbcs_map mapholders[] = {
    {"gb2312",      NULL,               gb2312_decmap},
    {"gbkext",      NULL,               gbkext_decmap},
    {"gbcommon",    gbcommon_encmap,    NULL},
    {"gb18030ext",  gb18030ext_encmap,  gb18030ext_decmap},
    {"",            NULL,               NULL},
};

static struct PyMethodDef __methods[] = {
    {NULL, NULL},
};

void
init_codecs_mapdata_zh_CN(void)
{
    struct dbcs_map     *h;
    PyObject            *m;

    m = Py_InitModule("_codecs_mapdata_zh_CN", __methods);

    for (h = mapholders; h->charset[0] != '\0'; h++) {
        char     mhname[256] = "__map_";

        strcpy(mhname + sizeof("__map_") - 1, h->charset);
        PyModule_AddObject(m, mhname, PyCObject_FromVoidPtr(h, NULL));
    }

    if (PyErr_Occurred())
        Py_FatalError("can't initialize the _codecs_mapdata_zh_CN module");
}

--- NEW FILE: mapdata_zh_TW.c ---
/*
 * mapdata_zh_TW.c: Map Provider for Traditional Chinese Encodings
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: mapdata_zh_TW.c,v 1.3 2004/01/17 11:26:10 perky Exp $
 */

#include "Python.h"
#include "cjkcommon.h"
#include "map_big5.h"
#include "map_cp950ext.h"

static struct dbcs_map mapholders[] = {
    {"big5",        big5_encmap,        big5_decmap},
    {"cp950ext",    cp950ext_encmap,    cp950ext_decmap},
    {"",            NULL,               NULL},
};

static struct PyMethodDef __methods[] = {
    {NULL, NULL},
};

void
init_codecs_mapdata_zh_TW(void)
{
    struct dbcs_map *h;
    PyObject        *m;

    m = Py_InitModule("_codecs_mapdata_zh_TW", __methods);

    for (h = mapholders; h->charset[0] != '\0'; h++) {
        char     mhname[256] = "__map_";

        strcpy(mhname + sizeof("__map_") - 1, h->charset);
        PyModule_AddObject(m, mhname, PyCObject_FromVoidPtr(h, NULL));
    }

    if (PyErr_Occurred())
        Py_FatalError("can't initialize the _codecs_mapdata_zh_TW module");
}

--- NEW FILE: multibytecodec.c ---
/*
 * multibytecodec.c: Common Multibyte Codec Implementation
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: multibytecodec.c,v 1.6 2004/01/17 11:26:10 perky Exp $
 */

#include "Python.h"
#include "multibytecodec.h"


typedef struct {
    const Py_UNICODE    *inbuf, *inbuf_top, *inbuf_end;
    unsigned char       *outbuf, *outbuf_end;
    PyObject            *excobj, *outobj;
} MultibyteEncodeBuffer;

typedef struct {
    const unsigned char *inbuf, *inbuf_top, *inbuf_end;
[...1171 lines suppressed...]
    return (PyObject *)self;

errorexit:
    Py_XDECREF(self);
    return NULL;
}

static struct PyMethodDef __methods[] = {
    {"__create_codec", (PyCFunction)__create_codec, METH_O},
    {NULL, NULL},
};

void
init_multibytecodec(void)
{
    Py_InitModule("_multibytecodec", __methods);

    if (PyErr_Occurred())
        Py_FatalError("can't initialize the _multibytecodec module");
}

--- NEW FILE: multibytecodec.h ---
/*
 * multibytecodec.h: Common Multibyte Codec Implementation
 *
 * Written by Hye-Shik Chang <perky at FreeBSD.org>
 * $CJKCodecs: multibytecodec.h,v 1.2 2003/12/31 05:46:55 perky Exp $
 */

#ifndef _PYTHON_MULTIBYTECODEC_H_
#define _PYTHON_MULTIBYTECODEC_H_
#ifdef __cplusplus
extern "C" {
#endif

#include "cjkcommon.h"

typedef union {
    void            *p;
    int              i;
    unsigned char    c[8];
    ucs2_t           u2[4];
    ucs4_t           u4[2];
} MultibyteCodec_State;

typedef int (*mbencode_func)(MultibyteCodec_State *state,
                             const Py_UNICODE **inbuf, size_t inleft,
                             unsigned char **outbuf, size_t outleft,
                             int flags);
typedef int (*mbencodeinit_func)(MultibyteCodec_State *state);
typedef int (*mbencodereset_func)(MultibyteCodec_State *state,
                             unsigned char **outbuf, size_t outleft);
typedef int (*mbdecode_func)(MultibyteCodec_State *state,
                             const unsigned char **inbuf, size_t inleft,
                             Py_UNICODE **outbuf, size_t outleft);
typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state);
typedef int (*mbdecodereset_func)(MultibyteCodec_State *state);

typedef struct {
    const char          *encoding;
    mbencode_func        encode;
    mbencodeinit_func    encinit;
    mbencodereset_func   encreset;
    mbdecode_func        decode;
    mbdecodeinit_func    decinit;
    mbdecodereset_func   decreset;
} MultibyteCodec;

typedef struct {
    PyObject_HEAD
    MultibyteCodec    *codec;
} MultibyteCodecObject;

#define MAXDECPENDING   8
typedef struct {
    PyObject_HEAD
    MultibyteCodec          *codec;
    MultibyteCodec_State     state;
    unsigned char    pending[MAXDECPENDING];
    int              pendingsize;
    PyObject        *stream, *errors;
} MultibyteStreamReaderObject;

#define MAXENCPENDING   2
typedef struct {
    PyObject_HEAD
    MultibyteCodec          *codec;
    MultibyteCodec_State     state;
    Py_UNICODE       pending[MAXENCPENDING];
    int              pendingsize;
    PyObject        *stream, *errors;
} MultibyteStreamWriterObject;

/* positive values for illegal sequences */
#define MBERR_TOOSMALL      (-1) /* insufficient output buffer space */
#define MBERR_TOOFEW        (-2) /* incomplete input buffer */
#define MBERR_INTERNAL      (-3) /* internal runtime error */

#define ERROR_STRICT        (PyObject *)(1)
#define ERROR_IGNORE        (PyObject *)(2)
#define ERROR_REPLACE       (PyObject *)(3)
#define ERROR_MAX           ERROR_REPLACE

#define MBENC_FLUSH         0x0001 /* encode all characters encodable */
#define MBENC_MAX           MBENC_FLUSH

#ifdef __cplusplus
}
#endif
#endif

--- NEW FILE: tweak_gbk.h ---
/* $CJKCodecs: tweak_gbk.h,v 1.1.1.1 2003/09/24 17:47:00 perky Exp $ */

#define GBK_PREDECODE(dc1, dc2, assi) \
	if ((dc1) == 0xa1 && (dc2) == 0xaa) (assi) = 0x2014; \
	else if ((dc1) == 0xa8 && (dc2) == 0x44) (assi) = 0x2015; \
	else if ((dc1) == 0xa1 && (dc2) == 0xa4) (assi) = 0x00b7;
#define GBK_PREENCODE(code, assi) \
	if ((code) == 0x2014) (assi) = 0xa1aa; \
	else if ((code) == 0x2015) (assi) = 0xa844; \
	else if ((code) == 0x00b7) (assi) = 0xa1a4;






More information about the Python-checkins mailing list