2
* KAKASI (Kanji Kana Simple inversion program)
3
* $Id: kk2.c,v 1.3 2001/01/16 07:51:47 rug Exp $
5
* Hironobu Takahashi (takahasi@tiny.or.jp)
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either versions 2, or (at your option)
12
* This program is distributed in the hope that it will be useful
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with KAKASI, see the file COPYING. If not, write to the Free
19
* Software Foundation Inc., 59 Temple Place - Suite 330, Boston, MA
36
unsigned char kana[10];
41
"\245\241", "a", "\245\242", "a", "\245\243", "i", "\245\244", "i", "\245\245", "u", "\245\246", "u",
42
"\245\247", "e", "\245\250", "e", "\245\251", "o", "\245\252", "o",
44
"\245\253", "ka", "\245\254", "ga", "\245\255", "ki", "\245\255\245\343", "kya", "\245\255\245\345", "kyu",
45
"\245\255\245\347", "kyo", "\245\256", "gi", "\245\256\245\343", "gya", "\245\256\245\345", "gyu", "\245\256\245\347", "gyo",
46
"\245\257", "ku", "\245\260", "gu", "\245\261", "ke", "\245\262", "ge", "\245\263", "ko", "\245\264", "go",
48
"\245\265", "sa", "\245\266", "za", "\245\267", "shi", "\245\267\245\343", "sha", "\245\267\245\345", "shu",
49
"\245\267\245\347", "sho", "\245\270", "ji", "\245\270\245\343", "ja", "\245\270\245\345", "ju", "\245\270\245\347", "jo",
50
"\245\271", "su", "\245\272", "zu", "\245\273", "se", "\245\274", "ze", "\245\275", "so", "\245\276", "zo",
52
"\245\277", "ta", "\245\300", "da", "\245\301", "chi", "\245\301\245\343", "cha", "\245\301\245\345", "chu",
53
"\245\301\245\347", "cho", "\245\302", "di", "\245\302\245\343", "dya", "\245\302\245\345", "dyu", "\245\302\245\347", "dyo",
55
"\245\303", "tsu", "\245\303\245\253", "kka", "\245\303\245\254", "gga", "\245\303\245\255", "kki", "\245\303\245\255\245\343", "kkya",
56
"\245\303\245\255\245\345", "kkyu", "\245\303\245\255\245\347", "kkyo", "\245\303\245\256", "ggi", "\245\303\245\256\245\343", "ggya",
57
"\245\303\245\256\245\345", "ggyu", "\245\303\245\256\245\347", "ggyo", "\245\303\245\257", "kku", "\245\303\245\260", "ggu",
58
"\245\303\245\261", "kke", "\245\303\245\262", "gge", "\245\303\245\263", "kko", "\245\303\245\264", "ggo", "\245\303\245\265", "ssa",
59
"\245\303\245\266", "zza", "\245\303\245\267", "sshi", "\245\303\245\267\245\343", "ssha",
60
"\245\303\245\267\245\345", "sshu", "\245\303\245\267\245\347", "ssho",
61
"\245\303\245\270", "jji", "\245\303\245\270\245\343", "jja", "\245\303\245\270\245\345", "jju", "\245\303\245\270\245\347", "jjo",
62
"\245\303\245\271", "ssu", "\245\303\245\272", "zzu", "\245\303\245\273", "sse", "\245\303\245\274", "zze", "\245\303\245\275", "sso",
63
"\245\303\245\276", "zzo", "\245\303\245\277", "tta", "\245\303\245\300", "dda", "\245\303\245\301", "cchi",
64
"\245\303\245\301\245\343", "ccha", "\245\303\245\301\245\345", "cchu", "\245\303\245\301\245\347", "ccho", "\245\303\245\302", "ddi",
65
"\245\303\245\302\245\343", "ddya", "\245\303\245\302\245\345", "ddyu", "\245\303\245\302\245\347", "ddyo", "\245\303\245\304", "ttsu",
66
"\245\303\245\305", "ddu", "\245\303\245\306", "tte", "\245\303\245\307", "dde", "\245\303\245\310", "tto", "\245\303\245\311", "ddo",
67
"\245\303\245\317", "hha", "\245\303\245\320", "bba", "\245\303\245\321", "ppa", "\245\303\245\322", "hhi",
68
"\245\303\245\322\245\343", "hhya", "\245\303\245\322\245\345", "hhyu", "\245\303\245\322\245\347", "hhyo", "\245\303\245\323", "bbi",
69
"\245\303\245\323\245\343", "bbya", "\245\303\245\323\245\345", "bbyu", "\245\303\245\323\245\347", "bbyo", "\245\303\245\324", "ppi",
70
"\245\303\245\324\245\343", "ppya", "\245\303\245\324\245\345", "ppyu", "\245\303\245\324\245\347", "ppyo", "\245\303\245\325", "ffu",
71
"\245\303\245\325\245\241", "ffa", "\245\303\245\325\245\243", "ffi", "\245\303\245\325\245\247", "ffe", "\245\303\245\325\245\251", "ffo",
72
"\245\303\245\326", "bbu", "\245\303\245\327", "ppu", "\245\303\245\330", "hhe", "\245\303\245\331", "bbe", "\245\303\245\332", "ppe",
73
"\245\303\245\333", "hho", "\245\303\245\334", "bbo", "\245\303\245\335", "ppo", "\245\303\245\344", "yya", "\245\303\245\346", "yyu",
74
"\245\303\245\350", "yyo", "\245\303\245\351", "rra", "\245\303\245\352", "rri", "\245\303\245\352\245\343", "rrya",
75
"\245\303\245\352\245\345", "rryu", "\245\303\245\352\245\347", "rryo", "\245\303\245\353", "rru", "\245\303\245\354", "rre",
76
"\245\303\245\355", "rro", "\245\303\245\364", "vvu", "\245\303\245\364\245\241", "vva", "\245\303\245\364\245\243", "vvi",
77
"\245\303\245\364\245\247", "vve", "\245\303\245\364\245\251", "vvo",
79
"\245\304", "tsu", "\245\305", "du", "\245\306", "te", "\245\307", "de", "\245\310", "to", "\245\311", "do",
81
"\245\312", "na", "\245\313", "ni", "\245\313\245\343", "nya", "\245\313\245\345", "nyu", "\245\313\245\347", "nyo",
82
"\245\314", "nu", "\245\315", "ne", "\245\316", "no",
84
"\245\317", "ha", "\245\320", "ba", "\245\321", "pa", "\245\322", "hi", "\245\322\245\343", "hya",
85
"\245\322\245\345", "hyu", "\245\322\245\347", "hyo", "\245\323", "bi", "\245\323\245\343", "bya", "\245\323\245\345", "byu",
86
"\245\323\245\347", "byo", "\245\324", "pi", "\245\324\245\343", "pya", "\245\324\245\345", "pyu", "\245\324\245\347", "pyo",
87
"\245\325", "fu", "\245\325\245\241", "fa", "\245\325\245\243", "fi", "\245\325\245\247", "fe", "\245\325\245\251", "fo",
88
"\245\326", "bu", "\245\327", "pu", "\245\330", "he", "\245\331", "be", "\245\332", "pe", "\245\333", "ho",
89
"\245\334", "bo", "\245\335", "po",
91
"\245\336", "ma", "\245\337", "mi", "\245\337\245\343", "mya", "\245\337\245\345", "myu", "\245\337\245\347", "myo",
92
"\245\340", "mu", "\245\341", "me", "\245\342", "mo",
94
"\245\343", "ya", "\245\344", "ya", "\245\345", "yu", "\245\346", "yu", "\245\347", "yo", "\245\350", "yo",
96
"\245\351", "ra", "\245\352", "ri", "\245\352\245\343", "rya", "\245\352\245\345", "ryu", "\245\352\245\347", "ryo",
97
"\245\353", "ru", "\245\354", "re", "\245\355", "ro",
99
"\245\356", "wa", "\245\357", "wa", "\245\360", "i", "\245\361", "e",
100
"\245\362", "wo", "\245\363", "n",
101
"\245\363\245\242", "n'a", "\245\363\245\244", "n'i", "\245\363\245\246", "n'u", "\245\363\245\250", "n'e", "\245\363\245\252", "n'o",
102
"\245\364", "vu", "\245\364\245\241", "va", "\245\364\245\243", "vi", "\245\364\245\247", "ve", "\245\364\245\251", "vo",
103
"\245\365", "ka", "\245\366", "ke",
106
}, K2rom_k_table[] = {
108
"\245\241", "a", "\245\242", "a", "\245\243", "i", "\245\244", "i", "\245\245", "u", "\245\246", "u",
109
"\245\247", "e", "\245\250", "e", "\245\251", "o", "\245\252", "o",
111
"\245\253", "ka", "\245\254", "ga", "\245\255", "ki", "\245\255\245\343", "kya", "\245\255\245\345", "kyu",
112
"\245\255\245\347", "kyo", "\245\256", "gi", "\245\256\245\343", "gya", "\245\256\245\345", "gyu", "\245\256\245\347", "gyo",
113
"\245\257", "ku", "\245\260", "gu", "\245\261", "ke", "\245\262", "ge", "\245\263", "ko", "\245\264", "go",
115
"\245\265", "sa", "\245\266", "za", "\245\267", "si", "\245\267\245\343", "sya", "\245\267\245\345", "syu",
116
"\245\267\245\347", "syo", "\245\270", "zi", "\245\270\245\343", "zya", "\245\270\245\345", "zyu", "\245\270\245\347", "zyo",
117
"\245\271", "su", "\245\272", "zu", "\245\273", "se", "\245\274", "ze", "\245\275", "so", "\245\276", "zo",
119
"\245\277", "ta", "\245\300", "da", "\245\301", "ti", "\245\301\245\343", "tya", "\245\301\245\345", "tyu",
120
"\245\301\245\347", "tyo", "\245\302", "di", "\245\302\245\343", "dya", "\245\302\245\345", "dyu", "\245\302\245\347", "dyo",
122
"\245\303", "tu", "\245\303\245\253", "kka", "\245\303\245\254", "gga", "\245\303\245\255", "kki", "\245\303\245\255\245\343", "kkya",
123
"\245\303\245\255\245\345", "kkyu", "\245\303\245\255\245\347", "kkyo", "\245\303\245\256", "ggi", "\245\303\245\256\245\343", "ggya",
124
"\245\303\245\256\245\345", "ggyu", "\245\303\245\256\245\347", "ggyo", "\245\303\245\257", "kku", "\245\303\245\260", "ggu",
125
"\245\303\245\261", "kke", "\245\303\245\262", "gge", "\245\303\245\263", "kko", "\245\303\245\264", "ggo", "\245\303\245\265", "ssa",
126
"\245\303\245\266", "zza", "\245\303\245\267", "ssi", "\245\303\245\267\245\343", "ssya",
127
"\245\303\245\267\245\345", "ssyu", "\245\303\245\267\245\347", "ssho",
128
"\245\303\245\270", "zzi", "\245\303\245\270\245\343", "zzya", "\245\303\245\270\245\345", "zzyu", "\245\303\245\270\245\347", "zzyo",
129
"\245\303\245\271", "ssu", "\245\303\245\272", "zzu", "\245\303\245\273", "sse", "\245\303\245\274", "zze", "\245\303\245\275", "sso",
130
"\245\303\245\276", "zzo", "\245\303\245\277", "tta", "\245\303\245\300", "dda", "\245\303\245\301", "tti",
131
"\245\303\245\301\245\343", "ttya", "\245\303\245\301\245\345", "ttyu", "\245\303\245\301\245\347", "ttyo", "\245\303\245\302", "ddi",
132
"\245\303\245\302\245\343", "ddya", "\245\303\245\302\245\345", "ddyu", "\245\303\245\302\245\347", "ddyo", "\245\303\245\304", "ttu",
133
"\245\303\245\305", "ddu", "\245\303\245\306", "tte", "\245\303\245\307", "dde", "\245\303\245\310", "tto", "\245\303\245\311", "ddo",
134
"\245\303\245\317", "hha", "\245\303\245\320", "bba", "\245\303\245\321", "ppa", "\245\303\245\322", "hhi",
135
"\245\303\245\322\245\343", "hhya", "\245\303\245\322\245\345", "hhyu", "\245\303\245\322\245\347", "hhyo", "\245\303\245\323", "bbi",
136
"\245\303\245\323\245\343", "bbya", "\245\303\245\323\245\345", "bbyu", "\245\303\245\323\245\347", "bbyo", "\245\303\245\324", "ppi",
137
"\245\303\245\324\245\343", "ppya", "\245\303\245\324\245\345", "ppyu", "\245\303\245\324\245\347", "ppyo", "\245\303\245\325", "hhu",
138
"\245\303\245\325\245\241", "ffa", "\245\303\245\325\245\243", "ffi", "\245\303\245\325\245\247", "ffe", "\245\303\245\325\245\251", "ffo",
139
"\245\303\245\326", "bbu", "\245\303\245\327", "ppu", "\245\303\245\330", "hhe", "\245\303\245\331", "bbe", "\245\303\245\332", "ppe",
140
"\245\303\245\333", "hho", "\245\303\245\334", "bbo", "\245\303\245\335", "ppo", "\245\303\245\344", "yya", "\245\303\245\346", "yyu",
141
"\245\303\245\350", "yyo", "\245\303\245\351", "rra", "\245\303\245\352", "rri", "\245\303\245\352\245\343", "rrya",
142
"\245\303\245\352\245\345", "rryu", "\245\303\245\352\245\347", "rryo", "\245\303\245\353", "rru", "\245\303\245\354", "rre",
143
"\245\303\245\355", "rro", "\245\303\245\364", "vvu", "\245\303\245\364\245\241", "vva", "\245\303\245\364\245\243", "vvi",
144
"\245\303\245\364\245\247", "vve", "\245\303\245\364\245\251", "vvo",
146
"\245\304", "tu", "\245\305", "du", "\245\306", "te", "\245\307", "de", "\245\310", "to", "\245\311", "do",
148
"\245\312", "na", "\245\313", "ni", "\245\313\245\343", "nya", "\245\313\245\345", "nyu", "\245\313\245\347", "nyo",
149
"\245\314", "nu", "\245\315", "ne", "\245\316", "no",
151
"\245\317", "ha", "\245\320", "ba", "\245\321", "pa", "\245\322", "hi", "\245\322\245\343", "hya",
152
"\245\322\245\345", "hyu", "\245\322\245\347", "hyo", "\245\323", "bi", "\245\323\245\343", "bya", "\245\323\245\345", "byu",
153
"\245\323\245\347", "byo", "\245\324", "pi", "\245\324\245\343", "pya", "\245\324\245\345", "pyu", "\245\324\245\347", "pyo",
154
"\245\325", "hu", "\245\325\245\241", "fa", "\245\325\245\243", "fi", "\245\325\245\247", "fe", "\245\325\245\251", "fo",
155
"\245\326", "bu", "\245\327", "pu", "\245\330", "he", "\245\331", "be", "\245\332", "pe", "\245\333", "ho",
156
"\245\334", "bo", "\245\335", "po",
158
"\245\336", "ma", "\245\337", "mi", "\245\337\245\343", "mya", "\245\337\245\345", "myu", "\245\337\245\347", "myo",
159
"\245\340", "mu", "\245\341", "me", "\245\342", "mo",
161
"\245\343", "ya", "\245\344", "ya", "\245\345", "yu", "\245\346", "yu", "\245\347", "yo", "\245\350", "yo",
163
"\245\351", "ra", "\245\352", "ri", "\245\352\245\343", "rya", "\245\352\245\345", "ryu", "\245\352\245\347", "ryo",
164
"\245\353", "ru", "\245\354", "re", "\245\355", "ro",
166
"\245\356", "wa", "\245\357", "wa", "\245\360", "i", "\245\361", "e",
167
"\245\362", "wo", "\245\363", "n",
168
"\245\363\245\242", "n'a", "\245\363\245\244", "n'i", "\245\363\245\246", "n'u", "\245\363\245\250", "n'e", "\245\363\245\252", "n'o",
169
"\245\364", "vu", "\245\364\245\241", "va", "\245\364\245\243", "vi", "\245\364\245\247", "ve", "\245\364\245\251", "vo",
170
"\245\365", "ka", "\245\366", "ke",
174
#define K2rom_buflen 11
182
static int index_table[0x81];
183
static int index_made=0;
184
static struct K2rom_tbl *K2rom_ptr;
187
unsigned char buffer[K2rom_buflen];
188
int max_match, match_more;
191
if (index_made == 0) {
194
for (i = 0; i < 0x81; ++ i) {
197
index_table[0x21] = 0;
198
K2rom_ptr = (romaji_type == HEPBURN) ? K2rom_h_table : K2rom_k_table;
199
for (p = K2rom_ptr, i = 0; *(p->kana) != '\0'; ++ p, ++ i) {
200
index_table[(((p->kana)[1])&0x7f)+1] = i+1;
203
for (i = 0x80; i >= 0; -- i) {
204
if (index_table[i] == -1)
205
index_table[i] = last;
207
last = index_table[i];
212
if ((c[0].c1 == 0xa1) && (c[0].c2 == 0xbc)) {
221
buffer[K2rom_buflen-1] = '\0'; clen = K2rom_buflen-1;
222
for (i = 0; i < (K2rom_buflen-1)/2; i ++) {
223
buffer[i*2 ] = c[i].c1;
224
buffer[i*2+1] = c[i].c2;
226
if (c[i].c1 == '\0') {
241
for (i = index_table[buffer[1]&0x7f];
242
i < index_table[(buffer[1]&0x7f)+1];
244
ylen = strlen((const char *)(K2rom_ptr[i].kana));
246
if (max_match < ylen) {
247
if (strncmp((const char *)buffer, (const char *)K2rom_ptr[i].kana, ylen) == 0) {
249
max_romaji = K2rom_ptr[i].romaji;
254
if (strncmp((const char *)buffer, (const char *)K2rom_ptr[i].kana, clen) == 0)
259
if (max_romaji == NULL) {
263
for (i = 0; max_romaji[i] != '\0'; ++ i) {
265
n[i].c1 = max_romaji[i];
271
return (match_more == 0) ? max_match : -max_match;
279
return K2rom(c, n, ASCII);
287
return K2rom(c, n, JISROMAN);
295
if (c[0].c1 == 0xa5) {
296
if (c[0].c2 < 0xf4) { /* != charcter code(\245\364),charcter code(\245\365),charcter code(\245\366) */
304
} else if (c[0].c2 == 0xf4) { /* == charcter code(\245\364) */
315
} else if (c[0].c2 == 0xf5) { /* == charcter code(\245\365) */
323
} else if (c[0].c2 == 0xf6) { /* == charcter code(\245\366) */
332
} else if ((c[0].c1 == 0xa1) &&
333
((c[0].c2 == 0xbc) || (c[0].c2 == 0xab) || (c[0].c2 == 0xac))) {
356
static unsigned char K2k_table[0x60][3] = {
357
"", "'", "1", "(", "2", ")", "3", "*",
358
"4", "+", "5", "6", "6^", "7", "7^", "8",
359
"8^", "9", "9^", ":", ":^", ";", ";^", "<",
360
"<^", "=", "=^", ">", ">^", "?", "?^", "@",
361
"@^", "A", "A^", "/", "B", "B^", "C", "C^",
362
"D", "D^", "E", "F", "G", "H", "I", "J",
363
"J^", "J_", "K", "K^", "K_", "L", "L^", "L_",
364
"M", "M^", "M_", "N", "N^", "N_", "O", "P",
365
"Q", "R", "S", ",", "T", "-", "U", ".",
366
"V", "W", "X", "Y", "Z", "[", "\\", "\\",
367
"2", "4", "&", "]", "3^", "6", "9", "",
368
"", "", "", "", "", "", "", ""};
370
if (c[0].c1 == 0xa5) {
371
for (b = K2k_table[(c[0].c2 & 0x7f) - 0x20], i = 0;
372
*b != '\0'; ++ b, ++ i) {
373
n[i].type = KATAKANA;
378
} else if ((c[0].c1 == 0xa1) &&
379
((c[0].c2 == 0xbc) || (c[0].c2 == 0xab) || (c[0].c2 == 0xac))) {
380
n[0].type = KATAKANA;
383
n[0].c1 = '0'; break;
385
n[0].c1 = '^'; break;
387
n[0].c1 = '_'; break;
404
if (c[0].c1 == 0xa5 || (c[0].c1 == 0xa1 && c[0].c2 == 0xbc)) {
414
#endif /* WAKATIGAKI */