1/* vi:set ts=8 sts=4 sw=4: 2 * 3 * VIM - Vi IMproved by Bram Moolenaar 4 * 5 * Do ":help uganda" in Vim to read copying and usage conditions. 6 * Do ":help credits" in Vim to see a list of people who contributed. 7 * See README.txt for an overview of the Vim source code. 8 */ 9 10#include "vim.h" 11 12#ifndef HANGUL_DEFAULT_KEYBOARD 13# define HANGUL_DEFAULT_KEYBOARD 3 14#endif 15 16#define AUTOMATA_NEW 0 17#define AUTOMATA_CORRECT 1 18#define AUTOMATA_SPECIAL 2 19#define AUTOMATA_CORRECT_NEW 3 20#define AUTOMATA_ERROR 4 21#define AUTOMATA_NULL 5 22 23#define F_F 0x1 /* �ʼ� (initial sound) */ 24#define F_M 0x2 /* �� (medial vowel) */ 25#define F_L 0x4 /* ���� (final consonant) */ 26#define F_A 0x8 /* ASCII */ 27#define F_NULL 1 28#define M_NULL 2 29#define L_NULL 1 30 31static int hangul_input_state = 0; 32static int f=F_NULL, m=M_NULL, l=L_NULL; 33static int sp=0; 34static char_u stack[20] = {0}; 35static int last_l = -1, last_ll = -1; 36static int hangul_keyboard_type = HANGUL_DEFAULT_KEYBOARD; 37 38static void convert_ks_to_3 __ARGS((const char_u *src, int *fp, int *mp, int *lp)); 39static int convert_3_to_ks __ARGS((int fv, int mv, int lv, char_u *des)); 40static int hangul_automata2 __ARGS((char_u *buf, unsigned int *c)); 41static int hangul_automata3 __ARGS((char_u *buf, unsigned int *c)); 42 43#define push(x) {stack[ sp++ ] = *(x); stack[sp++] = *((x)+1);} 44#define pop(x) {*((x) + 1) = stack[--sp]; *(x) = stack[--sp];} 45#define query(x) {*((x) + 1) = stack[sp - 1]; *(x) = stack[sp - 2];} 46 47#define convert_3_to_code convert_3_to_ks 48 49 50/**********************************************************************/ 51/****** 3 ��������� ���� ��ƾ (Routines for 3 bulsik keyboard) ******/ 52/**********************************************************************/ 53 54/* 3 ��Ŀ��� ���� ��ȯ (3 bulsik keyboard conversion) */ 55 56static char_u value_table_for_3[] = 57{ 58 24 , '"' , '#' , '$' , '%' , '&' , /* ! " # $ % & */ 59 18 , '(' , ')' , '*' , '+' , ',' , /* ' ( ) * + , */ 60 '-' , '.' , 13 , 17 , 29 , 22 , /* - . / 0 1 2 */ 61 19 , 19 , 26 , 5 , 12 , 28 , /* 3 4 5 6 7 8 */ 62 20 , ':' , 9 , '2' , '=' , '3' , /* 9 : ; < = > */ 63 '?' , '@' , 8 , '!' , 11 , 10 , /* ? @ A B C D */ 64 26 , 3 , '/' , 39 , '8' , '4' , /* E F G H I J */ 65 '5' , '6' , '1' , '0' , '9' , '>' , /* K L M N O P */ 66 28 , 6 , 7 , ';' , '7' , 16 , /* Q R S T U V */ 67 27 , 20 , '<' , 25 , '[' , 92 , /* W X Y Z [ \ */ 68 ']' , '^' , '_' , '`' , 23 , 20 , /* ] ^ _ ` a b */ 69 10 , 29 , 11 , 3 , 27 , 4 , /* c d e f g h */ 70 8 , 13 , 2 , 14 , 20 , 11 , /* i j k l m n */ 71 16 , 19 , 21 , 4 , 5 , 7 , /* o p q r s t */ 72 5 , 13 , 9 , 2 , 7 , 17 , /* u v w x y z */ 73}; 74 75static short_u kind_table_for_3[] = 76{ 77 F_L, F_A, F_A, F_A, F_A, F_A, /* ! " # $ % & */ 78 F_F, F_A, F_A, F_A, F_A, F_A, /* ' ( ) * + , */ 79 F_A, F_A, F_M, F_F, F_L, F_L, /* - . / 0 1 2 */ 80 F_L, F_M, F_M, F_M, F_M, F_M, /* 3 4 5 6 7 8 */ 81 F_M, F_A, F_F, F_A, F_A, F_A, /* 9 : ; < = > */ 82 F_A, F_A, F_L, F_A, F_L, F_L, /* ? @ A B C D */ 83 F_L, F_L, F_A, F_A, F_A, F_A, /* E F G H I J */ 84 F_A, F_A, F_A, F_A, F_A, F_A, /* K L M N O P */ 85 F_L, F_M, F_L, F_A, F_A, F_L, /* Q R S T U V */ 86 F_L, F_L, F_A, F_L, F_A, F_A, /* W X Y Z [ \ */ 87 F_A, F_A, F_A, F_A, F_L, F_M, /* ] ^ _ ` a b */ 88 F_M, F_M, F_M, F_M, F_M, F_F, /* c d e f g h */ 89 F_F, F_F, F_F, F_F, F_F, F_F, /* i j k l m n */ 90 F_F, F_F, F_L, F_M, F_L, F_M, /* o p q r s t */ 91 F_F, F_M, F_L, F_L, F_F, F_L, /* u v w x y z */ 92}; 93 94/* 3 ��Ŀ��� (�����ʼ�, �Է¿���) -> �����ʼ� ó�� 95 * 3 bulsik: (current initial sound, input english) -> compound initial sound. 96 */ 97 98 static int 99comfcon3(v, c) 100 int v; 101 int c; 102{ 103 if (v == 2 && c == 2) 104 return 3; 105 if (v == 5 && c == 5) 106 return 6; 107 if (v == 9 && c == 9) 108 return 10; 109 if (v == 11 && c == 11) 110 return 12; 111 if (v == 14 && c == 14) 112 return 15; 113 return 0; 114} 115 116/* 3 ��Ŀ��� (�������, �Է� ����) -> ���� ���� ó�� 117 * 3 bulsik: (current vowel, input english) -> compound vowel. 118 */ 119 120 static int 121comvow3(v, c) 122 int v; 123 int c; 124{ 125 switch (v) 126 { 127 case 13: /* �� */ 128 switch (c) { 129 case 3: /* �Ǥ� */ 130 return 14; 131 case 4: /* �Ǥ� */ 132 return 15; 133 case 29: /* �Ǥ� */ 134 return 18; 135 } 136 break; 137 138 case 20: /* �� */ 139 switch (c) { 140 case 7: /* �̤� */ 141 return 21; 142 case 10: /* �̤� */ 143 return 22; 144 case 29: /* �̤� */ 145 return 23; 146 } 147 break; 148 149 /* 3 ��� ������ �Ѥ� �� �����Ƿ� ... */ 150 } 151 return 0; 152} 153 154/* 3 ��Ŀ��� (���� ��ħ, ������ �Է�) -> ��ħ 155 * 3 bulsik: (current prop(?), input english) -> prop(?). 156 * I want to say, the 'prop' is similar to 'final consonant', but not vowel. 157 * (I cannot find the real english from my dictionary. Sorry!) 158 * VIM: V = initial sound, I = medial vowel, M = final consonant. 159 */ 160 161 static int 162comcon3(k, c) 163 int k; 164 int c; 165{ 166 switch (k) 167 { 168 case 2: /* �� */ 169 switch (c) { 170 case 2: 171 return 3; /* ���� */ 172 case 21: 173 return 4; /* ���� */ 174 } 175 break; 176 177 case 5: /* �� */ 178 switch (c) { 179 case 24: /* ���� */ 180 return 6; 181 case 29: 182 return 7; /* ���� */ 183 } 184 break; 185 186 case 9: /* �� */ 187 switch (c) { 188 case 2: /* ���� */ 189 return 10; 190 case 17: /* ���� */ 191 return 11; 192 case 19: /* ���� */ 193 return 12; 194 case 21: /* ���� */ 195 return 13; 196 case 27: /* ���� */ 197 return 14; 198 case 28: /* ���� */ 199 return 15; 200 case 29: /* ���� */ 201 return 16; 202 } 203 break; 204 205 case 19: 206 switch (c) { 207 case 21: /* ���� */ 208 return 20; 209 } 210 break; 211 } 212 return 0; 213} 214 215/**********************************************************************/ 216/****** 2 ��������� ���� ��ƾ (Routines for 2 bulsik keyboard) ******/ 217/**********************************************************************/ 218 219 static int 220kind_table_for_2(c) 221 int c; 222{ 223 static char_u table[] = 224 { 225 /* a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s */ 226 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 227 /* t, u, v, w, x, y, z */ 228 0, 1, 0, 0, 0, 1, 0 229 }; 230 231 if (c <= 'Z') 232 c -= 'A'; 233 else 234 c -= 'a'; 235 236 return table[c]; 237} 238 239/* 2 ��Ŀ��� ������ -> ������ �ʼ� ��ȯ 240 * (2 bulsik: conversion english char. to initial sound of compound type) 241 * ���: �ʼ��� �ƴϸ� 0 (If it is not initial sound, return 0). 242 */ 243 static int 244fcon(c) 245 int c; 246{ 247 static char_u table[] = 248 { 249 /*E */ 6 , /*F */ 0 , /*G */ 0 , /*H */ 0 , /*I */ 0 , /*J */ 0 , /*K */ 0 , 250 /*L */ 0 , /*M */ 0 , /*N */ 0 , /*O */ 0 , /*P */ 0 , /*Q */ 10, /*R */ 3 , 251 /*S */ 0 , /*T */ 12, /*U */ 0 , /*V */ 0 , /*W */ 15, /*X */ 0 , /*Y */ 0 , 252 /*Z */ 0 , /*[ */ 0 , /*\ */ 0 , /*] */ 0 , /*^ */ 0 , /*_ */ 0 , /*` */ 0 , 253 /*a */ 8 , /*b */ 0 , /*c */ 16, /*d */ 13, /*e */ 5 , /*f */ 7 , /*g */ 20, 254 /*h */ 0 , /*i */ 0 , /*j */ 0 , /*k */ 0 , /*l */ 0 , /*m */ 0 , /*n */ 0 , 255 /*o */ 0 , /*p */ 0 , /*q */ 9 , /*r */ 2 , /*s */ 4 , /*t */ 11, /*u */ 0 , 256 /*v */ 19, /*w */ 14, /*x */ 18, /*y */ 0 , /*z */ 17 257 }; 258 259 if (c < 'E' || c > 'z') 260 return 0; 261 return table[c - 'E']; 262} 263 264/* 2 ��Ŀ��� ������ -> �� ��ȯ 265 * (2 bulsik: conversion english char. to medial vowel) 266 * ���: ���� �ƴϸ� 0 (If it is not medial vowel, return 0). 267 */ 268 static int 269vow(c) 270 int c; 271{ 272 static char_u table[] = 273 { 274 /*O */ 6 , /*P */ 12, /*Q */ 0 , /*R */ 0 , /*S */ 0 , /*T */ 0 , /*U */ 0 , 275 /*V */ 0 , /*W */ 0 , /*X */ 0 , /*Y */ 0 , /*Z */ 0 , /*[ */ 0 , /*\ */ 0 , 276 /*] */ 0 , /*^ */ 0 , /*_ */ 0 , /*` */ 0 , /*a */ 0 , /*b */ 26, /*c */ 0 , 277 /*d */ 0 , /*e */ 0 , /*f */ 0 , /*g */ 0 , /*h */ 13, /*i */ 5 , /*j */ 7 , 278 /*k */ 3 , /*l */ 29, /*m */ 27, /*n */ 20, /*o */ 4 , /*p */ 10, /*q */ 0 , 279 /*r */ 0 , /*s */ 0 , /*t */ 0 , /*u */ 11, /*v */ 0 , /*w */ 0 , /*x */ 0 , 280 /*y */ 19}; 281 282 if (c < 'O' || c > 'y') 283 return 0; 284 return table[c - 'O']; 285} 286 287/* 2��Ŀ��� ������ -> ��ħ ��ȯ 288 * (2 bulsik: conversion english char. to prop) 289 * ���: ��ħ�� �ƴϸ� 0 (If not prop, return 0) 290 */ 291 static int 292lcon(c) 293 int c; 294{ 295 static char_u table[] = 296 { 297 /*R */ 3 , /*S */ 0 , /*T */ 22, /*U */ 0 , /*V */ 0 , /*W */ 0 , /*X */ 0 , 298 /*Y */ 0 , /*Z */ 0 , /*[ */ 0 , /*\ */ 0 , /*] */ 0 , /*^ */ 0 , /*_ */ 0 , 299 /*` */ 0 , /*a */ 17, /*b */ 0 , /*c */ 25, /*d */ 23, /*e */ 8 , /*f */ 9 , 300 /*g */ 29, /*h */ 0 , /*i */ 0 , /*j */ 0 , /*k */ 0 , /*l */ 0 , /*m */ 0 , 301 /*n */ 0 , /*o */ 0 , /*p */ 0 , /*q */ 19, /*r */ 2 , /*s */ 5 , /*t */ 21, 302 /*u */ 0 , /*v */ 28, /*w */ 24, /*x */ 27, /*y */ 0 , /*z */ 26 303 }; 304 305 if (c < 'R' || c > 'z') 306 return 0; 307 return table[c - 'R']; 308} 309 310/* 2 ��Ŀ��� (���� ��ħ, ������ �Է�) -> ��ħ ��ȯ 311 * (2 bulsik: conversion (curr. prop, input english) to prop) 312 */ 313 314 static int 315comcon2(k, c) 316 int k; 317 int c; 318{ 319 switch (k) 320 { 321 case 2: /* �� */ 322 switch (c) { 323 case 't': 324 return 4; /* ���� */ 325 } 326 break; 327 328 case 5: /* �� */ 329 switch (c) { 330 case 'w': /* ���� */ 331 return 6; 332 case 'g': /* ���� */ 333 return 7; 334 } 335 break; 336 337 case 9: /* �� */ 338 switch (c) { 339 case 'r': /* ���� */ 340 return 10; 341 case 'a': /* ���� */ 342 return 11; 343 case 'q': /* ���� */ 344 return 12; 345 case 't': /* ���� */ 346 return 13; 347 case 'x': /* ���� */ 348 return 14; 349 case 'v': /* ���� */ 350 return 15; 351 case 'g': /* ���� */ 352 return 16; 353 } 354 break; 355 356 case 19: /* �� */ 357 switch (c) { 358 case 't': /* ���� */ 359 return 20; 360 } 361 break; 362 } 363 return 0; 364} 365 366/* 2��Ŀ��� (���� ��, ���� �Է�) -> �� ��ȯ 367 * (2 bulsik: conversion (curr. medial vowel, input english) to medial 368 * vowel) 369 */ 370 371 static int 372comvow2(v, c) 373 int v; 374 int c; 375{ 376 switch (v) 377 { 378 case 13: /* �� */ 379 switch (c) { 380 case 'k': /* �Ǥ� */ 381 return 14; 382 case 'o': /* �Ǥ� */ 383 return 15; 384 case 'l': /* �Ǥ� */ 385 return 18; 386 } 387 break; 388 389 case 20: /* �� */ 390 switch (c) { 391 case 'j': /* �̤� */ 392 return 21; 393 case 'p': /* �̤� */ 394 return 22; 395 case 'l': /* �̤� */ 396 return 23; 397 } 398 break; 399 400 case 27: /* �� */ 401 switch (c) { 402 case 'l': /* �Ѥ� */ 403 return 28; 404 } 405 break; 406 } 407 return 0; 408} 409 410 int 411hangul_input_state_get() 412{ 413 return hangul_input_state; 414} 415 416 void 417hangul_input_state_set(state) 418 int state; 419{ 420 hangul_input_state = state; 421 hangul_input_clear(); 422} 423 424 int 425im_get_status() 426{ 427 return hangul_input_state_get(); 428} 429 430 void 431hangul_input_state_toggle() 432{ 433 if (hangul_input_state_get()) 434 { 435 hangul_input_state_set(0); 436 if (composing_hangul) 437 { 438 push_raw_key(composing_hangul_buffer, 2); 439 composing_hangul = 0; 440 } 441 } 442 else 443 hangul_input_state_set(1); 444 445 if (showmode()) 446 { 447 setcursor(); 448 out_flush(); 449 } 450 451 gui_update_cursor(TRUE, FALSE); 452} 453 454 static int 455hangul_automata2(buf, c) 456 char_u *buf; 457 int_u *c; 458{ 459 int t,t2; 460 461 if (*c == BS) 462 { 463 if (sp == 0) 464 return AUTOMATA_SPECIAL; 465 else if (sp < 4) 466 { 467 hangul_input_clear(); 468 return AUTOMATA_NULL; 469 } 470 pop(buf); 471 query(buf); 472 convert_ks_to_3(buf, &f, &m, &l); 473 last_l = last_ll; 474 last_ll = -1; 475 return AUTOMATA_CORRECT; 476 } 477 if ((!(*c >= 'A' && *c <= 'Z')) && (!(*c >= 'a' && *c <= 'z'))) 478 { 479 hangul_input_clear(); 480 return AUTOMATA_SPECIAL; 481 } 482 t = *c; 483 switch (kind_table_for_2(t)) 484 { 485 case 0: /* ���� (consonant) */ 486 if (f == F_NULL) 487 { 488 if (m != M_NULL) 489 hangul_input_clear(); 490 f = fcon(t); 491 convert_3_to_code(f, M_NULL, L_NULL, buf); 492 push(buf); 493 last_ll = last_l = -1; 494 return AUTOMATA_NEW; 495 } 496 if (m == M_NULL) 497 return AUTOMATA_ERROR; 498 if (l == L_NULL) 499 { 500 t2 = lcon(t); 501 if (!t2) /* ��ħ���� ���������ʴ� (cannot use it as a prop) */ 502 { 503 hangul_input_clear(); 504 last_ll = last_l = -1; 505 f = fcon(t); 506 convert_3_to_code(f, m, l, buf); 507 push(buf); 508 return AUTOMATA_NEW; 509 } 510 if (2 == convert_3_to_code(f, m, t2, buf)) 511 { 512 last_ll = -1; 513 last_l = t; 514 l = t2; 515 push(buf); 516 return AUTOMATA_CORRECT; 517 } 518 else /* ��ħ���� �����Ͽ����� code�� ��� �����̴� */ 519 { /* cannot find such a prop in the code table */ 520 last_ll = last_l = -1; 521 hangul_input_clear(); 522 f = fcon(t); 523 convert_3_to_code(f, m, l, buf); 524 push(buf); 525 return AUTOMATA_NEW; 526 } 527 } 528 /* �� �� ������ ��� ���߾��� �ִ� 529 * I have all the 'initial sound' and 'medial vowel' and 'final 530 * consonant'. 531 */ 532 t2 = comcon2(l, t); 533 if (t2) 534 { 535 if (2 == convert_3_to_code(f, m, t2, buf)) 536 { 537 l = t2; 538 last_ll = last_l; 539 last_l = t; 540 push(buf); 541 return AUTOMATA_CORRECT; 542 } 543 } 544 last_ll = last_l = -1; 545 hangul_input_clear(); 546 f = fcon(t); 547 convert_3_to_code(f, m, l, buf); 548 push(buf); 549 return AUTOMATA_NEW; 550 551 case 1: 552 if (f == F_NULL) 553 { 554 hangul_input_clear(); 555 m = vow(t); 556 convert_3_to_code (f, m, L_NULL, buf); 557 push (buf); 558 last_ll = last_l = -1; 559 return AUTOMATA_NEW; 560 } 561 if (m == M_NULL) 562 { 563 m = vow(t); 564 if (2 == convert_3_to_code(f, m, L_NULL, buf)) 565 { 566 last_ll = last_l = -1; 567 push(buf); 568 return AUTOMATA_CORRECT; 569 } 570 m = M_NULL; 571 return AUTOMATA_ERROR; 572 } 573 if (l == L_NULL) 574 { 575 t2 = comvow2(m, t); 576 if (t2) 577 { 578 if (2 != convert_3_to_code(f, t2, L_NULL, buf)) 579 return AUTOMATA_ERROR; 580 581 m = t2; 582 push(buf); 583 last_ll = last_l = -1; 584 return AUTOMATA_CORRECT; 585 } 586 return AUTOMATA_ERROR; 587 } 588 pop(buf); 589 pop(buf); 590 sp = 0; 591 if (last_l == -1) 592 { 593 /* ��... �̰� �ʿ��ϳ�?? (Hmm... Is it needed?) */ 594 convert_ks_to_3(buf, &f, &m, &l); 595 } 596 else 597 { 598 char_u tmp[3]; 599 f = fcon(last_l); 600 convert_3_to_code (f, M_NULL, L_NULL, tmp); 601 push (tmp); 602 } 603 m = vow(t); 604 l = L_NULL; 605 convert_3_to_code(f, m, l, buf + 2); 606 push(buf + 2); 607 return AUTOMATA_CORRECT_NEW; 608 609 default: 610 EMSG(_("E256: Hangul automata ERROR")); 611 break; 612 } 613 return AUTOMATA_ERROR; /* RrEeAaLlLlYy EeRrRrOoRr */ 614} 615 616 static int 617hangul_automata3(buf, c) 618 char_u *buf; 619 int_u *c; 620{ 621 int t, t2; 622 623 if (*c >= '!' && *c <= 'z') 624 { 625 *c -= '!'; 626 t = value_table_for_3[*c]; 627 switch (kind_table_for_3[*c]) 628 { 629 case F_F: /* �ʼ����� (char. of an initial sound) */ 630 if (m != M_NULL || sp == 0) 631 { 632 /* �ʼ��� ���ų� ���� ���� ������ ���� 633 * Empty 'initial sound', so starting automata. 634 */ 635 hangul_input_clear(); 636 f = t; 637 convert_3_to_code(f, M_NULL, L_NULL, buf); 638 push(buf); 639 return AUTOMATA_NEW; 640 } 641 if ((t2 = comfcon3(f,t)) != 0) /* ������ (double? consonant) */ 642 { 643 f=t2; 644 convert_3_to_code(f, M_NULL, L_NULL, buf); 645 push(buf); 646 return AUTOMATA_CORRECT; 647 } 648 return AUTOMATA_ERROR; 649 650 case F_M: /* ���� (vowel) */ 651 if (m == M_NULL) 652 { 653 if (2 != convert_3_to_code(f, t, L_NULL,buf)) 654 return AUTOMATA_ERROR; 655 656 m = t; 657 push(buf); 658 if (f == F_NULL) 659 return AUTOMATA_NEW; 660 else 661 return AUTOMATA_CORRECT; 662 } 663 if ((t2 = comvow3(m,t))) /* ������ (a diphthong) */ 664 { 665 m = t2; 666 convert_3_to_code(f, m, L_NULL, buf); 667 push(buf); 668 return AUTOMATA_CORRECT; 669 } 670 return AUTOMATA_ERROR; 671 672 case F_L: /* ��ħ (prop?) */ 673 if (m == M_NULL) 674 return AUTOMATA_ERROR; /* ����� ���� */ 675 if (l == L_NULL) 676 { 677 if (2 != convert_3_to_code(f, m, t, buf)) 678 { 679 l = L_NULL; 680 return AUTOMATA_ERROR; 681 } 682 push(buf); 683 l = t; 684 return AUTOMATA_CORRECT; 685 } 686 if ((t2 = comcon3(l,t)) != 0) /* �� ��ħ ?? (double prop?) */ 687 { 688 if (2 != convert_3_to_code(f, m, t2, buf)) 689 return AUTOMATA_ERROR; 690 691 push(buf); 692 l = t2; 693 return AUTOMATA_CORRECT; 694 } 695 return AUTOMATA_ERROR; 696 697 case F_A: /* Ư�����ڳ� ���� (special char. or number) */ 698 hangul_input_clear(); 699 *c = t; 700 return AUTOMATA_SPECIAL; 701 } 702 } 703 if (*c == BS) 704 { 705 if (sp >= 4) 706 { 707 pop(buf); 708 pop(buf); 709 convert_ks_to_3(buf, &f, &m, &l); 710 push(buf); 711 return AUTOMATA_CORRECT; 712 } 713 else if (sp == 0) 714 { 715 return AUTOMATA_SPECIAL; 716 } 717 else 718 { 719 hangul_input_clear(); 720 return AUTOMATA_NULL; 721 } 722 } 723 hangul_input_clear(); 724 return AUTOMATA_SPECIAL; 725} 726 727 void 728hangul_keyboard_set() 729{ 730 int keyboard; 731 char *s; 732 733 hangul_input_clear(); 734 735 if ((s = getenv("VIM_KEYBOARD")) == NULL) 736 s = getenv("HANGUL_KEYBOARD_TYPE"); 737 738 if (s) 739 { 740 if (*s == '2') 741 keyboard = 2; 742 else 743 keyboard = 3; 744 hangul_keyboard_type = keyboard; 745 } 746} 747 748 int 749hangul_input_process(s, len) 750 char_u *s; 751 int len; 752{ 753 int n; 754 unsigned int c; 755 char_u hanbuf[20]; 756 757 if (len == 1) 758 /* normal key press */ 759 c = *s; 760 else if (len == 3 && s[0] == CSI && s[1] == 'k' && s[2] == 'b') 761 { 762 /* backspace */ 763 if (composing_hangul) 764 c = Ctrl_H; 765 else 766 return len; 767 } 768 else 769 { 770 if (composing_hangul) 771 push_raw_key(composing_hangul_buffer, 2); 772 hangul_input_clear(); 773 composing_hangul = 0; 774 return len; 775 } 776 777 if (hangul_keyboard_type == 2) 778 n = hangul_automata2(hanbuf, &c); 779 else 780 n = hangul_automata3(hanbuf, &c); 781 782 if (n == AUTOMATA_CORRECT) 783 { 784 STRNCPY(composing_hangul_buffer, hanbuf, 2); 785 gui_update_cursor(TRUE, FALSE); 786 return 0; 787 } 788 else if (n == AUTOMATA_NEW) 789 { 790 if (composing_hangul) 791 push_raw_key(composing_hangul_buffer, 2); 792 STRNCPY(composing_hangul_buffer, hanbuf, 2); 793 composing_hangul = 1; 794 gui_update_cursor(TRUE, FALSE); 795 return 0; 796 } 797 else if (n == AUTOMATA_CORRECT_NEW) 798 { 799 if (composing_hangul) 800 push_raw_key(hanbuf, 2); 801 STRNCPY(composing_hangul_buffer, hanbuf+2, 2); 802 composing_hangul = 1; 803 gui_update_cursor(TRUE, FALSE); 804 return 0; 805 } 806 else if (n == AUTOMATA_NULL) 807 { 808 composing_hangul = 0; 809 gui_redraw_block(gui.cursor_row, gui.cursor_col, 810 gui.cursor_row, gui.cursor_col + 1, 811 GUI_MON_NOCLEAR); 812 gui_update_cursor(TRUE, FALSE); 813 return 0; 814 } 815 else if (n == AUTOMATA_SPECIAL) 816 { 817 if (composing_hangul) 818 { 819 push_raw_key(composing_hangul_buffer, 2); 820 composing_hangul = 0; 821 } 822 *s = c; 823 return 1; 824 } 825 else if (n == AUTOMATA_ERROR) 826 { 827 vim_beep(); 828 return 0; 829 } 830 return len; 831} 832 833 void 834hangul_input_clear() 835{ 836 sp = 0; 837 f = F_NULL; 838 m = M_NULL; 839 l = L_NULL; 840} 841 842#define han_index(h, l) (((h)-0xb0)*(0xff-0xa1)+((l)-0xa1)) 843 844static const char_u ks_table1[][3] = 845{ 846 { 2, 3, 1}, { 2, 3, 2}, { 2, 3, 5}, { 2, 3, 8}, 847 { 2, 3, 9}, { 2, 3, 10}, { 2, 3, 11}, { 2, 3, 17}, 848 { 2, 3, 19}, { 2, 3, 20}, { 2, 3, 21}, { 2, 3, 22}, 849 { 2, 3, 23}, { 2, 3, 24}, { 2, 3, 25}, { 2, 3, 27}, 850 { 2, 3, 28}, { 2, 3, 29}, { 2, 4, 1}, { 2, 4, 2}, 851 { 2, 4, 5}, { 2, 4, 9}, { 2, 4, 17}, { 2, 4, 19}, 852 { 2, 4, 21}, { 2, 4, 22}, { 2, 4, 23}, { 2, 5, 1}, 853 { 2, 5, 2}, { 2, 5, 5}, { 2, 5, 9}, { 2, 5, 21}, 854 { 2, 5, 23}, { 2, 6, 1}, { 2, 6, 5}, { 2, 6, 9}, 855 { 2, 7, 1}, { 2, 7, 2}, { 2, 7, 5}, { 2, 7, 8}, 856 { 2, 7, 9}, { 2, 7, 11}, { 2, 7, 17}, { 2, 7, 19}, 857 { 2, 7, 21}, { 2, 7, 22}, { 2, 7, 23}, { 2, 7, 24}, 858 { 2, 7, 27}, { 2, 7, 28}, { 2, 7, 29}, { 2, 10, 1}, 859 { 2, 10, 5}, { 2, 10, 9}, { 2, 10, 17}, { 2, 10, 19}, 860 { 2, 10, 21}, { 2, 10, 22}, { 2, 10, 23}, { 2, 11, 1}, 861 { 2, 11, 2}, { 2, 11, 3}, { 2, 11, 5}, { 2, 11, 8}, 862 { 2, 11, 9}, { 2, 11, 17}, { 2, 11, 19}, { 2, 11, 21}, 863 { 2, 11, 22}, { 2, 11, 23}, { 2, 11, 27}, { 2, 12, 1}, 864 { 2, 12, 5}, { 2, 12, 9}, { 2, 12, 19}, { 2, 12, 21}, 865 { 2, 13, 1}, { 2, 13, 2}, { 2, 13, 5}, { 2, 13, 8}, 866 { 2, 13, 9}, { 2, 13, 11}, { 2, 13, 13}, { 2, 13, 16}, 867 { 2, 13, 17}, { 2, 13, 19}, { 2, 13, 21}, { 2, 13, 23}, 868 { 2, 13, 24}, { 2, 14, 1}, { 2, 14, 2}, { 2, 14, 5}, 869 { 2, 14, 9}, { 2, 14, 11}, { 2, 14, 17}, { 2, 14, 19}, 870 { 2, 14, 21}, { 2, 14, 23}, { 2, 15, 1}, { 2, 15, 5}, 871 { 2, 15, 9}, { 2, 15, 19}, { 2, 15, 22}, { 2, 15, 23}, 872 { 2, 18, 1}, { 2, 18, 2}, { 2, 18, 5}, { 2, 18, 9}, 873 { 2, 18, 17}, { 2, 18, 19}, { 2, 18, 21}, { 2, 18, 23}, 874 { 2, 19, 1}, { 2, 19, 5}, { 2, 19, 9}, { 2, 19, 19}, 875 { 2, 19, 21}, { 2, 20, 1}, { 2, 20, 2}, { 2, 20, 5}, 876 { 2, 20, 8}, { 2, 20, 9}, { 2, 20, 10}, { 2, 20, 11}, 877 { 2, 20, 16}, { 2, 20, 17}, { 2, 20, 19}, { 2, 20, 21}, 878 { 2, 20, 23}, { 2, 20, 24}, { 2, 21, 1}, { 2, 21, 2}, 879 { 2, 21, 5}, { 2, 21, 9}, { 2, 21, 22}, { 2, 21, 23}, 880 { 2, 22, 1}, { 2, 22, 21}, { 2, 23, 1}, { 2, 23, 2}, 881 { 2, 23, 5}, { 2, 23, 9}, { 2, 23, 17}, { 2, 23, 19}, 882 { 2, 23, 21}, { 2, 26, 1}, { 2, 26, 5}, { 2, 26, 9}, 883 { 2, 27, 1}, { 2, 27, 2}, { 2, 27, 5}, { 2, 27, 8}, 884 { 2, 27, 9}, { 2, 27, 10}, { 2, 27, 17}, { 2, 27, 19}, 885 { 2, 27, 21}, { 2, 27, 23}, { 2, 28, 1}, { 2, 29, 1}, 886 { 2, 29, 2}, { 2, 29, 5}, { 2, 29, 8}, { 2, 29, 9}, 887 { 2, 29, 11}, { 2, 29, 17}, { 2, 29, 19}, { 2, 29, 21}, 888 { 2, 29, 23}, { 2, 29, 24}, { 2, 29, 28}, { 3, 3, 1}, 889 { 3, 3, 2}, { 3, 3, 3}, { 3, 3, 5}, { 3, 3, 9}, 890 { 3, 3, 11}, { 3, 3, 17}, { 3, 3, 19}, { 3, 3, 21}, 891 { 3, 3, 22}, { 3, 3, 23}, { 3, 3, 27}, { 3, 4, 1}, 892 { 3, 4, 2}, { 3, 4, 5}, { 3, 4, 9}, { 3, 4, 17}, 893 { 3, 4, 19}, { 3, 4, 21}, { 3, 4, 22}, { 3, 4, 23}, 894 { 3, 5, 1}, { 3, 5, 2}, { 3, 5, 9}, { 3, 7, 1}, 895 { 3, 7, 2}, { 3, 7, 3}, { 3, 7, 5}, { 3, 7, 9}, 896 { 3, 7, 17}, { 3, 7, 19}, { 3, 7, 21}, { 3, 7, 22}, 897 { 3, 7, 23}, { 3, 10, 1}, { 3, 10, 2}, { 3, 10, 5}, 898 { 3, 10, 17}, { 3, 10, 21}, { 3, 10, 23}, { 3, 11, 1}, 899 { 3, 11, 5}, { 3, 11, 9}, { 3, 11, 21}, { 3, 11, 22}, 900 { 3, 11, 27}, { 3, 12, 1}, { 3, 13, 1}, { 3, 13, 2}, 901 { 3, 13, 5}, { 3, 13, 7}, { 3, 13, 9}, { 3, 13, 17}, 902 { 3, 13, 19}, { 3, 13, 21}, { 3, 13, 23}, { 3, 13, 24}, 903 { 3, 13, 25}, { 3, 14, 1}, { 3, 14, 2}, { 3, 14, 9}, 904 { 3, 14, 22}, { 3, 14, 23}, { 3, 15, 1}, { 3, 15, 2}, 905 { 3, 15, 23}, { 3, 18, 1}, { 3, 18, 5}, { 3, 18, 9}, 906 { 3, 18, 17}, { 3, 18, 19}, { 3, 18, 23}, { 3, 19, 1}, 907 { 3, 20, 1}, { 3, 20, 2}, { 3, 20, 5}, { 3, 20, 9}, 908 { 3, 20, 16}, { 3, 20, 17}, { 3, 20, 19}, { 3, 20, 21}, 909 { 3, 20, 23}, { 3, 20, 24}, { 3, 21, 1}, { 3, 21, 9}, 910 { 3, 21, 22}, { 3, 21, 23}, { 3, 22, 1}, { 3, 22, 2}, 911 { 3, 22, 5}, { 3, 22, 9}, { 3, 22, 17}, { 3, 22, 19}, 912 { 3, 22, 22}, { 3, 23, 1}, { 3, 23, 5}, { 3, 23, 9}, 913 { 3, 23, 17}, { 3, 23, 19}, { 3, 26, 1}, { 3, 27, 1}, 914 { 3, 27, 2}, { 3, 27, 5}, { 3, 27, 7}, { 3, 27, 9}, 915 { 3, 27, 11}, { 3, 27, 16}, { 3, 27, 17}, { 3, 27, 19}, 916 { 3, 27, 21}, { 3, 27, 23}, { 3, 27, 27}, { 3, 29, 1}, 917 { 3, 29, 2}, { 3, 29, 5}, { 3, 29, 9}, { 3, 29, 17}, 918 { 3, 29, 19}, { 3, 29, 21}, { 3, 29, 23}, { 4, 3, 1}, 919 { 4, 3, 2}, { 4, 3, 3}, { 4, 3, 5}, { 4, 3, 8}, 920 { 4, 3, 9}, { 4, 3, 10}, { 4, 3, 11}, { 4, 3, 17}, 921 { 4, 3, 19}, { 4, 3, 21}, { 4, 3, 22}, { 4, 3, 23}, 922 { 4, 3, 24}, { 4, 3, 25}, { 4, 3, 27}, { 4, 3, 29}, 923 { 4, 4, 1}, { 4, 4, 2}, { 4, 4, 5}, { 4, 4, 9}, 924 { 4, 4, 17}, { 4, 4, 19}, { 4, 4, 21}, { 4, 4, 22}, 925 { 4, 4, 23}, { 4, 5, 1}, { 4, 5, 2}, { 4, 5, 5}, 926 { 4, 5, 9}, { 4, 5, 17}, { 4, 5, 23}, { 4, 7, 1}, 927 { 4, 7, 2}, { 4, 7, 4}, { 4, 7, 5}, { 4, 7, 9}, 928 { 4, 7, 11}, { 4, 7, 12}, { 4, 7, 17}, { 4, 7, 19}, 929 { 4, 7, 21}, { 4, 7, 22}, { 4, 7, 23}, { 4, 7, 29}, 930 { 4, 10, 1}, { 4, 10, 2}, { 4, 10, 5}, { 4, 10, 9}, 931 { 4, 10, 17}, { 4, 10, 19}, { 4, 10, 21}, { 4, 10, 22}, 932 { 4, 10, 23}, { 4, 11, 1}, { 4, 11, 2}, { 4, 11, 5}, 933 { 4, 11, 9}, { 4, 11, 17}, { 4, 11, 19}, { 4, 11, 22}, 934 { 4, 11, 23}, { 4, 11, 26}, { 4, 12, 1}, { 4, 12, 5}, 935 { 4, 13, 1}, { 4, 13, 2}, { 4, 13, 5}, { 4, 13, 9}, 936 { 4, 13, 11}, { 4, 13, 17}, { 4, 13, 19}, { 4, 13, 21}, 937 { 4, 13, 23}, { 4, 13, 28}, { 4, 13, 29}, { 4, 14, 1}, 938 { 4, 14, 5}, { 4, 14, 9}, { 4, 14, 22}, { 4, 18, 1}, 939 { 4, 18, 5}, { 4, 18, 9}, { 4, 18, 17}, { 4, 18, 19}, 940 { 4, 18, 21}, { 4, 19, 1}, { 4, 19, 2}, { 4, 19, 5}, 941 { 4, 19, 9}, { 4, 19, 19}, { 4, 19, 21}, { 4, 19, 23}, 942 { 4, 20, 1}, { 4, 20, 2}, { 4, 20, 5}, { 4, 20, 8}, 943 { 4, 20, 9}, { 4, 20, 17}, { 4, 20, 19}, { 4, 20, 21}, 944 { 4, 20, 23}, { 4, 21, 1}, { 4, 21, 22}, { 4, 22, 1}, 945 { 4, 23, 1}, { 4, 23, 5}, { 4, 23, 9}, { 4, 23, 17}, 946 { 4, 23, 19}, { 4, 26, 1}, { 4, 26, 2}, { 4, 26, 9}, 947 { 4, 26, 17}, { 4, 26, 19}, { 4, 26, 23}, { 4, 27, 1}, 948 { 4, 27, 2}, { 4, 27, 5}, { 4, 27, 9}, { 4, 27, 10}, 949 { 4, 27, 11}, { 4, 27, 17}, { 4, 27, 19}, { 4, 27, 21}, 950 { 4, 27, 23}, { 4, 27, 24}, { 4, 27, 28}, { 4, 28, 1}, 951 { 4, 28, 5}, { 4, 28, 9}, { 4, 29, 1}, { 4, 29, 2}, 952 { 4, 29, 5}, { 4, 29, 9}, { 4, 29, 11}, { 4, 29, 17}, 953 { 4, 29, 19}, { 4, 29, 21}, { 4, 29, 23}, { 4, 29, 28}, 954 { 5, 3, 1}, { 5, 3, 2}, { 5, 3, 3}, { 5, 3, 5}, 955 { 5, 3, 8}, { 5, 3, 9}, { 5, 3, 10}, { 5, 3, 11}, 956 { 5, 3, 12}, { 5, 3, 16}, { 5, 3, 17}, { 5, 3, 19}, 957 { 5, 3, 21}, { 5, 3, 22}, { 5, 3, 23}, { 5, 3, 24}, 958 { 5, 3, 25}, { 5, 3, 29}, { 5, 4, 1}, { 5, 4, 2}, 959 { 5, 4, 5}, { 5, 4, 9}, { 5, 4, 17}, { 5, 4, 19}, 960 { 5, 4, 21}, { 5, 4, 22}, { 5, 4, 23}, { 5, 5, 1}, 961 { 5, 7, 1}, { 5, 7, 2}, { 5, 7, 3}, { 5, 7, 5}, 962 { 5, 7, 8}, { 5, 7, 9}, { 5, 7, 11}, { 5, 7, 12}, 963 { 5, 7, 17}, { 5, 7, 19}, { 5, 7, 21}, { 5, 7, 23}, 964 { 5, 7, 25}, { 5, 7, 28}, { 5, 10, 1}, { 5, 10, 2}, 965 { 5, 10, 5}, { 5, 10, 9}, { 5, 10, 17}, { 5, 10, 19}, 966 { 5, 10, 21}, { 5, 10, 22}, { 5, 10, 23}, { 5, 11, 1}, 967 { 5, 11, 5}, { 5, 11, 9}, { 5, 11, 22}, { 5, 11, 23}, 968 { 5, 12, 1}, { 5, 12, 5}, { 5, 13, 1}, { 5, 13, 2}, 969 { 5, 13, 5}, { 5, 13, 8}, { 5, 13, 9}, { 5, 13, 11}, 970 { 5, 13, 13}, { 5, 13, 17}, { 5, 13, 19}, { 5, 13, 21}, 971 { 5, 13, 23}, { 5, 13, 25}, { 5, 13, 27}, { 5, 14, 1}, 972 { 5, 14, 5}, { 5, 14, 9}, { 5, 15, 1}, { 5, 15, 22}, 973 { 5, 18, 1}, { 5, 18, 5}, { 5, 18, 9}, { 5, 18, 17}, 974 { 5, 18, 19}, { 5, 18, 21}, { 5, 19, 1}, { 5, 20, 1}, 975 { 5, 20, 2}, { 5, 20, 5}, { 5, 20, 9}, { 5, 20, 17}, 976 { 5, 20, 19}, { 5, 20, 21}, { 5, 20, 23}, { 5, 21, 1}, 977 { 5, 21, 22}, { 5, 22, 1}, { 5, 22, 23}, { 5, 23, 1}, 978 { 5, 23, 5}, { 5, 23, 9}, { 5, 23, 19}, { 5, 23, 21}, 979 { 5, 23, 23}, { 5, 26, 1}, { 5, 26, 5}, { 5, 26, 9}, 980 { 5, 26, 17}, { 5, 26, 23}, { 5, 27, 1}, { 5, 27, 2}, 981 { 5, 27, 5}, { 5, 27, 8}, { 5, 27, 9}, { 5, 27, 11}, 982 { 5, 27, 17}, { 5, 27, 19}, { 5, 27, 21}, { 5, 27, 23}, 983 { 5, 28, 1}, { 5, 29, 1}, { 5, 29, 2}, { 5, 29, 5}, 984 { 5, 29, 8}, { 5, 29, 9}, { 5, 29, 17}, { 5, 29, 19}, 985 { 5, 29, 21}, { 5, 29, 22}, { 5, 29, 23}, { 5, 29, 24}, 986 { 6, 3, 1}, { 6, 3, 2}, { 6, 3, 5}, { 6, 3, 9}, 987 { 6, 3, 17}, { 6, 3, 19}, { 6, 3, 21}, { 6, 3, 22}, 988 { 6, 3, 23}, { 6, 3, 29}, { 6, 4, 1}, { 6, 4, 2}, 989 { 6, 4, 5}, { 6, 4, 9}, { 6, 4, 17}, { 6, 4, 19}, 990 { 6, 4, 21}, { 6, 4, 22}, { 6, 4, 23}, { 6, 7, 1}, 991 { 6, 7, 2}, { 6, 7, 5}, { 6, 7, 9}, { 6, 7, 11}, 992 { 6, 7, 12}, { 6, 7, 17}, { 6, 7, 19}, { 6, 7, 21}, 993 { 6, 7, 22}, { 6, 7, 23}, { 6, 7, 29}, { 6, 10, 1}, 994 { 6, 10, 2}, { 6, 10, 5}, { 6, 10, 9}, { 6, 10, 17}, 995 { 6, 10, 19}, { 6, 10, 21}, { 6, 10, 22}, { 6, 10, 23}, 996 { 6, 11, 1}, { 6, 11, 22}, { 6, 13, 1}, { 6, 13, 2}, 997 { 6, 13, 5}, { 6, 13, 9}, { 6, 13, 23}, { 6, 14, 1}, 998 { 6, 14, 9}, { 6, 15, 1}, { 6, 18, 1}, { 6, 18, 5}, 999 { 6, 20, 1}, { 6, 20, 2}, { 6, 20, 5}, { 6, 20, 9}, 1000 { 6, 20, 16}, { 6, 20, 17}, { 6, 20, 23}, { 6, 22, 1}, 1001 { 6, 23, 1}, { 6, 23, 5}, { 6, 23, 9}, { 6, 23, 17}, 1002 { 6, 23, 19}, { 6, 23, 23}, { 6, 27, 1}, { 6, 27, 2}, 1003 { 6, 27, 5}, { 6, 27, 8}, { 6, 27, 9}, { 6, 27, 17}, 1004 { 6, 27, 19}, { 6, 27, 21}, { 6, 28, 1}, { 6, 28, 5}, 1005 { 6, 28, 9}, { 6, 28, 17}, { 6, 28, 19}, { 6, 29, 1}, 1006 { 6, 29, 5}, { 6, 29, 9}, { 6, 29, 17}, { 6, 29, 19}, 1007 { 6, 29, 21}, { 6, 29, 23}, { 7, 3, 1}, { 7, 3, 2}, 1008 { 7, 3, 5}, { 7, 3, 9}, { 7, 3, 17}, { 7, 3, 19}, 1009 { 7, 3, 21}, { 7, 3, 22}, { 7, 3, 23}, { 7, 3, 24}, 1010 { 7, 3, 28}, { 7, 3, 29}, { 7, 4, 1}, { 7, 4, 2}, 1011 { 7, 4, 5}, { 7, 4, 9}, { 7, 4, 17}, { 7, 4, 19}, 1012 { 7, 4, 21}, { 7, 4, 22}, { 7, 4, 23}, { 7, 5, 1}, 1013 { 7, 5, 2}, { 7, 5, 5}, { 7, 5, 21}, { 7, 5, 23}, 1014 { 7, 7, 1}, { 7, 7, 2}, { 7, 7, 5}, { 7, 7, 9}, 1015 { 7, 7, 17}, { 7, 7, 19}, { 7, 7, 21}, { 7, 7, 22}, 1016 { 7, 7, 23}, { 7, 7, 29}, { 7, 10, 1}, { 7, 10, 2}, 1017 { 7, 10, 5}, { 7, 10, 9}, { 7, 10, 17}, { 7, 10, 19}, 1018 { 7, 10, 21}, { 7, 10, 23}, { 7, 11, 1}, { 7, 11, 2}, 1019 { 7, 11, 5}, { 7, 11, 9}, { 7, 11, 17}, { 7, 11, 19}, 1020 { 7, 11, 21}, { 7, 11, 22}, { 7, 11, 23}, { 7, 12, 1}, 1021 { 7, 12, 5}, { 7, 12, 19}, { 7, 12, 21}, { 7, 13, 1}, 1022 { 7, 13, 2}, { 7, 13, 5}, { 7, 13, 9}, { 7, 13, 17}, 1023 { 7, 13, 19}, { 7, 13, 21}, { 7, 13, 23}, { 7, 14, 1}, 1024 { 7, 14, 5}, { 7, 14, 23}, { 7, 15, 22}, { 7, 18, 1}, 1025 { 7, 18, 5}, { 7, 18, 9}, { 7, 18, 17}, { 7, 18, 19}, 1026 { 7, 18, 21}, { 7, 18, 23}, { 7, 19, 1}, { 7, 19, 5}, 1027 { 7, 19, 9}, { 7, 19, 19}, { 7, 19, 21}, { 7, 19, 23}, 1028 { 7, 20, 1}, { 7, 20, 2}, { 7, 20, 5}, { 7, 20, 9}, 1029 { 7, 20, 17}, { 7, 20, 19}, { 7, 20, 21}, { 7, 20, 23}, 1030 { 7, 21, 1}, { 7, 21, 22}, { 7, 22, 1}, { 7, 23, 1}, 1031 { 7, 23, 2}, { 7, 23, 5}, { 7, 23, 9}, { 7, 23, 17}, 1032 { 7, 23, 21}, { 7, 23, 23}, { 7, 26, 1}, { 7, 26, 2}, 1033 { 7, 26, 5}, { 7, 26, 9}, { 7, 26, 17}, { 7, 26, 19}, 1034 { 7, 26, 21}, { 7, 26, 23}, { 7, 27, 1}, { 7, 27, 2}, 1035 { 7, 27, 5}, { 7, 27, 9}, { 7, 27, 17}, { 7, 27, 19}, 1036 { 7, 27, 21}, { 7, 27, 23}, { 7, 27, 24}, { 7, 27, 27}, 1037 { 7, 27, 28}, { 7, 29, 1}, { 7, 29, 2}, { 7, 29, 5}, 1038 { 7, 29, 9}, { 7, 29, 17}, { 7, 29, 19}, { 7, 29, 21}, 1039 { 7, 29, 23}, { 8, 3, 1}, { 8, 3, 2}, { 8, 3, 5}, 1040 { 8, 3, 7}, { 8, 3, 8}, { 8, 3, 9}, { 8, 3, 10}, 1041 { 8, 3, 11}, { 8, 3, 17}, { 8, 3, 19}, { 8, 3, 21}, 1042 { 8, 3, 23}, { 8, 3, 24}, { 8, 3, 27}, { 8, 3, 29}, 1043 { 8, 4, 1}, { 8, 4, 2}, { 8, 4, 5}, { 8, 4, 9}, 1044 { 8, 4, 17}, { 8, 4, 19}, { 8, 4, 21}, { 8, 4, 22}, 1045 { 8, 4, 23}, { 8, 4, 24}, { 8, 5, 1}, { 8, 5, 2}, 1046 { 8, 5, 9}, { 8, 5, 23}, { 8, 7, 1}, { 8, 7, 2}, 1047 { 8, 7, 5}, { 8, 7, 9}, { 8, 7, 11}, { 8, 7, 17}, 1048 { 8, 7, 19}, { 8, 7, 21}, { 8, 7, 23}, { 8, 7, 24}, 1049 { 8, 7, 29}, { 8, 10, 1}, { 8, 10, 2}, { 8, 10, 5}, 1050 { 8, 10, 9}, { 8, 10, 17}, { 8, 10, 19}, { 8, 10, 21}, 1051 { 8, 10, 22}, { 8, 10, 23}, { 8, 11, 1}, { 8, 11, 2}, 1052 { 8, 11, 5}, { 8, 11, 9}, { 8, 11, 21}, { 8, 11, 22}, 1053 { 8, 11, 23}, { 8, 11, 25}, { 8, 12, 1}, { 8, 13, 1}, 1054 { 8, 13, 2}, { 8, 13, 4}, { 8, 13, 5}, { 8, 13, 9}, 1055 { 8, 13, 11}, { 8, 13, 17}, { 8, 13, 19}, { 8, 13, 21}, 1056 { 8, 13, 23}, { 8, 14, 1}, { 8, 14, 5}, { 8, 14, 22}, 1057 { 8, 14, 23}, { 8, 18, 1}, { 8, 18, 5}, { 8, 18, 9}, 1058 { 8, 18, 19}, { 8, 18, 21}, { 8, 18, 23}, { 8, 19, 1}, 1059 { 8, 19, 5}, { 8, 19, 9}, { 8, 19, 19}, { 8, 19, 21}, 1060 { 8, 20, 1}, { 8, 20, 2}, { 8, 20, 3}, { 8, 20, 5}, 1061 { 8, 20, 8}, { 8, 20, 9}, { 8, 20, 10}, { 8, 20, 11}, 1062 { 8, 20, 17}, { 8, 20, 19}, { 8, 20, 21}, { 8, 20, 23}, 1063 { 8, 20, 27}, { 8, 20, 29}, { 8, 21, 1}, { 8, 21, 5}, 1064 { 8, 21, 9}, { 8, 21, 19}, { 8, 21, 21}, { 8, 22, 1}, 1065 { 8, 23, 1}, { 8, 23, 5}, { 8, 23, 9}, { 8, 26, 1}, 1066 { 8, 26, 5}, { 8, 26, 9}, { 8, 26, 17}, { 8, 26, 21}, 1067 { 8, 27, 1}, { 8, 27, 5}, { 8, 27, 9}, { 8, 27, 17}, 1068 { 8, 27, 21}, { 8, 29, 1}, { 8, 29, 2}, { 8, 29, 5}, 1069 { 8, 29, 8}, { 8, 29, 9}, { 8, 29, 11}, { 8, 29, 17}, 1070 { 8, 29, 19}, { 8, 29, 21}, { 8, 29, 22}, { 8, 29, 23}, 1071 { 8, 29, 25}, { 8, 29, 27}, { 9, 3, 1}, { 9, 3, 2}, 1072 { 9, 3, 3}, { 9, 3, 4}, { 9, 3, 5}, { 9, 3, 8}, 1073 { 9, 3, 9}, { 9, 3, 10}, { 9, 3, 11}, { 9, 3, 12}, 1074 { 9, 3, 17}, { 9, 3, 19}, { 9, 3, 21}, { 9, 3, 23}, 1075 { 9, 3, 27}, { 9, 4, 1}, { 9, 4, 2}, { 9, 4, 5}, 1076 { 9, 4, 9}, { 9, 4, 17}, { 9, 4, 19}, { 9, 4, 21}, 1077 { 9, 4, 22}, { 9, 4, 23}, { 9, 4, 27}, { 9, 5, 1}, 1078 { 9, 5, 2}, { 9, 5, 5}, { 9, 5, 19}, { 9, 7, 1}, 1079 { 9, 7, 2}, { 9, 7, 5}, { 9, 7, 8}, { 9, 7, 9}, 1080 { 9, 7, 11}, { 9, 7, 17}, { 9, 7, 19}, { 9, 7, 21}, 1081 { 9, 7, 23}, { 9, 7, 24}, { 9, 10, 1}, { 9, 10, 2}, 1082 { 9, 10, 5}, { 9, 10, 8}, { 9, 10, 9}, { 9, 10, 17}, 1083 { 9, 10, 19}, { 9, 10, 21}, { 9, 10, 22}, { 9, 10, 23}, 1084 { 9, 11, 1}, { 9, 11, 2}, { 9, 11, 5}, { 9, 11, 9}, 1085 { 9, 11, 19}, { 9, 11, 21}, { 9, 11, 22}, { 9, 11, 23}, 1086 { 9, 11, 27}, { 9, 12, 1}, { 9, 12, 5}, { 9, 13, 1}, 1087 { 9, 13, 2}, { 9, 13, 3}, { 9, 13, 5}, { 9, 13, 9}, 1088 { 9, 13, 17}, { 9, 13, 19}, { 9, 13, 21}, { 9, 13, 23}, 1089 { 9, 14, 1}, { 9, 14, 5}, { 9, 14, 22}, { 9, 15, 1}, 1090 { 9, 15, 22}, { 9, 18, 1}, { 9, 18, 2}, { 9, 18, 5}, 1091 { 9, 18, 9}, { 9, 18, 17}, { 9, 18, 19}, { 9, 19, 1}, 1092 { 9, 19, 5}, { 9, 20, 1}, { 9, 20, 2}, { 9, 20, 5}, 1093 { 9, 20, 8}, { 9, 20, 9}, { 9, 20, 10}, { 9, 20, 11}, 1094 { 9, 20, 17}, { 9, 20, 19}, { 9, 20, 21}, { 9, 20, 23}, 1095 { 9, 20, 27}, { 9, 20, 28}, { 9, 21, 1}, { 9, 21, 9}, 1096 { 9, 21, 22}, { 9, 22, 1}, { 9, 23, 1}, { 9, 23, 2}, 1097 { 9, 23, 5}, { 9, 23, 9}, { 9, 23, 23}, { 9, 26, 1}, 1098 { 9, 26, 5}, { 9, 26, 9}, { 9, 26, 17}, { 9, 26, 21}, 1099 { 9, 26, 23}, { 9, 27, 1}, { 9, 27, 2}, { 9, 27, 5}, 1100 { 9, 27, 9}, { 9, 27, 17}, { 9, 27, 19}, { 9, 27, 21}, 1101 { 9, 29, 1}, { 9, 29, 2}, { 9, 29, 5}, { 9, 29, 9}, 1102 { 9, 29, 11}, { 9, 29, 17}, { 9, 29, 19}, { 9, 29, 21}, 1103 { 9, 29, 23}, { 9, 29, 24}, { 9, 29, 25}, { 10, 3, 1}, 1104 { 10, 3, 2}, { 10, 3, 5}, { 10, 3, 9}, { 10, 3, 11}, 1105 { 10, 3, 17}, { 10, 3, 19}, { 10, 3, 21}, { 10, 3, 22}, 1106 { 10, 3, 23}, { 10, 3, 29}, { 10, 4, 1}, { 10, 4, 2}, 1107 { 10, 4, 5}, { 10, 4, 9}, { 10, 4, 17}, { 10, 4, 19}, 1108 { 10, 4, 21}, { 10, 4, 22}, { 10, 4, 23}, { 10, 5, 1}, 1109 { 10, 5, 2}, { 10, 5, 17}, { 10, 7, 1}, { 10, 7, 2}, 1110 { 10, 7, 5}, { 10, 7, 8}, { 10, 7, 9}, { 10, 7, 17}, 1111 { 10, 7, 21}, { 10, 7, 22}, { 10, 7, 23}, { 10, 10, 1}, 1112 { 10, 10, 23}, { 10, 11, 1}, { 10, 11, 2}, { 10, 11, 17}, 1113 { 10, 11, 19}, { 10, 11, 21}, { 10, 11, 22}, { 10, 11, 23}, 1114 { 10, 13, 1}, { 10, 13, 2}, { 10, 13, 5}, { 10, 13, 9}, 1115 { 10, 13, 17}, { 10, 13, 19}, { 10, 13, 23}, { 10, 18, 1}, 1116 { 10, 19, 1}, { 10, 19, 23}, { 10, 20, 1}, { 10, 20, 2}, 1117 { 10, 20, 5}, { 10, 20, 9}, { 10, 20, 17}, { 10, 20, 21}, 1118 { 10, 20, 23}, { 10, 26, 1}, { 10, 26, 23}, { 10, 27, 1}, 1119 { 10, 27, 5}, { 10, 27, 9}, { 10, 27, 17}, { 10, 27, 19}, 1120 { 10, 29, 1}, { 10, 29, 2}, { 10, 29, 5}, { 10, 29, 9}, 1121 { 10, 29, 17}, { 10, 29, 19}, { 10, 29, 21}, { 10, 29, 23}, 1122 { 11, 3, 1}, { 11, 3, 2}, { 11, 3, 4}, { 11, 3, 5}, 1123 { 11, 3, 8}, { 11, 3, 9}, { 11, 3, 10}, { 11, 3, 11}, 1124 { 11, 3, 17}, { 11, 3, 19}, { 11, 3, 21}, { 11, 3, 22}, 1125 { 11, 3, 23}, { 11, 3, 27}, { 11, 4, 1}, { 11, 4, 2}, 1126 { 11, 4, 5}, { 11, 4, 9}, { 11, 4, 17}, { 11, 4, 19}, 1127 { 11, 4, 21}, { 11, 4, 22}, { 11, 4, 23}, { 11, 5, 1}, 1128 { 11, 5, 2}, { 11, 5, 5}, { 11, 5, 9}, { 11, 5, 17}, 1129 { 11, 5, 19}, { 11, 5, 21}, { 11, 5, 23}, { 11, 6, 1}, 1130 { 11, 6, 5}, { 11, 6, 9}, { 11, 6, 17}, { 11, 6, 23}, 1131 { 11, 7, 1}, { 11, 7, 2}, { 11, 7, 3}, { 11, 7, 4}, 1132 { 11, 7, 5}, { 11, 7, 8}, { 11, 7, 9}, { 11, 7, 11}, 1133 { 11, 7, 12}, { 11, 7, 17}, { 11, 7, 19}, { 11, 7, 21}, 1134 { 11, 7, 22}, { 11, 7, 23}, { 11, 7, 28}, { 11, 10, 1}, 1135 { 11, 10, 2}, { 11, 10, 5}, { 11, 10, 9}, { 11, 10, 17}, 1136 { 11, 10, 19}, { 11, 10, 21}, { 11, 10, 22}, { 11, 10, 23}, 1137 { 11, 11, 1}, { 11, 11, 2}, { 11, 11, 5}, { 11, 11, 9}, 1138 { 11, 11, 17}, { 11, 11, 19}, { 11, 11, 21}, { 11, 11, 22}, 1139 { 11, 11, 23}, { 11, 12, 1}, { 11, 12, 5}, { 11, 12, 9}, 1140 { 11, 12, 23}, { 11, 13, 1}, { 11, 13, 2}, { 11, 13, 3}, 1141 { 11, 13, 5}, { 11, 13, 9}, { 11, 13, 11}, { 11, 13, 17}, 1142 { 11, 13, 19}, { 11, 13, 21}, { 11, 13, 23}, { 11, 13, 27}, 1143 { 11, 14, 1}, { 11, 14, 2}, { 11, 14, 5}, { 11, 14, 9}, 1144 { 11, 14, 23}, { 11, 15, 1}, { 11, 15, 5}, { 11, 15, 9}, 1145 { 11, 15, 17}, { 11, 15, 21}, { 11, 15, 22}, { 11, 18, 1}, 1146 { 11, 18, 5}, { 11, 18, 9}, { 11, 18, 17}, { 11, 18, 19}, 1147 { 11, 18, 21}, { 11, 19, 1}, { 11, 19, 2}, { 11, 19, 5}, 1148 { 11, 19, 9}, { 11, 19, 17}, { 11, 19, 19}, { 11, 19, 21}, 1149 { 11, 19, 23}, { 11, 20, 1}, { 11, 20, 2}, { 11, 20, 5}, 1150 { 11, 20, 8}, { 11, 20, 9}, { 11, 20, 17}, { 11, 20, 19}, 1151 { 11, 20, 21}, { 11, 20, 23}, { 11, 20, 25}, { 11, 20, 27}, 1152 { 11, 20, 28}, { 11, 21, 1}, { 11, 21, 22}, { 11, 22, 1}, 1153 { 11, 22, 2}, { 11, 22, 5}, { 11, 22, 9}, { 11, 22, 17}, 1154 { 11, 22, 23}, { 11, 23, 1}, { 11, 23, 2}, { 11, 23, 5}, 1155 { 11, 23, 9}, { 11, 23, 17}, { 11, 23, 19}, { 11, 23, 21}, 1156 { 11, 23, 23}, { 11, 26, 1}, { 11, 26, 2}, { 11, 26, 9}, 1157 { 11, 26, 17}, { 11, 26, 21}, { 11, 26, 23}, { 11, 27, 1}, 1158 { 11, 27, 2}, { 11, 27, 5}, { 11, 27, 9}, { 11, 27, 10}, 1159 { 11, 27, 17}, { 11, 27, 19}, { 11, 27, 21}, { 11, 27, 23}, 1160 { 11, 29, 1}, { 11, 29, 2}, { 11, 29, 5}, { 11, 29, 8}, 1161 { 11, 29, 9}, { 11, 29, 16}, { 11, 29, 17}, { 11, 29, 19}, 1162 { 11, 29, 21}, { 11, 29, 23}, { 11, 29, 28}, { 12, 3, 1}, 1163 { 12, 3, 2}, { 12, 3, 4}, { 12, 3, 5}, { 12, 3, 9}, 1164 { 12, 3, 17}, { 12, 3, 19}, { 12, 3, 22}, { 12, 3, 23}, 1165 { 12, 3, 29}, { 12, 4, 1}, { 12, 4, 2}, { 12, 4, 5}, 1166 { 12, 4, 9}, { 12, 4, 17}, { 12, 4, 19}, { 12, 4, 22}, 1167 { 12, 4, 23}, { 12, 5, 23}, { 12, 7, 1}, { 12, 7, 2}, 1168 { 12, 7, 5}, { 12, 7, 9}, { 12, 7, 11}, { 12, 7, 17}, 1169 { 12, 7, 19}, { 12, 7, 22}, { 12, 7, 23}, { 12, 10, 1}, 1170 { 12, 10, 5}, { 12, 10, 9}, { 12, 12, 5}, { 12, 13, 1}, 1171 { 12, 13, 2}, { 12, 13, 5}, { 12, 13, 8}, { 12, 13, 9}, 1172 { 12, 13, 11}, { 12, 13, 17}, { 12, 13, 19}, { 12, 13, 23}, 1173 { 12, 14, 1}, { 12, 14, 2}, { 12, 14, 5}, { 12, 14, 22}, 1174 { 12, 15, 1}, { 12, 15, 22}, { 12, 18, 1}, { 12, 18, 5}, 1175 { 12, 18, 9}, { 12, 18, 17}, { 12, 18, 19}, { 12, 19, 1}, 1176 { 12, 20, 1}, { 12, 20, 2}, { 12, 20, 5}, { 12, 20, 9}, 1177 { 12, 20, 17}, { 12, 20, 19}, { 12, 20, 23}, { 12, 21, 1}, 1178 { 12, 21, 22}, { 12, 22, 1}, { 12, 23, 1}, { 12, 23, 5}, 1179 { 12, 26, 23}, { 12, 27, 1}, { 12, 27, 2}, { 12, 27, 5}, 1180 { 12, 27, 9}, { 12, 27, 11}, { 12, 27, 16}, { 12, 27, 17}, 1181 { 12, 27, 19}, { 12, 28, 1}, { 12, 28, 5}, { 12, 28, 9}, 1182 { 12, 28, 17}, { 12, 29, 1}, { 12, 29, 2}, { 12, 29, 5}, 1183 { 12, 29, 9}, { 12, 29, 17}, { 12, 29, 19}, { 12, 29, 21}, 1184 { 12, 29, 23}, { 13, 3, 1}, { 13, 3, 2}, { 13, 3, 5}, 1185 { 13, 3, 6}, { 13, 3, 7}, { 13, 3, 9}, { 13, 3, 10}, 1186 { 13, 3, 11}, { 13, 3, 16}, { 13, 3, 17}, { 13, 3, 19}, 1187 { 13, 3, 21}, { 13, 3, 22}, { 13, 3, 23}, { 13, 3, 27}, 1188 { 13, 3, 28}, { 13, 4, 1}, { 13, 4, 2}, { 13, 4, 5}, 1189 { 13, 4, 9}, { 13, 4, 17}, { 13, 4, 19}, { 13, 4, 21}, 1190 { 13, 4, 22}, { 13, 4, 23}, { 13, 5, 1}, { 13, 5, 2}, 1191 { 13, 5, 5}, { 13, 5, 9}, { 13, 5, 12}, { 13, 5, 17}, 1192 { 13, 5, 19}, { 13, 5, 21}, { 13, 5, 23}, { 13, 5, 27}, 1193 { 13, 5, 29}, { 13, 6, 1}, { 13, 6, 5}, { 13, 6, 9}, 1194 { 13, 6, 19}, { 13, 7, 1}, { 13, 7, 2}, { 13, 7, 5}, 1195 { 13, 7, 6}, { 13, 7, 8}, { 13, 7, 9}, { 13, 7, 10}, 1196 { 13, 7, 11}, { 13, 7, 17}, { 13, 7, 19}, { 13, 7, 20}, 1197 { 13, 7, 21}, { 13, 7, 22}, { 13, 7, 23}, { 13, 7, 24}, 1198 { 13, 7, 26}, { 13, 7, 28}, { 13, 10, 1}, { 13, 10, 2}, 1199 { 13, 10, 5}, { 13, 10, 9}, { 13, 10, 17}, { 13, 10, 19}, 1200 { 13, 10, 21}, { 13, 10, 23}, { 13, 11, 1}, { 13, 11, 2}, 1201 { 13, 11, 3}, { 13, 11, 5}, { 13, 11, 9}, { 13, 11, 11}, 1202 { 13, 11, 12}, { 13, 11, 17}, { 13, 11, 19}, { 13, 11, 20}, 1203 { 13, 11, 21}, { 13, 11, 22}, { 13, 11, 23}, { 13, 11, 27}, 1204 { 13, 11, 28}, { 13, 11, 29}, { 13, 12, 1}, { 13, 12, 5}, 1205 { 13, 12, 9}, { 13, 12, 17}, { 13, 12, 19}, { 13, 12, 21}, 1206 { 13, 12, 22}, { 13, 13, 1}, { 13, 13, 2}, { 13, 13, 5}, 1207 { 13, 13, 9}, { 13, 13, 10}, { 13, 13, 11}, { 13, 13, 13}, 1208 { 13, 13, 16}, { 13, 13, 17}, { 13, 13, 19}, { 13, 13, 21}, 1209 { 13, 13, 23}, { 13, 13, 25}, { 13, 14, 1}, { 13, 14, 2}, 1210 { 13, 14, 5}, { 13, 14, 9}, { 13, 14, 17}, { 13, 14, 19}, 1211 { 13, 14, 21}, { 13, 14, 22}, { 13, 14, 23}, { 13, 15, 1}, 1212 { 13, 15, 2}, { 13, 15, 5}, { 13, 15, 17}, { 13, 15, 21}, 1213 { 13, 15, 23}, { 13, 18, 1}, { 13, 18, 2}, { 13, 18, 5}, 1214 { 13, 18, 9}, { 13, 18, 17}, { 13, 18, 19}, { 13, 18, 21}, 1215 { 13, 18, 23}, { 13, 19, 1}, { 13, 19, 2}, { 13, 19, 5}, 1216 { 13, 19, 9}, { 13, 19, 17}, { 13, 19, 19}, { 13, 19, 21}, 1217 { 13, 19, 23}, { 13, 20, 1}, { 13, 20, 2}, { 13, 20, 5}, 1218 { 13, 20, 9}, { 13, 20, 10}, { 13, 20, 11}, { 13, 20, 17}, 1219 { 13, 20, 19}, { 13, 20, 21}, { 13, 20, 23}, { 13, 21, 1}, 1220 { 13, 21, 2}, { 13, 21, 5}, { 13, 21, 9}, { 13, 21, 17}, 1221 { 13, 21, 19}, { 13, 21, 22}, { 13, 21, 23}, { 13, 22, 1}, 1222 { 13, 22, 2}, { 13, 22, 5}, { 13, 22, 9}, { 13, 22, 17}, 1223 { 13, 22, 19}, { 13, 22, 23}, { 13, 23, 1}, { 13, 23, 2}, 1224 { 13, 23, 5}, { 13, 23, 9}, { 13, 23, 17}, { 13, 23, 19}, 1225 { 13, 23, 21}, { 13, 23, 23}, { 13, 26, 1}, { 13, 26, 2}, 1226 { 13, 26, 5}, { 13, 26, 9}, { 13, 26, 17}, { 13, 26, 19}, 1227 { 13, 26, 21}, { 13, 26, 23}, { 13, 26, 25}, { 13, 27, 1}, 1228 { 13, 27, 2}, { 13, 27, 5}, { 13, 27, 9}, { 13, 27, 15}, 1229 { 13, 27, 17}, { 13, 27, 19}, { 13, 27, 21}, { 13, 27, 23}, 1230 { 13, 27, 24}, { 13, 27, 25}, { 13, 27, 26}, { 13, 27, 27}, 1231 { 13, 27, 28}, { 13, 27, 29}, { 13, 28, 1}, { 13, 28, 5}, 1232 { 13, 28, 9}, { 13, 28, 17}, { 13, 28, 21}, { 13, 29, 1}, 1233 { 13, 29, 2}, { 13, 29, 5}, { 13, 29, 9}, { 13, 29, 10}, 1234 { 13, 29, 11}, { 13, 29, 16}, { 13, 29, 17}, { 13, 29, 19}, 1235 { 13, 29, 21}, { 13, 29, 22}, { 13, 29, 23}, { 13, 29, 24}, 1236 { 13, 29, 28}, { 14, 3, 1}, { 14, 3, 2}, { 14, 3, 5}, 1237 { 14, 3, 7}, { 14, 3, 8}, { 14, 3, 9}, { 14, 3, 11}, 1238 { 14, 3, 17}, { 14, 3, 19}, { 14, 3, 21}, { 14, 3, 22}, 1239 { 14, 3, 23}, { 14, 3, 24}, { 14, 4, 1}, { 14, 4, 2}, 1240 { 14, 4, 5}, { 14, 4, 9}, { 14, 4, 17}, { 14, 4, 19}, 1241 { 14, 4, 21}, { 14, 4, 22}, { 14, 4, 23}, { 14, 5, 1}, 1242 { 14, 5, 2}, { 14, 5, 5}, { 14, 5, 7}, { 14, 5, 9}, 1243 { 14, 5, 17}, { 14, 5, 23}, { 14, 6, 1}, { 14, 6, 5}, 1244 { 14, 6, 9}, { 14, 7, 1}, { 14, 7, 2}, { 14, 7, 5}, 1245 { 14, 7, 9}, { 14, 7, 11}, { 14, 7, 17}, { 14, 7, 19}, 1246 { 14, 7, 21}, { 14, 7, 23}, { 14, 7, 24}, { 14, 10, 1}, 1247 { 14, 10, 2}, { 14, 10, 5}, { 14, 10, 9}, { 14, 10, 17}, 1248 { 14, 10, 19}, { 14, 10, 21}, { 14, 10, 23}, { 14, 11, 1}, 1249 { 14, 11, 5}, { 14, 11, 9}, { 14, 11, 17}, { 14, 11, 19}, 1250 { 14, 11, 22}, { 14, 11, 23}, { 14, 12, 1}, { 14, 13, 1}, 1251 { 14, 13, 2}, { 14, 13, 5}, { 14, 13, 9}, { 14, 13, 11}, 1252 { 14, 13, 17}, { 14, 13, 19}, { 14, 13, 21}, { 14, 13, 23}, 1253 { 14, 13, 24}, { 14, 13, 25}, { 14, 13, 29}, { 14, 14, 1}, 1254 { 14, 14, 2}, { 14, 14, 9}, { 14, 14, 19}, { 14, 14, 21}, 1255 { 14, 14, 23}, { 14, 15, 1}, { 14, 15, 22}, { 14, 15, 23}, 1256 { 14, 18, 1}, { 14, 18, 5}, { 14, 18, 9}, { 14, 18, 17}, 1257 { 14, 18, 19}, { 14, 18, 21}, { 14, 18, 23}, { 14, 19, 1}, 1258 { 14, 19, 2}, { 14, 19, 5}, { 14, 19, 23}, { 14, 20, 1}, 1259 { 14, 20, 2}, { 14, 20, 5}, { 14, 20, 9}, { 14, 20, 10}, 1260 { 14, 20, 11}, { 14, 20, 17}, { 14, 20, 19}, { 14, 20, 21}, 1261 { 14, 20, 23}, { 14, 21, 1}, { 14, 21, 22}, { 14, 22, 1}, 1262 { 14, 23, 1}, { 14, 23, 2}, { 14, 23, 5}, { 14, 23, 9}, 1263 { 14, 23, 17}, { 14, 23, 19}, { 14, 23, 21}, { 14, 26, 1}, 1264 { 14, 26, 5}, { 14, 26, 9}, { 14, 26, 17}, { 14, 27, 1}, 1265 { 14, 27, 2}, { 14, 27, 5}, { 14, 27, 9}, { 14, 27, 17}, 1266 { 14, 27, 19}, { 14, 27, 21}, { 14, 27, 23}, { 14, 29, 1}, 1267 { 14, 29, 2}, { 14, 29, 5}, { 14, 29, 8}, { 14, 29, 9}, 1268 { 14, 29, 11}, { 14, 29, 17}, { 14, 29, 19}, { 14, 29, 21}, 1269 { 14, 29, 23}, { 14, 29, 24}, { 14, 29, 27}, { 14, 29, 28}, 1270 { 15, 3, 1}, { 15, 3, 2}, { 15, 3, 5}, { 15, 3, 7}, 1271 { 15, 3, 9}, { 15, 3, 12}, { 15, 3, 17}, { 15, 3, 19}, 1272 { 15, 3, 21}, { 15, 3, 22}, { 15, 3, 23}, { 15, 4, 1}, 1273 { 15, 4, 2}, { 15, 4, 5}, { 15, 4, 9}, { 15, 4, 17}, 1274 { 15, 4, 19}, { 15, 4, 21}, { 15, 4, 22}, { 15, 4, 23}, 1275 { 15, 5, 1}, { 15, 5, 5}, { 15, 5, 23}, { 15, 7, 1}, 1276 { 15, 7, 2}, { 15, 7, 5}, { 15, 7, 9}, { 15, 7, 17}, 1277 { 15, 7, 19}, { 15, 7, 21}, { 15, 7, 22}, { 15, 7, 23}, 1278 { 15, 10, 1}, { 15, 10, 23}, { 15, 11, 1}, { 15, 11, 22}, 1279 { 15, 13, 1}, { 15, 13, 2}, { 15, 13, 5}, { 15, 13, 9}, 1280 { 15, 13, 17}, { 15, 13, 19}, { 15, 13, 21}, { 15, 13, 23}, 1281 { 15, 13, 25}, { 15, 14, 1}, { 15, 14, 2}, { 15, 14, 9}, 1282 { 15, 14, 22}, { 15, 15, 1}, { 15, 15, 22}, { 15, 18, 1}, 1283 { 15, 18, 5}, { 15, 18, 9}, { 15, 18, 17}, { 15, 18, 19}, 1284 { 15, 19, 23}, { 15, 20, 1}, { 15, 20, 2}, { 15, 20, 5}, 1285 { 15, 20, 9}, { 15, 20, 17}, { 15, 20, 19}, { 15, 20, 23}, 1286 { 15, 21, 1}, { 15, 21, 22}, { 15, 21, 23}, { 15, 23, 1}, 1287 { 15, 26, 1}, { 15, 27, 1}, { 15, 27, 17}, { 15, 27, 21}, 1288 { 15, 27, 23}, { 15, 29, 1}, { 15, 29, 2}, { 15, 29, 5}, 1289 { 15, 29, 9}, { 15, 29, 17}, { 15, 29, 19}, { 15, 29, 23}, 1290 { 15, 29, 24}, { 15, 29, 29}, { 16, 3, 1}, { 16, 3, 2}, 1291 { 16, 3, 5}, { 16, 3, 7}, { 16, 3, 9}, { 16, 3, 17}, 1292 { 16, 3, 19}, { 16, 3, 21}, { 16, 3, 22}, { 16, 3, 23}, 1293 { 16, 3, 24}, { 16, 4, 1}, { 16, 4, 2}, { 16, 4, 5}, 1294 { 16, 4, 9}, { 16, 4, 17}, { 16, 4, 19}, { 16, 4, 21}, 1295 { 16, 4, 22}, { 16, 4, 23}, { 16, 5, 1}, { 16, 5, 5}, 1296 { 16, 5, 7}, { 16, 5, 9}, { 16, 5, 17}, { 16, 5, 23}, 1297 { 16, 7, 1}, { 16, 7, 2}, { 16, 7, 5}, { 16, 7, 9}, 1298 { 16, 7, 17}, { 16, 7, 19}, { 16, 7, 21}, { 16, 7, 22}, 1299 { 16, 7, 23}, { 16, 10, 1}, { 16, 10, 2}, { 16, 10, 5}, 1300 { 16, 10, 9}, { 16, 10, 17}, { 16, 10, 19}, { 16, 10, 21}, 1301 { 16, 10, 23}, { 16, 11, 1}, { 16, 11, 5}, { 16, 11, 22}, 1302 { 16, 12, 1}, { 16, 12, 5}, { 16, 12, 23}, { 16, 13, 1}, 1303 { 16, 13, 2}, { 16, 13, 5}, { 16, 13, 9}, { 16, 13, 17}, 1304 { 16, 13, 19}, { 16, 13, 21}, { 16, 13, 23}, { 16, 14, 1}, 1305 { 16, 14, 5}, { 16, 14, 9}, { 16, 14, 23}, { 16, 18, 1}, 1306 { 16, 18, 5}, { 16, 18, 9}, { 16, 18, 17}, { 16, 18, 19}, 1307 { 16, 18, 21}, { 16, 18, 23}, { 16, 19, 1}, { 16, 19, 17}, 1308 { 16, 20, 1}, { 16, 20, 2}, { 16, 20, 5}, { 16, 20, 9}, 1309 { 16, 20, 17}, { 16, 20, 19}, { 16, 20, 21}, { 16, 20, 23}, 1310 { 16, 21, 1}, { 16, 21, 22}, { 16, 22, 1}, { 16, 22, 5}, 1311 { 16, 23, 1}, { 16, 23, 5}, { 16, 23, 9}, { 16, 23, 17}, 1312 { 16, 23, 19}, { 16, 23, 21}, { 16, 23, 23}, { 16, 26, 1}, 1313 { 16, 26, 5}, { 16, 26, 9}, { 16, 26, 17}, { 16, 26, 23}, 1314 { 16, 27, 1}, { 16, 27, 2}, { 16, 27, 5}, { 16, 27, 9}, 1315 { 16, 27, 17}, { 16, 27, 19}, { 16, 27, 21}, { 16, 27, 23}, 1316 { 16, 29, 1}, { 16, 29, 2}, { 16, 29, 5}, { 16, 29, 8}, 1317 { 16, 29, 9}, { 16, 29, 10}, { 16, 29, 17}, { 16, 29, 19}, 1318 { 16, 29, 21}, { 16, 29, 23}, { 17, 3, 1}, { 17, 3, 2}, 1319 { 17, 3, 5}, { 17, 3, 9}, { 17, 3, 17}, { 17, 3, 19}, 1320 { 17, 3, 21}, { 17, 3, 23}, { 17, 4, 1}, { 17, 4, 2}, 1321 { 17, 4, 5}, { 17, 4, 9}, { 17, 4, 17}, { 17, 4, 19}, 1322 { 17, 4, 21}, { 17, 4, 22}, { 17, 4, 23}, { 17, 5, 1}, 1323 { 17, 5, 2}, { 17, 5, 23}, { 17, 7, 1}, { 17, 7, 2}, 1324 { 17, 7, 5}, { 17, 7, 8}, { 17, 7, 9}, { 17, 7, 17}, 1325 { 17, 7, 19}, { 17, 7, 21}, { 17, 7, 22}, { 17, 7, 23}, 1326 { 17, 10, 1}, { 17, 10, 2}, { 17, 10, 5}, { 17, 10, 9}, 1327 { 17, 10, 17}, { 17, 10, 19}, { 17, 10, 21}, { 17, 10, 23}, 1328 { 17, 11, 1}, { 17, 11, 5}, { 17, 11, 9}, { 17, 11, 17}, 1329 { 17, 11, 19}, { 17, 11, 21}, { 17, 11, 22}, { 17, 11, 23}, 1330 { 17, 12, 1}, { 17, 13, 1}, { 17, 13, 2}, { 17, 13, 5}, 1331 { 17, 13, 9}, { 17, 13, 17}, { 17, 13, 19}, { 17, 13, 21}, 1332 { 17, 13, 23}, { 17, 14, 1}, { 17, 14, 2}, { 17, 14, 5}, 1333 { 17, 14, 9}, { 17, 14, 17}, { 17, 14, 23}, { 17, 15, 1}, 1334 { 17, 15, 23}, { 17, 18, 1}, { 17, 18, 9}, { 17, 19, 1}, 1335 { 17, 20, 1}, { 17, 20, 2}, { 17, 20, 5}, { 17, 20, 9}, 1336 { 17, 20, 17}, { 17, 20, 19}, { 17, 20, 21}, { 17, 20, 23}, 1337 { 17, 21, 1}, { 17, 21, 5}, { 17, 21, 9}, { 17, 21, 23}, 1338 { 17, 22, 1}, { 17, 22, 23}, { 17, 23, 1}, { 17, 23, 2}, 1339 { 17, 23, 5}, { 17, 23, 9}, { 17, 23, 17}, { 17, 23, 19}, 1340 { 17, 23, 21}, { 17, 23, 23}, { 17, 26, 1}, { 17, 26, 5}, 1341 { 17, 26, 9}, { 17, 26, 17}, { 17, 27, 1}, { 17, 27, 2}, 1342 { 17, 27, 5}, { 17, 27, 9}, { 17, 27, 17}, { 17, 27, 19}, 1343 { 17, 27, 23}, { 17, 29, 1}, { 17, 29, 2}, { 17, 29, 5}, 1344 { 17, 29, 9}, { 17, 29, 17}, { 17, 29, 19}, { 17, 29, 21}, 1345 { 17, 29, 23}, { 18, 3, 1}, { 18, 3, 2}, { 18, 3, 5}, 1346 { 18, 3, 9}, { 18, 3, 10}, { 18, 3, 17}, { 18, 3, 19}, 1347 { 18, 3, 21}, { 18, 3, 22}, { 18, 3, 23}, { 18, 4, 1}, 1348 { 18, 4, 2}, { 18, 4, 5}, { 18, 4, 9}, { 18, 4, 17}, 1349 { 18, 4, 19}, { 18, 4, 21}, { 18, 4, 22}, { 18, 4, 23}, 1350 { 18, 5, 1}, { 18, 5, 23}, { 18, 7, 1}, { 18, 7, 2}, 1351 { 18, 7, 5}, { 18, 7, 9}, { 18, 7, 11}, { 18, 7, 17}, 1352 { 18, 7, 19}, { 18, 7, 21}, { 18, 7, 22}, { 18, 7, 23}, 1353 { 18, 10, 1}, { 18, 10, 2}, { 18, 10, 5}, { 18, 10, 9}, 1354 { 18, 10, 17}, { 18, 10, 19}, { 18, 10, 21}, { 18, 10, 23}, 1355 { 18, 11, 1}, { 18, 11, 5}, { 18, 11, 22}, { 18, 12, 1}, 1356 { 18, 12, 5}, { 18, 13, 1}, { 18, 13, 2}, { 18, 13, 5}, 1357 { 18, 13, 9}, { 18, 13, 17}, { 18, 13, 19}, { 18, 13, 21}, 1358 { 18, 13, 23}, { 18, 13, 28}, { 18, 14, 1}, { 18, 14, 5}, 1359 { 18, 15, 1}, { 18, 18, 1}, { 18, 18, 5}, { 18, 18, 21}, 1360 { 18, 18, 23}, { 18, 19, 1}, { 18, 20, 1}, { 18, 20, 2}, 1361 { 18, 20, 5}, { 18, 20, 9}, { 18, 20, 17}, { 18, 20, 19}, 1362 { 18, 20, 21}, { 18, 20, 23}, { 18, 21, 1}, { 18, 21, 22}, 1363 { 18, 22, 1}, { 18, 23, 1}, { 18, 23, 2}, { 18, 23, 5}, 1364 { 18, 23, 9}, { 18, 23, 17}, { 18, 23, 19}, { 18, 23, 23}, 1365 { 18, 26, 1}, { 18, 26, 5}, { 18, 26, 9}, { 18, 26, 17}, 1366 { 18, 26, 23}, { 18, 27, 1}, { 18, 27, 2}, { 18, 27, 5}, 1367 { 18, 27, 8}, { 18, 27, 9}, { 18, 27, 11}, { 18, 27, 17}, 1368 { 18, 27, 19}, { 18, 27, 21}, { 18, 28, 1}, { 18, 28, 5}, 1369 { 18, 28, 9}, { 18, 28, 17}, { 18, 28, 19}, { 18, 29, 1}, 1370 { 18, 29, 2}, { 18, 29, 5}, { 18, 29, 9}, { 18, 29, 17}, 1371 { 18, 29, 19}, { 18, 29, 21}, { 18, 29, 23}, { 19, 3, 1}, 1372 { 19, 3, 2}, { 19, 3, 3}, { 19, 3, 5}, { 19, 3, 9}, 1373 { 19, 3, 11}, { 19, 3, 17}, { 19, 3, 19}, { 19, 3, 21}, 1374 { 19, 3, 22}, { 19, 3, 23}, { 19, 3, 27}, { 19, 4, 1}, 1375 { 19, 4, 2}, { 19, 4, 5}, { 19, 4, 9}, { 19, 4, 17}, 1376 { 19, 4, 19}, { 19, 4, 21}, { 19, 4, 22}, { 19, 4, 23}, 1377 { 19, 5, 1}, { 19, 5, 2}, { 19, 7, 1}, { 19, 7, 2}, 1378 { 19, 7, 5}, { 19, 7, 9}, { 19, 7, 17}, { 19, 7, 19}, 1379 { 19, 7, 21}, { 19, 7, 22}, { 19, 7, 23}, { 19, 10, 1}, 1380 { 19, 10, 2}, { 19, 10, 5}, { 19, 10, 9}, { 19, 10, 17}, 1381 { 19, 10, 19}, { 19, 10, 21}, { 19, 10, 23}, { 19, 11, 1}, 1382 { 19, 11, 5}, { 19, 11, 9}, { 19, 11, 17}, { 19, 11, 19}, 1383 { 19, 11, 22}, { 19, 11, 23}, { 19, 12, 1}, { 19, 12, 9}, 1384 { 19, 12, 19}, { 19, 12, 21}, { 19, 13, 1}, { 19, 13, 2}, 1385 { 19, 13, 5}, { 19, 13, 9}, { 19, 13, 17}, { 19, 13, 19}, 1386 { 19, 13, 21}, { 19, 13, 23}, { 19, 14, 1}, { 19, 14, 23}, 1387 { 19, 18, 1}, { 19, 18, 5}, { 19, 19, 1}, { 19, 19, 5}, 1388 { 19, 19, 9}, { 19, 19, 19}, { 19, 19, 21}, { 19, 20, 1}, 1389 { 19, 20, 2}, { 19, 20, 5}, { 19, 20, 8}, { 19, 20, 9}, 1390 { 19, 20, 11}, { 19, 20, 17}, { 19, 20, 19}, { 19, 20, 21}, 1391 { 19, 20, 23}, { 19, 21, 1}, { 19, 21, 23}, { 19, 23, 1}, 1392 { 19, 23, 5}, { 19, 23, 9}, { 19, 23, 17}, { 19, 23, 21}, 1393 { 19, 26, 1}, { 19, 26, 5}, { 19, 26, 9}, { 19, 26, 17}, 1394 { 19, 26, 21}, { 19, 26, 23}, { 19, 27, 1}, { 19, 27, 5}, 1395 { 19, 27, 9}, { 19, 27, 17}, { 19, 27, 19}, { 19, 27, 21}, 1396 { 19, 29, 1}, { 19, 29, 2}, { 19, 29, 5}, { 19, 29, 9}, 1397 { 19, 29, 17}, { 19, 29, 19}, { 19, 29, 21}, { 19, 29, 23}, 1398 { 20, 3, 1}, { 20, 3, 2}, { 20, 3, 5}, { 20, 3, 9}, 1399 { 20, 3, 14}, { 20, 3, 17}, { 20, 3, 19}, { 20, 3, 21}, 1400 { 20, 3, 23}, { 20, 4, 1}, { 20, 4, 2}, { 20, 4, 5}, 1401 { 20, 4, 9}, { 20, 4, 17}, { 20, 4, 19}, { 20, 4, 21}, 1402 { 20, 4, 22}, { 20, 4, 23}, { 20, 5, 1}, { 20, 5, 23}, 1403 { 20, 7, 1}, { 20, 7, 2}, { 20, 7, 5}, { 20, 7, 9}, 1404 { 20, 7, 11}, { 20, 7, 17}, { 20, 7, 19}, { 20, 7, 21}, 1405 { 20, 7, 23}, { 20, 10, 1}, { 20, 10, 2}, { 20, 10, 5}, 1406 { 20, 10, 9}, { 20, 10, 17}, { 20, 10, 19}, { 20, 10, 21}, 1407 { 20, 10, 23}, { 20, 11, 1}, { 20, 11, 2}, { 20, 11, 5}, 1408 { 20, 11, 9}, { 20, 11, 17}, { 20, 11, 19}, { 20, 11, 21}, 1409 { 20, 11, 22}, { 20, 11, 23}, { 20, 12, 1}, { 20, 12, 5}, 1410 { 20, 12, 9}, { 20, 12, 19}, { 20, 13, 1}, { 20, 13, 2}, 1411 { 20, 13, 5}, { 20, 13, 9}, { 20, 13, 14}, { 20, 13, 17}, 1412 { 20, 13, 19}, { 20, 13, 21}, { 20, 13, 23}, { 20, 13, 27}, 1413 { 20, 14, 1}, { 20, 14, 2}, { 20, 14, 5}, { 20, 14, 9}, 1414 { 20, 14, 21}, { 20, 14, 23}, { 20, 15, 1}, { 20, 15, 2}, 1415 { 20, 15, 5}, { 20, 15, 21}, { 20, 15, 23}, { 20, 18, 1}, 1416 { 20, 18, 2}, { 20, 18, 5}, { 20, 18, 9}, { 20, 18, 19}, 1417 { 20, 18, 21}, { 20, 18, 23}, { 20, 19, 1}, { 20, 19, 5}, 1418 { 20, 19, 9}, { 20, 19, 19}, { 20, 19, 21}, { 20, 20, 1}, 1419 { 20, 20, 2}, { 20, 20, 5}, { 20, 20, 9}, { 20, 20, 14}, 1420 { 20, 20, 17}, { 20, 20, 21}, { 20, 20, 23}, { 20, 21, 1}, 1421 { 20, 21, 5}, { 20, 21, 9}, { 20, 21, 17}, { 20, 21, 23}, 1422 { 20, 22, 1}, { 20, 22, 2}, { 20, 22, 5}, { 20, 22, 9}, 1423 { 20, 22, 23}, { 20, 23, 1}, { 20, 23, 2}, { 20, 23, 5}, 1424 { 20, 23, 9}, { 20, 23, 17}, { 20, 23, 19}, { 20, 23, 21}, 1425 { 20, 23, 23}, { 20, 26, 1}, { 20, 26, 2}, { 20, 26, 5}, 1426 { 20, 26, 9}, { 20, 26, 17}, { 20, 26, 21}, { 20, 26, 23}, 1427 { 20, 27, 1}, { 20, 27, 2}, { 20, 27, 5}, { 20, 27, 7}, 1428 { 20, 27, 8}, { 20, 27, 9}, { 20, 27, 10}, { 20, 27, 17}, 1429 { 20, 27, 19}, { 20, 27, 21}, { 20, 27, 23}, { 20, 27, 27}, 1430 { 20, 28, 1}, { 20, 28, 5}, { 20, 28, 9}, { 20, 28, 17}, 1431 { 20, 28, 19}, { 20, 28, 23}, { 20, 29, 1}, { 20, 29, 2}, 1432 { 20, 29, 5}, { 20, 29, 9}, { 20, 29, 17}, { 20, 29, 19}, 1433 { 20, 29, 21}, { 20, 29, 23}, 1434}; 1435 1436 1437static const unsigned short ks_table2[][4] = 1438{ 1439 {0xa4bf, 1, 3, 1}, {0xa4c0, 1, 4, 1}, 1440 {0xa4c1, 1, 5, 1}, {0xa4c2, 1, 6, 1}, 1441 {0xa4c3, 1, 7, 1}, {0xa4c4, 1, 10, 1}, 1442 {0xa4c5, 1, 11, 1}, {0xa4c6, 1, 12, 1}, 1443 {0xa4c7, 1, 13, 1}, {0xa4c8, 1, 14, 1}, 1444 {0xa4c9, 1, 15, 1}, {0xa4ca, 1, 18, 1}, 1445 {0xa4cb, 1, 19, 1}, {0xa4cc, 1, 20, 1}, 1446 {0xa4cd, 1, 21, 1}, {0xa4ce, 1, 22, 1}, 1447 {0xa4cf, 1, 23, 1}, {0xa4d0, 1, 26, 1}, 1448 {0xa4d1, 1, 27, 1}, {0xa4d2, 1, 28, 1}, 1449 {0xa4d3, 1, 29, 1}, {0xa4a1, 2, 2, 1}, 1450 {0xa4a2, 3, 2, 1}, {0xa4a4, 4, 2, 1}, 1451 {0xa4a7, 5, 2, 1}, {0xa4a8, 6, 2, 1}, 1452 {0xa4a9, 7, 2, 1}, {0xa4b1, 8, 2, 1}, 1453 {0xa4b2, 9, 2, 1}, {0xa4b3, 10, 2, 1}, 1454 {0xa4b5, 11, 2, 1}, {0xa4b6, 12, 2, 1}, 1455 {0xa4b7, 13, 2, 1}, {0xa4b8, 14, 2, 1}, 1456 {0xa4b9, 15, 2, 1}, {0xa4ba, 16, 2, 1}, 1457 {0xa4bb, 17, 2, 1}, {0xa4bc, 18, 2, 1}, 1458 {0xa4bd, 19, 2, 1}, {0xa4be, 20, 2, 1}, 1459}; 1460 1461/* ������ �ʼ� - �ϼ��� ���� ��ȯ 1462 * conversion: initial sound of compound type - ??? of completion type 1463 */ 1464 1465static const char_u johab_fcon_to_wan[] = 1466{ 1467 0, 1468 0xd4, 0xa1, 0xa2, 0xa4, 0xa7, /* (ä��),��,��,��,�� */ 1469 0xa8, 0xa9, 0xb1, 0xb2, 0xb3, /* ��,��,��,��,�� */ 1470 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, /* ��,��,��,��,�� */ 1471 0xba, 0xbb, 0xbc, 0xbd, 0xbe /* ��,��,��,��,�� */ 1472}; 1473 1474/* ������ �� -> �ϼ��� ���� ��ȯ 1475 * conversion: medial vowel of compound type - ??? of completion type 1476 */ 1477 1478static const char_u johab_vow_to_wan[] = 1479{ 1480 0, 0, 1481 0xd4, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, /* (ä��),��,��,��,��,�� */ 1482 0, 0, 1483 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, /* ��,��,��,��,�Ǥ�,�Ǥ� */ 1484 0, 0, 1485 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* �Ǥ�,��,��,�̤�,�̤�,�̤� */ 1486 0, 0, 1487 0xd0, 0xd1, 0xd2, 0xd3 /* ��,��,�Ѥ�,�� */ 1488}; 1489 1490/* ������ ���� -> �ϼ��� ���� ��ȯ 1491 * conversion: final consonant of compound type - ??? of completion type 1492 */ 1493 1494static const char_u johab_lcon_to_wan[] = 1495{ 1496 0, 1497 0xd4, 0xa1, 0xa2, 0xa3, 0xa4, /* (ä��), ��, ��, ����, �� */ 1498 0xa5, 0xa6, 0xa7, 0xa9, 0xaa, /* ����, ����, ��, ��, ���� */ 1499 0xab, 0xac, 0xad, 0xae, 0xaf, /* ����, ����, ����, ����, ���� */ 1500 0xb0, 0xb1, 0, 0xb2, 0xb4, /* ����, ��, 0, ��, ���� */ 1501 0xb5, 0xb6, 0xb7, 0xb8, 0xba, /* ��, ��, ��, ��, �� */ 1502 0xbb, 0xbc, 0xbd, 0xbe /* ��, ��, ��, �� */ 1503}; 1504 1505 static void 1506convert_ks_to_3(src, fp, mp, lp) 1507 const char_u *src; 1508 int *fp; 1509 int *mp; 1510 int *lp; 1511{ 1512 int h = *src; 1513 int low = *(src + 1); 1514 int c; 1515 int i; 1516 1517 if ((i = han_index(h, low)) >= 0 1518 && i < sizeof(ks_table1)/sizeof(ks_table1[0])) 1519 { 1520 *fp = ks_table1[i][0]; 1521 *mp = ks_table1[i][1]; 1522 *lp = ks_table1[i][2]; 1523 } 1524 else 1525 { 1526 c = (h << 8) | low; 1527 for (i = 0; i < 40; i++) 1528 if (ks_table2[i][0] == c) 1529 { 1530 *fp = ks_table2[i][1]; 1531 *mp = ks_table2[i][2]; 1532 *lp = ks_table2[i][3]; 1533 return; 1534 } 1535 *fp = 0xff; /* ���� �ڵ� (graphic code) */ 1536 *mp = h; 1537 *lp = low; 1538 } 1539} 1540 1541 static int 1542convert_3_to_ks(fv, mv, lv, des) 1543 int fv; 1544 int mv; 1545 int lv; 1546 char_u *des; 1547{ 1548 char_u key[3]; 1549 register int hi, lo, mi = 0, result, found; 1550 1551 if (fv == 0xff) 1552 { 1553 des[0] = mv; 1554 des[1] = lv; 1555 return 2; 1556 } 1557 key[0] = fv; 1558 key[1] = mv; 1559 key[2] = lv; 1560 lo = 0; 1561 hi = sizeof(ks_table1)/3 - 1; 1562 found = 0; 1563 while (lo + 1 < hi) 1564 { 1565 mi = (lo + hi)/2; 1566 result = STRNCMP(ks_table1[mi], key, 3); 1567 if (result == 0) 1568 { 1569 found = 1; 1570 break; 1571 } 1572 else if (result > 0) 1573 hi = mi; 1574 else 1575 lo = mi; 1576 } 1577 if (!found) 1578 { 1579 if (!STRNCMP(ks_table1[lo], key, 3)) 1580 { 1581 found = 1; 1582 mi = lo; 1583 } 1584 if (!STRNCMP(ks_table1[hi], key, 3)) 1585 { 1586 found = 1; 1587 mi = hi; 1588 } 1589 } 1590 if (!found) 1591 { 1592 for (mi = 0; mi < 40; mi++) 1593 if (ks_table2[mi][1] == fv && ks_table2[mi][2] == mv && 1594 ks_table2[mi][3] == lv) 1595 { 1596 des[0] = (unsigned)(ks_table2[mi][0]) >> 8; 1597 des[1] = ks_table2[mi][0]; 1598 return 2; /* found */ 1599 } 1600 } 1601 else 1602 { 1603 des[0] = mi / (0xff-0xa1) + 0xb0; 1604 des[1] = mi % (0xff-0xa1) + 0xa1; 1605 return 2; /* found */ 1606 } 1607 1608 /* �ϼ��� ǥ�� ���. ``KS C 5601 - 1992 ���� ��ȯ�� ��ȣ �ؼ�'' 1609 * 3.3 �� ����� ������� encoding �Ѵ�. 1610 */ 1611 1612 *des++ = 0xa4; /* ä�� */ 1613 *des++ = 0xd4; 1614 *des++ = 0xa4; /* ���ڴ� ��� a4 � �ִ�. */ 1615 *des++ = johab_fcon_to_wan[fv]; 1616 *des++ = 0xa4; 1617 *des++ = johab_vow_to_wan[mv]; 1618 *des++ = 0xa4; 1619 *des++ = johab_lcon_to_wan[lv]; 1620 return 8; 1621} 1622