1 /*
2 * KAKASI (Kanji Kana Simple inversion program)
3 * $Header: k2.c,v 2.0 92/07/18 12:07:09 takahasi Locked $
4 * Copyright (C) 1992
5 * Hironobu Takahashi (takahasi@tiny.or.jp)
6 *
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)
10 * any later version.
11 *
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.
16 *
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., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21 /* $Log: k2.c,v $
22 * Revision 2.0 92/07/18 12:07:09 takahasi
23 * *** empty log message ***
24 *
25 */
26 #include <stdio.h>
27 #include <string.h>
28 #include "kakasi.h"
29
30 struct k2rom_tbl {
31 char kana[5];
32 char romaji[7];
33 }
34 k2rom_h_table[] = {
35 " ", " ", "!", ".", "\"", "(", "#", ")", "$", ",", "%", ".", "&",
36 "wo","'", "a","(", "i",")", "u","*", "e","+", "o",",", "ya","-",
37 "yu",".", "yo","/", "tu","/3^", "vvu","/3^'", "vva","/3^(",
38 "vvi","/3^*", "vve","/3^+", "vvo","/6", "kka","/6^", "gga","/7",
39 "kki","/7,", "kkya","/7-", "kkyu","/7.", "kkyo","/7^", "ggi","/7^,",
40 "ggya","/7^-", "ggyu","/7^.", "ggyo","/8", "kku","/8^", "ggu","/9",
41 "kke","/9^", "gge","/:", "kko","/:^", "ggo","/;", "ssa","/;^",
42 "zza","/<", "sshi","/<,", "ssha","/<-", "sshu","/<.", "ssho","/<^",
43 "jji","/<^,", "jja","/<^-", "jju","/<^.", "jjo","/=", "ssu","/=^",
44 "zzu","/>", "sse","/>^", "zze","/?", "sso","/?^", "zzo","/@",
45 "tta","/@^", "dda","/A", "cchi","/A,", "ccha","/A-", "cchu","/A.",
46 "ccho","/A^", "ddi","/A^,", "ddya","/A^-", "ddyu","/A^.", "ddyo","/B",
47 "ttsu","/B^", "ddu","/C", "tte","/C^", "dde","/D", "tto","/D^",
48 "ddo","/J", "hha","/J^", "bba","/J_", "ppa","/K", "hhi","/K,",
49 "hhya","/K-", "hhyu","/K.", "hhyo","/K^", "bbi","/K^,", "bbya","/K^-",
50 "bbyu","/K^.", "bbyo","/K_", "ppi","/K_,", "ppya","/K_-",
51 "ppyu","/K_.", "ppyo","/L", "ffu","/L'", "ffa","/L(", "ffi","/L*",
52 "ffe","/L+", "ffo","/L^", "bbu","/L_", "ppu","/M", "hhe","/M^",
53 "bbe","/M_", "ppe","/N", "hho","/N^", "bbo","/N_", "ppo","/T",
54 "yya","/U", "yyu","/V", "yyo","/W", "rra","/X", "rri","/X,",
55 "rrya","/X-", "rryu","/X.", "rryo","/Y", "rru","/Z", "rre","/[",
56 "rro","0", "^","1", "a","2", "i","3", "u","3^", "vu","3^'",
57 "va","3^(", "vi","3^*", "ve","3^+", "vo","4", "e","5", "o","6",
58 "ka","6^", "ga","7", "ki","7,", "kya","7-", "kyu","7.", "kyo","7^",
59 "gi","7^,", "gya","7^-", "gyu","7^.", "gyo","8", "ku","8^", "gu","9",
60 "ke","9^", "ge",":", "ko",":^", "go",";", "sa",";^", "za","<",
61 "shi","<,", "sha","<-", "shu","<.", "sho","<^", "ji","<^,",
62 "ja","<^-", "ju","<^.", "jo","=", "su","=^", "zu",">", "se",">^",
63 "ze","?", "so","?^", "zo","@", "ta","@^", "da","A", "chi","A,",
64 "cha","A-", "chu","A.", "cho","A^", "di","A^,", "dya","A^-",
65 "dyu","A^.", "dyo","B", "tsu","B^", "du","C", "te","C^", "de","D",
66 "to","D^", "do","E", "na","F", "ni","F,", "nya","F-", "nyu","F.",
67 "nyo","G", "nu","H", "ne","I", "no","J", "ha","J^", "ba","J_",
68 "pa","K", "hi","K,", "hya","K-", "hyu","K.", "hyo","K^", "bi","K^,",
69 "bya","K^-", "byu","K^.", "byo","K_", "pi","K_,", "pya","K_-",
70 "pyu","K_.", "pyo","L", "fu","L'", "fa","L(", "fi","L*", "fe","L+",
71 "fo","L^", "bu","L_", "pu","M", "he","M^", "be","M_", "pe","N",
72 "ho","N^", "bo","N_", "po","O", "ma","P", "mi","P,", "mya","P-",
73 "myu","P.", "myo","Q", "mu","R", "me","S", "mo","T", "ya","U",
74 "yu","V", "yo","W", "ra","X", "ri","X,", "rya","X-", "ryu","X.",
75 "ryo","Y", "ru","Z", "re","[", "ro","\\", "wa","]", "n",
76 "]1", "n'a", "]2", "n'i", "]3", "n'u", "]4", "n'e", "]5", "n'o",
77 "^", "\"","_", "(maru)", "", ""
78 }, k2rom_k_table[] = {
79 " ", " ", "!", ".", "\"", "(", "#", ")", "$", ",", "%", ".", "&",
80 "wo", "'", "a", "(", "i", ")", "u", "*", "e", "+", "o", ",", "ya",
81 "-", "yu", ".", "yo", "/", "tsu", "/3^", "vvu", "/3^'", "vva", "/3^(",
82 "vvi", "/3^*", "vve", "/3^+", "vvo", "/6", "kka", "/6^", "gga", "/7",
83 "kki", "/7,", "kkya", "/7-", "kkyu", "/7.", "kkyo", "/7^", "ggi",
84 "/7^,", "ggya", "/7^-", "ggyu", "/7^.", "ggyo", "/8", "kku", "/8^",
85 "ggu", "/9", "kke", "/9^", "gge", "/:", "kko", "/:^", "ggo", "/;",
86 "ssa", "/;^", "zza", "/<", "ssi", "/<,", "ssya", "/<-", "ssyu", "/<.",
87 "ssyo", "/<^", "zzi", "/<^,", "zzya", "/<^-", "zzyu", "/<^.", "zzyo",
88 "/=", "ssu", "/=^", "zzu", "/>", "sse", "/>^", "zze", "/?", "sso",
89 "/?^", "zzo", "/@", "tta", "/@^", "dda", "/A", "tti", "/A,", "ttya",
90 "/A-", "ttyu", "/A.", "ttyo", "/A^", "ddi", "/A^,", "ddya", "/A^-",
91 "ddyu", "/A^.", "ddyo", "/B", "ttu", "/B^", "ddu", "/C", "tte", "/C^",
92 "dde", "/D", "tto", "/D^", "ddo", "/J", "hha", "/J^", "bba", "/J_",
93 "ppa", "/K", "hhi", "/K,", "hhya", "/K-", "hhyu", "/K.", "hhyo",
94 "/K^", "bbi", "/K^,", "bbya", "/K^-", "bbyu", "/K^.", "bbyo", "/K_",
95 "ppi", "/K_,", "ppya", "/K_-", "ppyu", "/K_.", "ppyo", "/L", "hhu",
96 "/L'", "ffa", "/L(", "ffi", "/L*", "ffe", "/L+", "ffo", "/L^", "bbu",
97 "/L_", "ppu", "/M", "hhe", "/M^", "bbe", "/M_", "ppe", "/N", "hho",
98 "/N^", "bbo", "/N_", "ppo", "/T", "yya", "/U", "yyu", "/V", "yyo",
99 "/W", "rra", "/X", "rri", "/X,", "rrya", "/X-", "rryu", "/X.", "rryo",
100 "/Y", "rru", "/Z", "rre", "/[", "rro", "0", "^", "1", "a", "2", "i",
101 "3", "u", "3^", "vu", "3^'", "va", "3^(", "vi", "3^*", "ve", "3^+",
102 "vo", "4", "e", "5", "o", "6", "ka", "6^", "ga", "7", "ki", "7,",
103 "kya", "7-", "kyu", "7.", "kyo", "7^", "gi", "7^,", "gya", "7^-",
104 "gyu", "7^.", "gyo", "8", "ku", "8^", "gu", "9", "ke", "9^", "ge",
105 ":", "ko", ":^", "go", ";", "sa", ";^", "za", "<", "si", "<,", "sya",
106 "<-", "syu", "<.", "syo", "<^", "zi", "<^,", "zya", "<^-", "zyu",
107 "<^.", "zyo", "=", "su", "=^", "zu", ">", "se", ">^", "ze", "?", "so",
108 "?^", "zo", "@", "ta", "@^", "da", "A", "ti", "A,", "tya", "A-",
109 "tyu", "A.", "tyo", "A^", "di", "A^,", "dya", "A^-", "dyu", "A^.",
110 "dyo", "B", "tu", "B^", "du", "C", "te", "C^", "de", "D", "to", "D^",
111 "do", "E", "na", "F", "ni", "F,", "nya", "F-", "nyu", "F.", "nyo",
112 "G", "nu", "H", "ne", "I", "no", "J", "ha", "J^", "ba", "J_", "pa",
113 "K", "hi", "K,", "hya", "K-", "hyu", "K.", "hyo", "K^", "bi", "K^,",
114 "bya", "K^-", "byu", "K^.", "byo", "K_", "pi", "K_,", "pya", "K_-",
115 "pyu", "K_.", "pyo", "L", "hu", "L'", "fa", "L(", "fi", "L*", "fe",
116 "L+", "fo", "L^", "bu", "L_", "pu", "M", "he", "M^", "be", "M_", "pe",
117 "N", "ho", "N^", "bo", "N_", "po", "O", "ma", "P", "mi", "P,", "mya",
118 "P-", "myu", "P.", "myo", "Q", "mu", "R", "me", "S", "mo", "T", "ya",
119 "U", "yu", "V", "yo", "W", "ra", "X", "ri", "X,", "rya", "X-", "ryu",
120 "X.", "ryo", "Y", "ru", "Z", "re", "[", "ro", "\\", "wa", "]", "n",
121 "]1", "n'a", "]2", "n'i", "]3", "n'u", "]4", "n'e", "]5", "n'o",
122 "^", "\"", "_", "(maru)", "", ""};
123
124
125 #define k2rom_buflen 10
126
k2rom(c,n,type)127 static int k2rom(c, n, type)
128 Character *c;
129 Character *n;
130 int type;
131 {
132 static int index_table[0x41];
133 static int index_made=0;
134 static struct k2rom_tbl *k2rom_ptr;
135 struct k2rom_tbl *p;
136 int i, clen, ylen;
137 char buffer[k2rom_buflen];
138 unsigned char c1;
139 int max_match, match_more;
140 char *max_romaji;
141
142 if (index_made == 0) {
143 k2rom_ptr = (romaji_type == HEPBURN) ? k2rom_h_table : k2rom_k_table;
144 index_table[0] = 0;
145 for (p = k2rom_ptr, i = 0; *(p->kana) != '\0'; ++ p, ++ i) {
146 index_table[*(p->kana)-0x20+1] = i+1;
147 }
148 index_made = 1;
149 }
150
151 buffer[k2rom_buflen] = '\0'; clen = k2rom_buflen;
152 for (i = 0; i < k2rom_buflen; ++ i) {
153 c1 = c[i].c1;
154 if ((0 < c1) && (c1 < 0x20))
155 buffer[i] = ' ';
156 else if (0x60 < c1)
157 buffer[i] = ' ';
158 else
159 buffer[i] = c1;
160
161 if (c1 == '\0') {
162 clen = i;
163 break;
164 }
165 }
166
167 if (clen == 0) {
168 n[0].type=OTHER;
169 n[0].c1 = '\0';
170 return 0;
171 }
172
173 max_match = 0;
174 max_romaji = NULL;
175 match_more = 0;
176 for (i = index_table[buffer[0]-0x20];
177 i < index_table[buffer[0]-0x20+1];
178 ++ i) {
179 ylen = strlen(k2rom_ptr[i].kana);
180 if (clen >= ylen) {
181 if (max_match < ylen) {
182 if (strncmp(buffer, k2rom_ptr[i].kana, ylen) == 0) {
183 max_match = ylen;
184 max_romaji = k2rom_ptr[i].romaji;
185 }
186 }
187 } else {
188 if (match_more == 0)
189 if (strncmp(buffer, k2rom_ptr[i].kana, clen) == 0)
190 match_more = 1;
191 }
192 }
193
194 for (i = 0; max_romaji[i] != '\0'; ++ i) {
195 n[i].type=type;
196 n[i].c1 = max_romaji[i];
197 }
198 n[i].type=OTHER;
199 n[i].c1 = '\0';
200 return (match_more == 0) ? max_match : -max_match;
201 }
202
k2a(c,n)203 int k2a(c, n)
204 Character *c;
205 Character *n;
206 {
207 return k2rom(c, n, ASCII);
208 }
209
k2j(c,n)210 int k2j(c, n)
211 Character *c;
212 Character *n;
213 {
214 return k2rom(c, n, JISROMAN);
215 }
216
k2K(c,n)217 int k2K(c, n)
218 Character *c;
219 Character *n;
220 {
221 int c1;
222 static unsigned char k2K_table[64][3] = {
223 "��", "��", "��", "��", "��", "��", "��", "��",
224 "��", "��", "��", "��", "��", "��", "��", "��",
225 "��", "��", "��", "��", "��", "��", "��", "��",
226 "��", "��", "��", "��", "��", "��", "��", "��",
227 "��", "��", "��", "��", "��", "��", "��", "��",
228 "��", "��", "��", "��", "��", "��", "��", "��",
229 "��", "��", "��", "��", "��", "��", "��", "��",
230 "��", "��", "��", "��", "��", "��", "��", "��" };
231 static unsigned char k2K_dtable[64][3] = {
232 "", "", "", "", "", "", "", "",
233 "", "", "", "", "", "", "", "",
234 "", "", "", "��", "", "", "��", "��",
235 "��", "��", "��", "��", "��", "��", "��", "��",
236 "��", "��", "��", "��", "��", "", "", "",
237 "", "", "��", "��", "��", "��", "��", "",
238 "", "", "", "", "", "", "", "",
239 "", "", "", "", "", "", "", "" };
240 static unsigned char k2K_htable[64][3] = {
241 "", "", "", "", "", "", "", "",
242 "", "", "", "", "", "", "", "",
243 "", "", "", "", "", "", "", "",
244 "", "", "", "", "", "", "" , "",
245 "", "", "", "", "", "", "", "",
246 "", "", "��", "��", "��", "��", "��", "",
247 "", "", "", "", "", "", "", "",
248 "", "", "", "", "", "", "", "" };
249
250 c1 = c -> c1;
251 if (c1 > 0x60) c1 = 0x20;
252 if (c[1].type==KATAKANA) {
253 if ((c[1].c1==0x5e) && (k2K_dtable[c1-0x20][0] != '\0')) {
254 n[0].type=JIS83;
255 n[0].c1 = k2K_dtable[c1-0x20][0];
256 n[0].c2 = k2K_dtable[c1-0x20][1];
257 n[1].type=OTHER; n[1].c1 = '\0';
258 return 2;
259 } else if ((c[1].c1==0x5f) && (k2K_htable[c1-0x20][0] != '\0')) {
260 n[0].type=JIS83;
261 n[0].c1 = k2K_htable[c1-0x20][0];
262 n[0].c2 = k2K_htable[c1-0x20][1];
263 n[1].type=OTHER; n[1].c1 = '\0';
264 return 2;
265 } else {
266 n[0].type=JIS83;
267 n[0].c1 = k2K_table[c1-0x20][0];
268 n[0].c2 = k2K_table[c1-0x20][1];
269 n[1].type=OTHER; n[1].c1 = '\0';
270 return 1;
271 }
272 } else {
273 n[0].type=JIS83;
274 n[0].c1 = k2K_table[c1-0x20][0];
275 n[0].c2 = k2K_table[c1-0x20][1];
276 n[1].type=OTHER; n[1].c1 = '\0';
277 if (k2K_dtable[c1-0x20][0] == '\0')
278 return 1;
279 else
280 return -1;
281 }
282 }
283
k2H(c,n)284 int k2H(c, n)
285 Character *c;
286 Character *n;
287 {
288 int c1;
289 static unsigned char k2H_table[64][3] = {
290 "��", "��", "��", "��", "��", "��", "��", "��",
291 "��", "��", "��", "��", "��", "��", "��", "��",
292 "��", "��", "��", "��", "��", "��", "��", "��",
293 "��", "��", "��", "��", "��", "��", "��", "��",
294 "��", "��", "��", "��", "��", "��", "��", "��",
295 "��", "��", "��", "��", "��", "��", "��", "��",
296 "��", "��", "��", "��", "��", "��", "��", "��",
297 "��", "��", "��", "��", "��", "��", "��", "��" };
298 static unsigned char k2H_dtable[64][3] = {
299 "", "", "", "", "", "", "", "",
300 "", "", "", "", "", "", "", "",
301 "", "", "", "", "", "", "��", "��",
302 "��", "��", "��", "��", "��", "��", "��", "��",
303 "��", "��", "��", "��", "��", "", "", "",
304 "", "", "��", "��", "��", "��", "��", "",
305 "", "", "", "", "", "", "", "",
306 "", "", "", "", "", "", "", "" };
307 static unsigned char k2H_htable[64][3] = {
308 "", "", "", "", "", "", "", "",
309 "", "", "", "", "", "", "", "",
310 "", "", "", "", "", "", "", "",
311 "", "", "", "", "", "", "" , "",
312 "", "", "", "", "", "", "", "",
313 "", "", "��", "��", "��", "��", "��", "",
314 "", "", "", "", "", "", "", "",
315 "", "", "", "", "", "", "", "" };
316
317 c1 = c -> c1;
318 if (c1 > 0x60) c1 = 0x20;
319 if (c[1].type==KATAKANA) {
320 if ((c[1].c1==0x5e) && (k2H_dtable[c1-0x20][0] != '\0')) {
321 n[0].type=JIS83;
322 n[0].c1 = k2H_dtable[c1-0x20][0];
323 n[0].c2 = k2H_dtable[c1-0x20][1];
324 n[1].type=OTHER; n[1].c1 = '\0';
325 return 2;
326 } else if ((c[1].c1==0x5f) && (k2H_htable[c1-0x20][0] != '\0')) {
327 n[0].type=JIS83;
328 n[0].c1 = k2H_htable[c1-0x20][0];
329 n[0].c2 = k2H_htable[c1-0x20][1];
330 n[1].type=OTHER; n[1].c1 = '\0';
331 return 2;
332 } else {
333 n[0].type=JIS83;
334 n[0].c1 = k2H_table[c1-0x20][0];
335 n[0].c2 = k2H_table[c1-0x20][1];
336 n[1].type=OTHER; n[1].c1 = '\0';
337 return 1;
338 }
339 } else {
340 n[0].type=JIS83;
341 n[0].c1 = k2H_table[c1-0x20][0];
342 n[0].c2 = k2H_table[c1-0x20][1];
343 n[1].type=OTHER; n[1].c1 = '\0';
344 if (k2H_dtable[c1-0x20][0] == '\0')
345 return 1;
346 else
347 return -1;
348 }
349 }
350