17db96d56Sopenharmony_ci/*
27db96d56Sopenharmony_ci * _codecs_tw.c: Codecs collection for Taiwan's encodings
37db96d56Sopenharmony_ci *
47db96d56Sopenharmony_ci * Written by Hye-Shik Chang <perky@FreeBSD.org>
57db96d56Sopenharmony_ci */
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#include "cjkcodecs.h"
87db96d56Sopenharmony_ci#include "mappings_tw.h"
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci/*
117db96d56Sopenharmony_ci * BIG5 codec
127db96d56Sopenharmony_ci */
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciENCODER(big5)
157db96d56Sopenharmony_ci{
167db96d56Sopenharmony_ci    while (*inpos < inlen) {
177db96d56Sopenharmony_ci        Py_UCS4 c = INCHAR1;
187db96d56Sopenharmony_ci        DBCHAR code;
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci        if (c < 0x80) {
217db96d56Sopenharmony_ci            REQUIRE_OUTBUF(1);
227db96d56Sopenharmony_ci            **outbuf = (unsigned char)c;
237db96d56Sopenharmony_ci            NEXT(1, 1);
247db96d56Sopenharmony_ci            continue;
257db96d56Sopenharmony_ci        }
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci        if (c > 0xFFFF)
287db96d56Sopenharmony_ci            return 1;
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci        REQUIRE_OUTBUF(2);
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci        if (TRYMAP_ENC(big5, code, c))
337db96d56Sopenharmony_ci            ;
347db96d56Sopenharmony_ci        else
357db96d56Sopenharmony_ci            return 1;
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci        OUTBYTE1(code >> 8);
387db96d56Sopenharmony_ci        OUTBYTE2(code & 0xFF);
397db96d56Sopenharmony_ci        NEXT(1, 2);
407db96d56Sopenharmony_ci    }
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci    return 0;
437db96d56Sopenharmony_ci}
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ciDECODER(big5)
467db96d56Sopenharmony_ci{
477db96d56Sopenharmony_ci    while (inleft > 0) {
487db96d56Sopenharmony_ci        unsigned char c = INBYTE1;
497db96d56Sopenharmony_ci        Py_UCS4 decoded;
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci        if (c < 0x80) {
527db96d56Sopenharmony_ci            OUTCHAR(c);
537db96d56Sopenharmony_ci            NEXT_IN(1);
547db96d56Sopenharmony_ci            continue;
557db96d56Sopenharmony_ci        }
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci        REQUIRE_INBUF(2);
587db96d56Sopenharmony_ci        if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
597db96d56Sopenharmony_ci            OUTCHAR(decoded);
607db96d56Sopenharmony_ci            NEXT_IN(2);
617db96d56Sopenharmony_ci        }
627db96d56Sopenharmony_ci        else return 1;
637db96d56Sopenharmony_ci    }
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci    return 0;
667db96d56Sopenharmony_ci}
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci/*
707db96d56Sopenharmony_ci * CP950 codec
717db96d56Sopenharmony_ci */
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ciENCODER(cp950)
747db96d56Sopenharmony_ci{
757db96d56Sopenharmony_ci    while (*inpos < inlen) {
767db96d56Sopenharmony_ci        Py_UCS4 c = INCHAR1;
777db96d56Sopenharmony_ci        DBCHAR code;
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci        if (c < 0x80) {
807db96d56Sopenharmony_ci            WRITEBYTE1((unsigned char)c);
817db96d56Sopenharmony_ci            NEXT(1, 1);
827db96d56Sopenharmony_ci            continue;
837db96d56Sopenharmony_ci        }
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci        if (c > 0xFFFF)
867db96d56Sopenharmony_ci            return 1;
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci        REQUIRE_OUTBUF(2);
897db96d56Sopenharmony_ci        if (TRYMAP_ENC(cp950ext, code, c))
907db96d56Sopenharmony_ci            ;
917db96d56Sopenharmony_ci        else if (TRYMAP_ENC(big5, code, c))
927db96d56Sopenharmony_ci            ;
937db96d56Sopenharmony_ci        else
947db96d56Sopenharmony_ci            return 1;
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci        OUTBYTE1(code >> 8);
977db96d56Sopenharmony_ci        OUTBYTE2(code & 0xFF);
987db96d56Sopenharmony_ci        NEXT(1, 2);
997db96d56Sopenharmony_ci    }
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci    return 0;
1027db96d56Sopenharmony_ci}
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ciDECODER(cp950)
1057db96d56Sopenharmony_ci{
1067db96d56Sopenharmony_ci    while (inleft > 0) {
1077db96d56Sopenharmony_ci        unsigned char c = INBYTE1;
1087db96d56Sopenharmony_ci        Py_UCS4 decoded;
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci        if (c < 0x80) {
1117db96d56Sopenharmony_ci            OUTCHAR(c);
1127db96d56Sopenharmony_ci            NEXT_IN(1);
1137db96d56Sopenharmony_ci            continue;
1147db96d56Sopenharmony_ci        }
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci        REQUIRE_INBUF(2);
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci        if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2))
1197db96d56Sopenharmony_ci            OUTCHAR(decoded);
1207db96d56Sopenharmony_ci        else if (TRYMAP_DEC(big5, decoded, c, INBYTE2))
1217db96d56Sopenharmony_ci            OUTCHAR(decoded);
1227db96d56Sopenharmony_ci        else
1237db96d56Sopenharmony_ci            return 1;
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci        NEXT_IN(2);
1267db96d56Sopenharmony_ci    }
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci    return 0;
1297db96d56Sopenharmony_ci}
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ciBEGIN_MAPPINGS_LIST
1347db96d56Sopenharmony_ci  MAPPING_ENCDEC(big5)
1357db96d56Sopenharmony_ci  MAPPING_ENCDEC(cp950ext)
1367db96d56Sopenharmony_ciEND_MAPPINGS_LIST
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ciBEGIN_CODECS_LIST
1397db96d56Sopenharmony_ci  CODEC_STATELESS(big5)
1407db96d56Sopenharmony_ci  CODEC_STATELESS(cp950)
1417db96d56Sopenharmony_ciEND_CODECS_LIST
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ciI_AM_A_MODULE_FOR(tw)
144