sync with sylpheed 0.6.1cvs2
[claws.git] / libkcc / dec.c
1 #include "libkcc.h"
2
3 /*---------------------------------------------------------------------
4     TYPE
5         table
6     NAME
7         katakana, hiragana, dakuon - JIS X0201 kana to JIS kanji in DEC
8  ---------------------------------------------------------------------*/
9 unsigned short katakana[] = {
10     0,      0xa1a3, 0xa1d6, 0xa1d7, 0xa1a2, 0xa1a6, 0xa5f2, 0xa5a1,
11     0xa5a3, 0xa5a5, 0xa5a7, 0xa5a9, 0xa5e3, 0xa5e5, 0xa5e7, 0xa5c3,
12     0xa1bc, 0xa5a2, 0xa5a4, 0xa5a6, 0xa5a8, 0xa5aa, 0xa5ab, 0xa5ad,
13     0xa5af, 0xa5b1, 0xa5b3, 0xa5b5, 0xa5b7, 0xa5b9, 0xa5bb, 0xa5bd,
14     0xa5bf, 0xa5c1, 0xa5c4, 0xa5c6, 0xa5c8, 0xa5ca, 0xa5cb, 0xa5cc,
15     0xa5cd, 0xa5ce, 0xa5cf, 0xa5d2, 0xa5d5, 0xa5d8, 0xa5db, 0xa5de,
16     0xa5df, 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e4, 0xa5e6, 0xa5e8, 0xa5e9,
17     0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ef, 0xa5f3, 0xa1ab, 0xa1ac,
18 };
19
20 unsigned short hiragana[] = {
21     0,      0xa1a3, 0xa1d6, 0xa1d7, 0xa1a2, 0xa1a6, 0xa4f2, 0xa4a1,
22     0xa4a3, 0xa4a5, 0xa4a7, 0xa4a9, 0xa4e3, 0xa4e5, 0xa4e7, 0xa4c3,
23     0xa1bc, 0xa4a2, 0xa4a4, 0xa4a6, 0xa4a8, 0xa4aa, 0xa4ab, 0xa4ad,
24     0xa4af, 0xa4b1, 0xa4b3, 0xa4b5, 0xa4b7, 0xa4b9, 0xa4bb, 0xa4bd,
25     0xa4bf, 0xa4c1, 0xa4c4, 0xa4c6, 0xa4c8, 0xa4ca, 0xa4cb, 0xa4cc,
26     0xa4cd, 0xa4ce, 0xa4cf, 0xa4d2, 0xa4d5, 0xa4d8, 0xa4db, 0xa4de,
27     0xa4df, 0xa4e0, 0xa4e1, 0xa4e2, 0xa4e4, 0xa4e6, 0xa4e8, 0xa4e9,
28     0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ef, 0xa4f3, 0xa1ab, 0xa1ac,
29 };
30
31 unsigned char dakuon[] = {
32     0,      0,      0,      0,      0,      0,      0,      0,
33     0,      0,      0,      0,      0,      0,      0,      0,
34     0,      0,      0,      0,      0,      0,      1,      1,
35     1,      1,      1,      1,      1,      1,      1,      1,
36     1,      1,      1,      1,      1,      0,      0,      0,
37     0,      0,      3,      3,      3,      3,      3,      0,
38     0,      0,      0,      0,      0,      0,      0,      0,
39     0,      0,      0,      0,      0,      0,      0,      0,
40 };
41
42 /*********************************************************/
43 unsigned short *kanatbl = katakana;
44 int lastkana=0;
45 extern bool nogaiji;
46
47 /*---------------------------------------------------------------------
48     NAME
49         decascii
50  ---------------------------------------------------------------------*/
51 void Kcc_decascii(ddd, c)
52     register int c;
53     char **ddd;
54 {
55     if (lastkana) {
56         **ddd = kanatbl[lastkana] >> 8; (*ddd)++;
57         **ddd = kanatbl[lastkana] & 0xff; (*ddd)++;
58         lastkana = 0;
59     }
60     **ddd = c; (*ddd)++;
61 }
62
63 /*---------------------------------------------------------------------
64     NAME
65         decgaiji
66  ---------------------------------------------------------------------*/
67 void Kcc_decgaiji(ddd, c1, c2)
68     register int c1, c2;
69     char **ddd;
70 {
71     if (lastkana) {
72         **ddd = kanatbl[lastkana] >> 8; (*ddd)++;
73         **ddd = kanatbl[lastkana] & 0xff; (*ddd)++;
74         lastkana = 0;
75     }
76     if (nogaiji) {
77         **ddd = ZENPAD >> 8 | 0x80; (*ddd)++;
78         **ddd = (ZENPAD & 0xff) | 0x80; (*ddd)++;
79     } else {
80         **ddd = c1 | 0x80; (*ddd)++;
81         **ddd = c2; (*ddd)++;
82     }
83 }
84
85 /*---------------------------------------------------------------------
86     NAME
87         deckana
88  ---------------------------------------------------------------------*/
89 void Kcc_deckana(ddd, c)
90     register int c;
91     char **ddd;
92 {
93     register int cc;
94     int i;
95     extern unsigned char dakuon[];
96
97     if (lastkana) {
98         cc = kanatbl[lastkana];
99         if ((c == 0x5e || c == 0x5f) &&
100                 (i = dakuon[lastkana] & (c == 0x5e ? 1 : 2))) {
101             cc += i;
102             c = -1;
103         }
104         **ddd = cc >> 8; (*ddd)++;
105         **ddd = cc & 0xff; (*ddd)++;
106     }
107     if (c < 0x21 || 0x5f < c) {
108         if (c > 0) {
109             **ddd = ZENPAD >> 8; (*ddd)++;
110             **ddd = ZENPAD & 0xff; (*ddd)++;
111         }
112         lastkana = 0;
113     } else
114         lastkana = c - 0x20;
115 }
116 /*---------------------------------------------------------------------
117     NAME
118         deckanji
119  ---------------------------------------------------------------------*/
120 void Kcc_deckanji(ddd, c1, c2)
121     register int c1, c2;
122     char **ddd;
123 {
124     if (lastkana) {
125         **ddd = kanatbl[lastkana] >> 8; (*ddd)++;
126         **ddd = kanatbl[lastkana] & 0xff; (*ddd)++;
127         lastkana = 0;
128     }
129     **ddd = c1 | 0x80; (*ddd)++;
130     **ddd = c2 | 0x80; (*ddd)++;
131 }
132