_codecs_tw.c 2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * _codecs_tw.c: Codecs collection for Taiwan's encodings
 *
 * Written by Hye-Shik Chang <perky@FreeBSD.org>
 */

#include "cjkcodecs.h"
#include "mappings_tw.h"

/*
 * BIG5 codec
 */

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

20 21 22 23 24 25 26
        if (c < 0x80) {
            REQUIRE_OUTBUF(1)
            **outbuf = (unsigned char)c;
            NEXT(1, 1)
            continue;
        }
        UCS4INVALID(c)
27

28
        REQUIRE_OUTBUF(2)
29

30 31
        TRYMAP_ENC(big5, code, c);
        else return 1;
32

33 34 35 36
        OUT1(code >> 8)
        OUT2(code & 0xFF)
        NEXT(1, 2)
    }
37

38
    return 0;
39 40 41 42
}

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

46
        REQUIRE_OUTBUF(1)
47

48 49 50 51 52
        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }
53

54 55 56 57 58 59
        REQUIRE_INBUF(2)
        TRYMAP_DEC(big5, **outbuf, c, IN2) {
            NEXT(2, 1)
        }
        else return 2;
    }
60

61
    return 0;
62 63 64 65 66 67 68 69 70
}


/*
 * CP950 codec
 */

ENCODER(cp950)
{
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
    while (inleft > 0) {
        Py_UNICODE c = IN1;
        DBCHAR code;

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

        REQUIRE_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;
93 94 95 96
}

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

100
        REQUIRE_OUTBUF(1)
101

102 103 104 105 106
        if (c < 0x80) {
            OUT1(c)
            NEXT(1, 1)
            continue;
        }
107

108
        REQUIRE_INBUF(2)
109

110 111 112
        TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
        else TRYMAP_DEC(big5, **outbuf, c, IN2);
        else return 2;
113

114 115
        NEXT(2, 1)
    }
116

117
    return 0;
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
}



BEGIN_MAPPINGS_LIST
  MAPPING_ENCDEC(big5)
  MAPPING_ENCDEC(cp950ext)
END_MAPPINGS_LIST

BEGIN_CODECS_LIST
  CODEC_STATELESS(big5)
  CODEC_STATELESS(cp950)
END_CODECS_LIST

I_AM_A_MODULE_FOR(tw)