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