]>
git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_kr.c
6c5f224288c0478ff822d0fadc4ddfe0bd65ee9e
2 * _codecs_kr.c: Codecs collection for Korean encodings
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
8 #include "mappings_kr.h"
14 #define EUCKR_JAMO_FIRSTBYTE 0xA4
15 #define EUCKR_JAMO_FILLER 0xD4
17 static const unsigned char u2cgk_choseong
[19] = {
18 0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xa9, 0xb1, 0xb2,
19 0xb3, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
22 static const unsigned char u2cgk_jungseong
[21] = {
23 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
24 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
25 0xcf, 0xd0, 0xd1, 0xd2, 0xd3
27 static const unsigned char u2cgk_jongseong
[28] = {
28 0xd4, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
29 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0,
30 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xba,
31 0xbb, 0xbc, 0xbd, 0xbe
41 WRITE1((unsigned char)c
)
48 TRYMAP_ENC(cp949
, code
, c
);
51 if ((code
& 0x8000) == 0) {
52 /* KS X 1001 coded character */
53 OUT1((code
>> 8) | 0x80)
54 OUT2((code
& 0xFF) | 0x80)
57 else { /* Mapping is found in CP949 extension,
58 * but we encode it in KS X 1001:1998 Annex 3,
59 * make-up sequence for EUC-KR. */
63 /* syllable composition precedence */
64 OUT1(EUCKR_JAMO_FIRSTBYTE
)
65 OUT2(EUCKR_JAMO_FILLER
)
67 /* All code points in CP949 extension are in unicode
68 * Hangul Syllable area. */
69 assert(0xac00 <= c
&& c
<= 0xd7a3);
72 OUT3(EUCKR_JAMO_FIRSTBYTE
)
73 OUT4(u2cgk_choseong
[c
/ 588])
76 OUT1(EUCKR_JAMO_FIRSTBYTE
)
77 OUT2(u2cgk_jungseong
[(c
/ 28) % 21])
78 OUT3(EUCKR_JAMO_FIRSTBYTE
)
79 OUT4(u2cgk_jongseong
[c
% 28])
89 static const unsigned char cgk2u_choseong
[] = { /* [A1, BE] */
90 0, 1, NONE
, 2, NONE
, NONE
, 3, 4,
91 5, NONE
, NONE
, NONE
, NONE
, NONE
, NONE
, NONE
,
92 6, 7, 8, NONE
, 9, 10, 11, 12,
93 13, 14, 15, 16, 17, 18
95 static const unsigned char cgk2u_jongseong
[] = { /* [A1, BE] */
96 1, 2, 3, 4, 5, 6, 7, NONE
,
97 8, 9, 10, 11, 12, 13, 14, 15,
98 16, 17, NONE
, 18, 19, 20, 21, 22,
99 NONE
, 23, 24, 25, 26, 27
105 unsigned char c
= IN1
;
117 if (c
== EUCKR_JAMO_FIRSTBYTE
&&
118 IN2
== EUCKR_JAMO_FILLER
) {
119 /* KS X 1001:1998 Annex 3 make-up sequence */
120 DBCHAR cho
, jung
, jong
;
123 if ((*inbuf
)[2] != EUCKR_JAMO_FIRSTBYTE
||
124 (*inbuf
)[4] != EUCKR_JAMO_FIRSTBYTE
||
125 (*inbuf
)[6] != EUCKR_JAMO_FIRSTBYTE
)
129 if (0xa1 <= c
&& c
<= 0xbe)
130 cho
= cgk2u_choseong
[c
- 0xa1];
135 jung
= (0xbf <= c
&& c
<= 0xd3) ? c
- 0xbf : NONE
;
138 if (c
== EUCKR_JAMO_FILLER
)
140 else if (0xa1 <= c
&& c
<= 0xbe)
141 jong
= cgk2u_jongseong
[c
- 0xa1];
145 if (cho
== NONE
|| jung
== NONE
|| jong
== NONE
)
148 OUT1(0xac00 + cho
*588 + jung
*28 + jong
);
151 else TRYMAP_DEC(ksx1001
, **outbuf
, c
^ 0x80, IN2
^ 0x80) {
174 WRITE1((unsigned char)c
)
181 TRYMAP_ENC(cp949
, code
, c
);
184 OUT1((code
>> 8) | 0x80)
186 OUT2(code
& 0xFF) /* MSB set: CP949 */
188 OUT2((code
& 0xFF) | 0x80) /* MSB unset: ks x 1001 */
198 unsigned char c
= IN1
;
209 TRYMAP_DEC(ksx1001
, **outbuf
, c
^ 0x80, IN2
^ 0x80);
210 else TRYMAP_DEC(cp949ext
, **outbuf
, c
, IN2
);
224 static const unsigned char u2johabidx_choseong
[32] = {
225 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
226 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
227 0x10, 0x11, 0x12, 0x13, 0x14,
229 static const unsigned char u2johabidx_jungseong
[32] = {
230 0x03, 0x04, 0x05, 0x06, 0x07,
231 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
232 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
233 0x1a, 0x1b, 0x1c, 0x1d,
235 static const unsigned char u2johabidx_jongseong
[32] = {
236 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
237 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
238 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17,
239 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
241 static const DBCHAR u2johabjamo
[] = {
242 0x8841, 0x8c41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441,
243 0x9841, 0x9c41, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f,
244 0x8450, 0xa041, 0xa441, 0xa841, 0x8454, 0xac41, 0xb041, 0xb441,
245 0xb841, 0xbc41, 0xc041, 0xc441, 0xc841, 0xcc41, 0xd041, 0x8461,
246 0x8481, 0x84a1, 0x84c1, 0x84e1, 0x8541, 0x8561, 0x8581, 0x85a1,
247 0x85c1, 0x85e1, 0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1,
248 0x8741, 0x8761, 0x8781, 0x87a1,
258 WRITE1((unsigned char)c
)
266 if (c
>= 0xac00 && c
<= 0xd7a3) {
269 (u2johabidx_choseong
[c
/ 588] << 10) |
270 (u2johabidx_jungseong
[(c
/ 28) % 21] << 5) |
271 u2johabidx_jongseong
[c
% 28];
273 else if (c
>= 0x3131 && c
<= 0x3163)
274 code
= u2johabjamo
[c
- 0x3131];
275 else TRYMAP_ENC(cp949
, code
, c
) {
276 unsigned char c1
, c2
, t2
;
279 assert((code
& 0x8000) == 0);
282 if (((c1
>= 0x21 && c1
<= 0x2c) ||
283 (c1
>= 0x4a && c1
<= 0x7d)) &&
284 (c2
>= 0x21 && c2
<= 0x7e)) {
285 t1
= (c1
< 0x4a ? (c1
- 0x21 + 0x1b2) :
286 (c1
- 0x21 + 0x197));
287 t2
= ((t1
& 1) ? 0x5e : 0) + (c2
- 0x21);
289 OUT2(t2
< 0x4e ? t2
+ 0x31 : t2
+ 0x43)
310 static const unsigned char johabidx_choseong
[32] = {
311 NONE
, FILL
, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
312 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
313 0x0e, 0x0f, 0x10, 0x11, 0x12, NONE
, NONE
, NONE
,
314 NONE
, NONE
, NONE
, NONE
, NONE
, NONE
, NONE
, NONE
,
316 static const unsigned char johabidx_jungseong
[32] = {
317 NONE
, NONE
, FILL
, 0x00, 0x01, 0x02, 0x03, 0x04,
318 NONE
, NONE
, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
319 NONE
, NONE
, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
320 NONE
, NONE
, 0x11, 0x12, 0x13, 0x14, NONE
, NONE
,
322 static const unsigned char johabidx_jongseong
[32] = {
323 NONE
, FILL
, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
324 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
325 0x0f, 0x10, NONE
, 0x11, 0x12, 0x13, 0x14, 0x15,
326 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, NONE
, NONE
,
329 static const unsigned char johabjamo_choseong
[32] = {
330 NONE
, FILL
, 0x31, 0x32, 0x34, 0x37, 0x38, 0x39,
331 0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49,
332 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE
, NONE
, NONE
,
333 NONE
, NONE
, NONE
, NONE
, NONE
, NONE
, NONE
, NONE
,
335 static const unsigned char johabjamo_jungseong
[32] = {
336 NONE
, NONE
, FILL
, 0x4f, 0x50, 0x51, 0x52, 0x53,
337 NONE
, NONE
, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
338 NONE
, NONE
, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
339 NONE
, NONE
, 0x60, 0x61, 0x62, 0x63, NONE
, NONE
,
341 static const unsigned char johabjamo_jongseong
[32] = {
342 NONE
, FILL
, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
343 0x37, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
344 0x40, 0x41, NONE
, 0x42, 0x44, 0x45, 0x46, 0x47,
345 0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE
, NONE
,
351 unsigned char c
= IN1
, c2
;
366 unsigned char c_cho
, c_jung
, c_jong
;
367 unsigned char i_cho
, i_jung
, i_jong
;
369 c_cho
= (c
>> 2) & 0x1f;
370 c_jung
= ((c
<< 3) | c2
>> 5) & 0x1f;
373 i_cho
= johabidx_choseong
[c_cho
];
374 i_jung
= johabidx_jungseong
[c_jung
];
375 i_jong
= johabidx_jongseong
[c_jong
];
377 if (i_cho
== NONE
|| i_jung
== NONE
|| i_jong
== NONE
)
380 /* we don't use U+1100 hangul jamo yet. */
382 if (i_jung
== FILL
) {
387 johabjamo_jongseong
[c_jong
])
392 johabjamo_jungseong
[c_jung
])
397 if (i_jung
== FILL
) {
400 johabjamo_choseong
[c_cho
])
408 (i_jong
== FILL
? 0 : i_jong
))
412 /* KS X 1001 except hangul jamos and syllables */
413 if (c
== 0xdf || c
> 0xf9 ||
414 c2
< 0x31 || (c2
>= 0x80 && c2
< 0x91) ||
415 (c2
& 0x7f) == 0x7f ||
416 (c
== 0xda && (c2
>= 0xa1 && c2
<= 0xd3)))
419 unsigned char t1
, t2
;
421 t1
= (c
< 0xe0 ? 2 * (c
- 0xd9) :
423 t2
= (c2
< 0x91 ? c2
- 0x31 : c2
- 0x43);
424 t1
= t1
+ (t2
< 0x5e ? 0 : 1) + 0x21;
425 t2
= (t2
< 0x5e ? t2
: t2
- 0x5e) + 0x21;
427 TRYMAP_DEC(ksx1001
, **outbuf
, t1
, t2
);
441 MAPPING_DECONLY(ksx1001
)
442 MAPPING_ENCONLY(cp949
)
443 MAPPING_DECONLY(cp949ext
)
447 CODEC_STATELESS(euc_kr
)
448 CODEC_STATELESS(cp949
)
449 CODEC_STATELESS(johab
)
452 I_AM_A_MODULE_FOR(kr
)