summaryrefslogtreecommitdiff
path: root/firmware/hangul.c
blob: 27123ccb6476448bcb50142eaffe11a138f4e41c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 *
 *
 * Copyright (C) 2006 by Frank Dischner
 *
 * All files in this archive are subject to the GNU General Public License.
 * See the file COPYING in the source tree root for full license agreement.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/
#include "hangul.h"

const char jamo_table[51][3] = {
    { 1,  0,  1},
    { 2,  0,  2},
    { 0,  0,  3},
    { 3,  0,  4},
    { 0,  0,  5},
    { 0,  0,  6},
    { 4,  0,  7},
    { 5,  0,  0},
    { 6,  0,  8},
    { 0,  0,  9},
    { 0,  0, 10},
    { 0,  0, 11},
    { 0,  0, 12},
    { 0,  0, 13},
    { 0,  0, 14},
    { 0,  0, 15},
    { 7,  0, 16},
    { 8,  0, 17},
    { 9,  0,  0},
    { 0,  0, 18},
    {10,  0, 19},
    {11,  0, 20},
    {12,  0, 21},
    {13,  0, 22},
    {14,  0,  0},
    {15,  0, 23},
    {16,  0, 24},
    {17,  0, 25},
    {18,  0, 26},
    {19,  0, 27},
    { 0,  1,  0},
    { 0,  2,  0},
    { 0,  3,  0},
    { 0,  4,  0},
    { 0,  5,  0},
    { 0,  6,  0},
    { 0,  7,  0},
    { 0,  8,  0},
    { 0,  9,  0},
    { 0, 10,  0},
    { 0, 11,  0},
    { 0, 12,  0},
    { 0, 13,  0},
    { 0, 14,  0},
    { 0, 15,  0},
    { 0, 16,  0},
    { 0, 17,  0},
    { 0, 18,  0},
    { 0, 19,  0},
    { 0, 20,  0},
    { 0, 21,  0},
};

/* takes three jamo chars and joins them into one hangul */
unsigned short hangul_join(unsigned short lead, unsigned short vowel,
                                unsigned short tail)
{
    unsigned short ch = 0xfffd;

    if (lead < 0x3131 || lead > 0x3163)
        return ch;
    lead = jamo_table[lead-0x3131][0];

    if (vowel < 0x3131 || vowel > 0x3163)
        return ch;
    vowel = jamo_table[vowel-0x3131][1];

    if (tail) {
        if (tail < 0x3131 || tail > 0x3163)
            return ch;
        tail = jamo_table[tail-0x3131][2];
        if (!tail)
            return ch;
    }

    if (lead && vowel)
        ch = tail + (vowel - 1)*28 + (lead - 1)*588 + 44032;

    return ch;
}