2
* KAKASI (Kanji Kana Simple inversion program)
3
* $Id: hh2.c,v 1.5 2001/05/30 05:46:55 takesako 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
"\244\241", "a", "\244\242", "a", "\244\243", "i", "\244\244", "i", "\244\245", "u", "\244\246", "u",
42
"\244\246\241\253", "vu", "\244\246\241\253\244\241", "va", "\244\246\241\253\244\243", "vi", "\244\246\241\253\244\247", "ve",
43
"\244\246\241\253\244\251", "vo",
44
"\244\247", "e", "\244\250", "e", "\244\251", "o", "\244\252", "o",
46
"\244\253", "ka", "\244\254", "ga", "\244\255", "ki", "\244\255\244\343", "kya", "\244\255\244\345", "kyu",
47
"\244\255\244\347", "kyo", "\244\256", "gi", "\244\256\244\343", "gya", "\244\256\244\345", "gyu", "\244\256\244\347", "gyo",
48
"\244\257", "ku", "\244\260", "gu", "\244\261", "ke", "\244\262", "ge", "\244\263", "ko", "\244\264", "go",
50
"\244\265", "sa", "\244\266", "za", "\244\267", "shi", "\244\267\244\343", "sha", "\244\267\244\345", "shu",
51
"\244\267\244\347", "sho", "\244\270", "ji", "\244\270\244\343", "ja", "\244\270\244\345", "ju", "\244\270\244\347", "jo",
52
"\244\271", "su", "\244\272", "zu", "\244\273", "se", "\244\274", "ze", "\244\275", "so", "\244\276", "zo",
54
"\244\277", "ta", "\244\300", "da", "\244\301", "chi", "\244\301\244\343", "cha", "\244\301\244\345", "chu",
55
"\244\301\244\347", "cho", "\244\302", "di", "\244\302\244\343", "dya", "\244\302\244\345", "dyu", "\244\302\244\347", "dyo",
58
"\244\303\244\246\241\253", "vvu", "\244\303\244\246\241\253\244\241", "vva", "\244\303\244\246\241\253\244\243", "vvi",
59
"\244\303\244\246\241\253\244\247", "vve", "\244\303\244\246\241\253\244\251", "vvo",
60
"\244\303\244\253", "kka", "\244\303\244\254", "gga", "\244\303\244\255", "kki", "\244\303\244\255\244\343", "kkya",
61
"\244\303\244\255\244\345", "kkyu", "\244\303\244\255\244\347", "kkyo", "\244\303\244\256", "ggi", "\244\303\244\256\244\343", "ggya",
62
"\244\303\244\256\244\345", "ggyu", "\244\303\244\256\244\347", "ggyo", "\244\303\244\257", "kku", "\244\303\244\260", "ggu",
63
"\244\303\244\261", "kke", "\244\303\244\262", "gge", "\244\303\244\263", "kko", "\244\303\244\264", "ggo", "\244\303\244\265", "ssa",
64
"\244\303\244\266", "zza", "\244\303\244\267", "sshi", "\244\303\244\267\244\343", "ssha",
65
"\244\303\244\267\244\345", "sshu", "\244\303\244\267\244\347", "ssho",
66
"\244\303\244\270", "jji", "\244\303\244\270\244\343", "jja", "\244\303\244\270\244\345", "jju", "\244\303\244\270\244\347", "jjo",
67
"\244\303\244\271", "ssu", "\244\303\244\272", "zzu", "\244\303\244\273", "sse", "\244\303\244\274", "zze", "\244\303\244\275", "sso",
68
"\244\303\244\276", "zzo", "\244\303\244\277", "tta", "\244\303\244\300", "dda", "\244\303\244\301", "cchi",
69
"\244\303\244\301\244\343", "ccha", "\244\303\244\301\244\345", "cchu", "\244\303\244\301\244\347", "ccho", "\244\303\244\302", "ddi",
70
"\244\303\244\302\244\343", "ddya", "\244\303\244\302\244\345", "ddyu", "\244\303\244\302\244\347", "ddyo", "\244\303\244\304", "ttsu",
71
"\244\303\244\305", "ddu", "\244\303\244\306", "tte", "\244\303\244\307", "dde", "\244\303\244\310", "tto", "\244\303\244\311", "ddo",
72
"\244\303\244\317", "hha", "\244\303\244\320", "bba", "\244\303\244\321", "ppa", "\244\303\244\322", "hhi",
73
"\244\303\244\322\244\343", "hhya", "\244\303\244\322\244\345", "hhyu", "\244\303\244\322\244\347", "hhyo", "\244\303\244\323", "bbi",
74
"\244\303\244\323\244\343", "bbya", "\244\303\244\323\244\345", "bbyu", "\244\303\244\323\244\347", "bbyo", "\244\303\244\324", "ppi",
75
"\244\303\244\324\244\343", "ppya", "\244\303\244\324\244\345", "ppyu", "\244\303\244\324\244\347", "ppyo", "\244\303\244\325", "ffu",
76
"\244\303\244\325\244\241", "ffa", "\244\303\244\325\244\243", "ffi", "\244\303\244\325\244\247", "ffe", "\244\303\244\325\244\251", "ffo",
77
"\244\303\244\326", "bbu", "\244\303\244\327", "ppu", "\244\303\244\330", "hhe", "\244\303\244\331", "bbe", "\244\303\244\332", "ppe",
78
"\244\303\244\333", "hho", "\244\303\244\334", "bbo", "\244\303\244\335", "ppo", "\244\303\244\344", "yya", "\244\303\244\346", "yyu",
79
"\244\303\244\350", "yyo", "\244\303\244\351", "rra", "\244\303\244\352", "rri", "\244\303\244\352\244\343", "rrya",
80
"\244\303\244\352\244\345", "rryu", "\244\303\244\352\244\347", "rryo", "\244\303\244\353", "rru", "\244\303\244\354", "rre",
81
"\244\303\244\355", "rro",
83
"\244\304", "tsu", "\244\305", "du", "\244\306", "te", "\244\307", "de", "\244\310", "to", "\244\311", "do",
85
"\244\312", "na", "\244\313", "ni", "\244\313\244\343", "nya", "\244\313\244\345", "nyu", "\244\313\244\347", "nyo",
86
"\244\314", "nu", "\244\315", "ne", "\244\316", "no",
88
"\244\317", "ha", "\244\320", "ba", "\244\321", "pa", "\244\322", "hi", "\244\322\244\343", "hya",
89
"\244\322\244\345", "hyu", "\244\322\244\347", "hyo", "\244\323", "bi", "\244\323\244\343", "bya", "\244\323\244\345", "byu",
90
"\244\323\244\347", "byo", "\244\324", "pi", "\244\324\244\343", "pya", "\244\324\244\345", "pyu", "\244\324\244\347", "pyo",
91
"\244\325", "fu", "\244\325\244\241", "fa", "\244\325\244\243", "fi", "\244\325\244\247", "fe", "\244\325\244\251", "fo",
92
"\244\326", "bu", "\244\327", "pu", "\244\330", "he", "\244\331", "be", "\244\332", "pe", "\244\333", "ho",
93
"\244\334", "bo", "\244\335", "po",
95
"\244\336", "ma", "\244\337", "mi", "\244\337\244\343", "mya", "\244\337\244\345", "myu", "\244\337\244\347", "myo",
96
"\244\340", "mu", "\244\341", "me", "\244\342", "mo",
98
"\244\343", "ya", "\244\344", "ya", "\244\345", "yu", "\244\346", "yu", "\244\347", "yo", "\244\350", "yo",
100
"\244\351", "ra", "\244\352", "ri", "\244\352\244\343", "rya", "\244\352\244\345", "ryu", "\244\352\244\347", "ryo",
101
"\244\353", "ru", "\244\354", "re", "\244\355", "ro",
103
"\244\356", "wa", "\244\357", "wa", "\244\360", "i", "\244\361", "e",
104
"\244\362", "wo", "\244\363", "n",
105
"\244\363\244\242", "n'a", "\244\363\244\244", "n'i", "\244\363\244\246", "n'u", "\244\363\244\250", "n'e", "\244\363\244\252", "n'o",
108
}, H2rom_k_table[] = {
110
"\244\241", "a", "\244\242", "a", "\244\243", "i", "\244\244", "i", "\244\245", "u", "\244\246", "u",
111
"\244\246\241\253", "vu", "\244\246\241\253\244\241", "va", "\244\246\241\253\244\243", "vi",
112
"\244\246\241\253\244\247", "ve", "\244\246\241\253\244\251", "vo",
113
"\244\247", "e", "\244\250", "e", "\244\251", "o", "\244\252", "o",
115
"\244\253", "ka", "\244\254", "ga", "\244\255", "ki", "\244\255\244\343", "kya", "\244\255\244\345", "kyu",
116
"\244\255\244\347", "kyo", "\244\256", "gi", "\244\256\244\343", "gya", "\244\256\244\345", "gyu", "\244\256\244\347", "gyo",
117
"\244\257", "ku", "\244\260", "gu", "\244\261", "ke", "\244\262", "ge", "\244\263", "ko", "\244\264", "go",
119
"\244\265", "sa", "\244\266", "za", "\244\267", "si", "\244\267\244\343", "sya", "\244\267\244\345", "syu",
120
"\244\267\244\347", "syo", "\244\270", "zi", "\244\270\244\343", "zya", "\244\270\244\345", "zyu", "\244\270\244\347", "zyo",
121
"\244\271", "su", "\244\272", "zu", "\244\273", "se", "\244\274", "ze", "\244\275", "so", "\244\276", "zo",
123
"\244\277", "ta", "\244\300", "da", "\244\301", "ti", "\244\301\244\343", "tya", "\244\301\244\345", "tyu",
124
"\244\301\244\347", "tyo", "\244\302", "di", "\244\302\244\343", "dya", "\244\302\244\345", "dyu", "\244\302\244\347", "dyo",
127
"\244\303\244\246\241\253", "vvu", "\244\303\244\246\241\253\244\241", "vva", "\244\303\244\246\241\253\244\243", "vvi",
128
"\244\303\244\246\241\253\244\247", "vve", "\244\303\244\246\241\253\244\251", "vvo",
129
"\244\303\244\253", "kka", "\244\303\244\254", "gga", "\244\303\244\255", "kki", "\244\303\244\255\244\343", "kkya",
130
"\244\303\244\255\244\345", "kkyu", "\244\303\244\255\244\347", "kkyo", "\244\303\244\256", "ggi", "\244\303\244\256\244\343", "ggya",
131
"\244\303\244\256\244\345", "ggyu", "\244\303\244\256\244\347", "ggyo", "\244\303\244\257", "kku", "\244\303\244\260", "ggu",
132
"\244\303\244\261", "kke", "\244\303\244\262", "gge", "\244\303\244\263", "kko", "\244\303\244\264", "ggo", "\244\303\244\265", "ssa",
133
"\244\303\244\266", "zza", "\244\303\244\267", "ssi", "\244\303\244\267\244\343", "ssya",
134
"\244\303\244\267\244\345", "ssyu", "\244\303\244\267\244\347", "ssho",
135
"\244\303\244\270", "zzi", "\244\303\244\270\244\343", "zzya", "\244\303\244\270\244\345", "zzyu", "\244\303\244\270\244\347", "zzyo",
136
"\244\303\244\271", "ssu", "\244\303\244\272", "zzu", "\244\303\244\273", "sse", "\244\303\244\274", "zze", "\244\303\244\275", "sso",
137
"\244\303\244\276", "zzo", "\244\303\244\277", "tta", "\244\303\244\300", "dda", "\244\303\244\301", "tti",
138
"\244\303\244\301\244\343", "ttya", "\244\303\244\301\244\345", "ttyu", "\244\303\244\301\244\347", "ttyo", "\244\303\244\302", "ddi",
139
"\244\303\244\302\244\343", "ddya", "\244\303\244\302\244\345", "ddyu", "\244\303\244\302\244\347", "ddyo", "\244\303\244\304", "ttu",
140
"\244\303\244\305", "ddu", "\244\303\244\306", "tte", "\244\303\244\307", "dde", "\244\303\244\310", "tto", "\244\303\244\311", "ddo",
141
"\244\303\244\317", "hha", "\244\303\244\320", "bba", "\244\303\244\321", "ppa", "\244\303\244\322", "hhi",
142
"\244\303\244\322\244\343", "hhya", "\244\303\244\322\244\345", "hhyu", "\244\303\244\322\244\347", "hhyo", "\244\303\244\323", "bbi",
143
"\244\303\244\323\244\343", "bbya", "\244\303\244\323\244\345", "bbyu", "\244\303\244\323\244\347", "bbyo", "\244\303\244\324", "ppi",
144
"\244\303\244\324\244\343", "ppya", "\244\303\244\324\244\345", "ppyu", "\244\303\244\324\244\347", "ppyo", "\244\303\244\325", "hhu",
145
"\244\303\244\325\244\241", "ffa", "\244\303\244\325\244\243", "ffi", "\244\303\244\325\244\247", "ffe", "\244\303\244\325\244\251", "ffo",
146
"\244\303\244\326", "bbu", "\244\303\244\327", "ppu", "\244\303\244\330", "hhe", "\244\303\244\331", "bbe", "\244\303\244\332", "ppe",
147
"\244\303\244\333", "hho", "\244\303\244\334", "bbo", "\244\303\244\335", "ppo", "\244\303\244\344", "yya", "\244\303\244\346", "yyu",
148
"\244\303\244\350", "yyo", "\244\303\244\351", "rra", "\244\303\244\352", "rri", "\244\303\244\352\244\343", "rrya",
149
"\244\303\244\352\244\345", "rryu", "\244\303\244\352\244\347", "rryo", "\244\303\244\353", "rru", "\244\303\244\354", "rre",
150
"\244\303\244\355", "rro",
152
"\244\304", "tu", "\244\305", "du", "\244\306", "te", "\244\307", "de", "\244\310", "to", "\244\311", "do",
154
"\244\312", "na", "\244\313", "ni", "\244\313\244\343", "nya", "\244\313\244\345", "nyu", "\244\313\244\347", "nyo",
155
"\244\314", "nu", "\244\315", "ne", "\244\316", "no",
157
"\244\317", "ha", "\244\320", "ba", "\244\321", "pa", "\244\322", "hi", "\244\322\244\343", "hya",
158
"\244\322\244\345", "hyu", "\244\322\244\347", "hyo", "\244\323", "bi", "\244\323\244\343", "bya", "\244\323\244\345", "byu",
159
"\244\323\244\347", "byo", "\244\324", "pi", "\244\324\244\343", "pya", "\244\324\244\345", "pyu", "\244\324\244\347", "pyo",
160
"\244\325", "hu", "\244\325\244\241", "fa", "\244\325\244\243", "fi", "\244\325\244\247", "fe", "\244\325\244\251", "fo",
161
"\244\326", "bu", "\244\327", "pu", "\244\330", "he", "\244\331", "be", "\244\332", "pe", "\244\333", "ho",
162
"\244\334", "bo", "\244\335", "po",
164
"\244\336", "ma", "\244\337", "mi", "\244\337\244\343", "mya", "\244\337\244\345", "myu", "\244\337\244\347", "myo",
165
"\244\340", "mu", "\244\341", "me", "\244\342", "mo",
167
"\244\343", "ya", "\244\344", "ya", "\244\345", "yu", "\244\346", "yu", "\244\347", "yo", "\244\350", "yo",
169
"\244\351", "ra", "\244\352", "ri", "\244\352\244\343", "rya", "\244\352\244\345", "ryu", "\244\352\244\347", "ryo",
170
"\244\353", "ru", "\244\354", "re", "\244\355", "ro",
172
"\244\356", "wa", "\244\357", "wa", "\244\360", "i", "\244\361", "e",
173
"\244\362", "wo", "\244\363", "n",
174
"\244\363\244\242", "n'a", "\244\363\244\244", "n'i", "\244\363\244\246", "n'u", "\244\363\244\250", "n'e", "\244\363\244\252", "n'o",
178
#define H2rom_buflen 11
186
static int index_table[0x81];
187
static int index_made=0;
188
static struct H2rom_tbl *H2rom_ptr;
191
unsigned char buffer[H2rom_buflen];
192
int max_match, match_more;
195
if (index_made == 0) {
198
for (i = 0; i < 0x81; ++ i) {
201
index_table[0x21] = 0;
202
H2rom_ptr = (romaji_type == HEPBURN) ? H2rom_h_table : H2rom_k_table;
203
for (p = H2rom_ptr, i = 0; *(p->kana) != '\0'; ++ p, ++ i) {
204
index_table[(((p->kana)[1])&0x7f)+1] = i+1;
207
for (i = 0x80; i >= 0; -- i) {
208
if (index_table[i] == -1)
209
index_table[i] = last;
211
last = index_table[i];
216
buffer[H2rom_buflen-1] = '\0'; clen = H2rom_buflen-1;
217
for (i = 0; i < (H2rom_buflen-1)/2; i ++) {
218
buffer[i*2 ] = c[i].c1;
219
buffer[i*2+1] = c[i].c2;
221
if (c[i].c1 == '\0') {
236
for (i = index_table[buffer[1]&0x7f];
237
i < index_table[(buffer[1]&0x7f)+1];
239
ylen = strlen((const char *)(H2rom_ptr[i].kana));
241
if (max_match < ylen) {
242
if (strncmp((const char *)buffer, (char *)(H2rom_ptr[i].kana), ylen) == 0) {
244
max_romaji = H2rom_ptr[i].romaji;
249
if (strncmp((const char *)buffer, (char *)(H2rom_ptr[i].kana), clen) == 0)
254
if (max_romaji == NULL) {
258
for (i = 0; max_romaji[i] != '\0'; ++ i) {
260
n[i].c1 = max_romaji[i];
266
return (match_more == 0) ? max_match : -max_match;
274
return H2rom(c, n, ASCII);
282
return H2rom(c, n, JISROMAN);
290
if (c[0].c1 == 0xa4) {
297
if (c[0].c2 == 0xa6) { /* == charcter code(\244\246) */
300
if ((c[1].c1 == 0xa1) && (c[1].c2 == 0xab)) { /* == charcter code(\244\246),charcter code(\241\253) */
308
} else if ((c[0].c1 == 0xa1) &&
309
((c[0].c2 == 0xbc) || (c[0].c2 == 0xab) || (c[0].c2 == 0xac))) {
333
static unsigned char H2k_table[0x60][3] = {
334
"", "'", "1", "(", "2", ")", "3", "*",
335
"4", "+", "5", "6", "6^", "7", "7^", "8",
336
"8^", "9", "9^", ":", ":^", ";", ";^", "<",
337
"<^", "=", "=^", ">", ">^", "?", "?^", "@",
338
"@^", "A", "A^", "/", "B", "B^", "C", "C^",
339
"D", "D^", "E", "F", "G", "H", "I", "J",
340
"J^", "J_", "K", "K^", "K_", "L", "L^", "L_",
341
"M", "M^", "M_", "N", "N^", "N_", "O", "P",
342
"Q", "R", "S", ",", "T", "-", "U", ".",
343
"V", "W", "X", "Y", "Z", "[", "\\", "\\",
344
"2", "4", "&", "]", "", "", "", "",
345
"", "", "", "", "", "", "", ""};
347
if (c[0].c1 == 0xa4) {
348
for (b = H2k_table[(c[0].c2 & 0x7f) - 0x20], i = 0;
349
*b != '\0'; ++ b, ++ i) {
350
n[i].type = KATAKANA;
355
} else if ((c[0].c1 == 0xa1) &&
356
((c[0].c2 == 0xbc) || (c[0].c2 == 0xab) || (c[0].c2 == 0xac))) {
357
n[0].type = KATAKANA;
360
n[0].c1 = '0'; break;
362
n[0].c1 = '^'; break;
364
n[0].c1 = '_'; break;
376
/* As for the hiragana as well, the function which isn't necessarily needed if reading raising becomes possible. */
382
unsigned char wo_separator = ' ';
384
if (c[0].c1 == 0xa4 && c[0].c2 != 0xF2) { /* != charcter code(\244\362) */
385
if ( bunkatu_mode ) {
386
if ( wo_mode == 2 ) {
388
n[0].c1 = wo_separator;
417
} else if (c[0].c1 == 0xa4 && c[0].c2 == 0xF2) { /* '\244\362' */
419
if ( wo_mode == 1 || wo_mode == 2 ) {
421
n[0].c1 = wo_separator;
432
n[0].type = JIS83; /* aaa */
436
n[1].c1 = wo_separator;
445
n[0].type = JIS83; /* bbb */
453
} else if ((c[0].c1 == 0xa1) &&
454
((c[0].c2 == 0xbc) || (c[0].c2 == 0xab) || (c[0].c2 == 0xac))) {
469
#endif /* WAKATIGAKI */