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