OSDN Git Service

漢字コード判別の使い方を間違っていたので訂正。さらに漢字コード判別処理自体も厳密化した。
[hengband/hengband.git] / src / japanese.c
1 /* File: japanese.c */
2
3
4 #include "angband.h"
5
6 #ifdef JP
7
8 /*ÆüËܸìÆ°»ì³èÍÑ (ÂǤġäÂǤäÆ,ÂǤÁ etc) */
9
10 #define CMPTAIL(y) strncmp(&in[l-strlen(y)],y,strlen(y))
11
12 /* ²¥¤ë,½³¤ë¡ä²¥¤ê,½³¤ë */
13 void jverb1( const char *in , char *out){
14 int l=strlen(in);
15 strcpy(out,in);
16
17 if( CMPTAIL("¤¹¤ë")==0) sprintf(&out[l-4],"¤·");else
18 if( CMPTAIL("¤¤¤ë")==0) sprintf(&out[l-4],"¤¤¤Æ");else
19
20 if( CMPTAIL("¤¨¤ë")==0) sprintf(&out[l-4],"¤¨");else
21 if( CMPTAIL("¤±¤ë")==0) sprintf(&out[l-4],"¤±");else
22 if( CMPTAIL("¤²¤ë")==0) sprintf(&out[l-4],"¤²");else
23 if( CMPTAIL("¤»¤ë")==0) sprintf(&out[l-4],"¤»");else
24 if( CMPTAIL("¤¼¤ë")==0) sprintf(&out[l-4],"¤¼");else
25 if( CMPTAIL("¤Æ¤ë")==0) sprintf(&out[l-4],"¤Æ");else
26 if( CMPTAIL("¤Ç¤ë")==0) sprintf(&out[l-4],"¤Ç");else
27 if( CMPTAIL("¤Í¤ë")==0) sprintf(&out[l-4],"¤Í");else
28 if( CMPTAIL("¤Ø¤ë")==0) sprintf(&out[l-4],"¤Ø");else
29 if( CMPTAIL("¤Ù¤ë")==0) sprintf(&out[l-4],"¤Ù");else
30 if( CMPTAIL("¤á¤ë")==0) sprintf(&out[l-4],"¤á");else
31 if( CMPTAIL("¤ì¤ë")==0) sprintf(&out[l-4],"¤ì");else
32
33 if( CMPTAIL("¤¦")==0) sprintf(&out[l-2],"¤¤");else
34 if( CMPTAIL("¤¯")==0) sprintf(&out[l-2],"¤­");else
35 if( CMPTAIL("¤°")==0) sprintf(&out[l-2],"¤®");else
36 if( CMPTAIL("¤¹")==0) sprintf(&out[l-2],"¤·");else
37 if( CMPTAIL("¤º")==0) sprintf(&out[l-2],"¤¸");else
38 if( CMPTAIL("¤Ä")==0) sprintf(&out[l-2],"¤Á");else
39 if( CMPTAIL("¤Å")==0) sprintf(&out[l-2],"¤Â");else
40 if( CMPTAIL("¤Ì")==0) sprintf(&out[l-2],"¤Ë");else
41 if( CMPTAIL("¤Õ")==0) sprintf(&out[l-2],"¤Ò");else
42 if( CMPTAIL("¤Ö")==0) sprintf(&out[l-2],"¤Ó");else
43 if( CMPTAIL("¤à")==0) sprintf(&out[l-2],"¤ß");else
44 if( CMPTAIL("¤ë")==0) sprintf(&out[l-2],"¤ê");else
45
46   sprintf(&out[l],"¤½¤·¤Æ");}
47
48 /* ²¥¤ë,½³¤ë> ²¥¤Ã¤Æ½³¤ë */
49 void jverb2( const char *in , char *out){
50 int l=strlen(in);
51 strcpy(out,in);
52
53 if( CMPTAIL("¤¹¤ë")==0) sprintf(&out[l-4],"¤·¤Æ");else
54 if( CMPTAIL("¤¤¤ë")==0) sprintf(&out[l-4],"¤¤¤Æ");else
55
56 if( CMPTAIL("¤¨¤ë")==0) sprintf(&out[l-4],"¤¨¤Æ");else
57 if( CMPTAIL("¤±¤ë")==0) sprintf(&out[l-4],"¤±¤Æ");else
58 if( CMPTAIL("¤²¤ë")==0) sprintf(&out[l-4],"¤²¤Æ");else
59 if( CMPTAIL("¤»¤ë")==0) sprintf(&out[l-4],"¤»¤Æ");else
60 if( CMPTAIL("¤¼¤ë")==0) sprintf(&out[l-4],"¤¼¤Æ");else
61 if( CMPTAIL("¤Æ¤ë")==0) sprintf(&out[l-4],"¤Æ¤Ã¤Æ");else
62 if( CMPTAIL("¤Ç¤ë")==0) sprintf(&out[l-4],"¤Ç¤Æ");else
63 if( CMPTAIL("¤Í¤ë")==0) sprintf(&out[l-4],"¤Í¤Æ");else
64 if( CMPTAIL("¤Ø¤ë")==0) sprintf(&out[l-4],"¤Ø¤Æ");else
65 if( CMPTAIL("¤Ù¤ë")==0) sprintf(&out[l-4],"¤Ù¤Æ");else
66 if( CMPTAIL("¤á¤ë")==0) sprintf(&out[l-4],"¤á¤Æ");else
67 if( CMPTAIL("¤ì¤ë")==0) sprintf(&out[l-4],"¤ì¤Æ");else
68
69 if( CMPTAIL("¤¦")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
70 if( CMPTAIL("¤¯")==0) sprintf(&out[l-2],"¤¤¤Æ");else
71 if( CMPTAIL("¤°")==0) sprintf(&out[l-2],"¤¤¤Ç");else
72 if( CMPTAIL("¤¹")==0) sprintf(&out[l-2],"¤·¤Æ");else
73 if( CMPTAIL("¤º")==0) sprintf(&out[l-2],"¤¸¤Æ");else
74 if( CMPTAIL("¤Ä")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
75 if( CMPTAIL("¤Å")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
76 if( CMPTAIL("¤Ì")==0) sprintf(&out[l-2],"¤Í¤Æ");else
77 if( CMPTAIL("¤Õ")==0) sprintf(&out[l-2],"¤Ø¤Æ");else
78 if( CMPTAIL("¤Ö")==0) sprintf(&out[l-2],"¤ó¤Ç");else
79 if( CMPTAIL("¤à")==0) sprintf(&out[l-2],"¤ó¤Ç");else
80 if( CMPTAIL("¤ë")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
81   sprintf(&out[l],"¤³¤È¤Ë¤è¤ê");}
82
83 /* ²¥¤ë,½³¤ë > ²¥¤Ã¤¿¤ê½³¤Ã¤¿¤ê */
84 void jverb3( const char *in , char *out){
85 int l=strlen(in);
86 strcpy(out,in);
87
88 if( CMPTAIL("¤¹¤ë")==0) sprintf(&out[l-4],"¤·¤¿");else
89 if( CMPTAIL("¤¤¤ë")==0) sprintf(&out[l-4],"¤¤¤¿");else
90
91 if( CMPTAIL("¤¨¤ë")==0) sprintf(&out[l-4],"¤¨¤¿");else
92 if( CMPTAIL("¤±¤ë")==0) sprintf(&out[l-4],"¤±¤¿");else
93 if( CMPTAIL("¤²¤ë")==0) sprintf(&out[l-4],"¤²¤¿");else
94 if( CMPTAIL("¤»¤ë")==0) sprintf(&out[l-4],"¤»¤¿");else
95 if( CMPTAIL("¤¼¤ë")==0) sprintf(&out[l-4],"¤¼¤¿");else
96 if( CMPTAIL("¤Æ¤ë")==0) sprintf(&out[l-4],"¤Æ¤Ã¤¿");else
97 if( CMPTAIL("¤Ç¤ë")==0) sprintf(&out[l-4],"¤Ç¤¿");else
98 if( CMPTAIL("¤Í¤ë")==0) sprintf(&out[l-4],"¤Í¤¿");else
99 if( CMPTAIL("¤Ø¤ë")==0) sprintf(&out[l-4],"¤Ø¤¿");else
100 if( CMPTAIL("¤Ù¤ë")==0) sprintf(&out[l-4],"¤Ù¤¿");else
101 if( CMPTAIL("¤á¤ë")==0) sprintf(&out[l-4],"¤á¤¿");else
102 if( CMPTAIL("¤ì¤ë")==0) sprintf(&out[l-4],"¤ì¤¿");else
103
104 if( CMPTAIL("¤¦")==0) sprintf(&out[l-2],"¤Ã¤¿");else
105 if( CMPTAIL("¤¯")==0) sprintf(&out[l-2],"¤¤¤¿");else
106 if( CMPTAIL("¤°")==0) sprintf(&out[l-2],"¤¤¤À");else
107 if( CMPTAIL("¤¹")==0) sprintf(&out[l-2],"¤·¤¿");else
108 if( CMPTAIL("¤º")==0) sprintf(&out[l-2],"¤¸¤¿");else
109 if( CMPTAIL("¤Ä")==0) sprintf(&out[l-2],"¤Ã¤¿");else
110 if( CMPTAIL("¤Å")==0) sprintf(&out[l-2],"¤Ã¤¿");else
111 if( CMPTAIL("¤Ì")==0) sprintf(&out[l-2],"¤Í¤¿");else
112 if( CMPTAIL("¤Õ")==0) sprintf(&out[l-2],"¤Ø¤¿");else
113 if( CMPTAIL("¤Ö")==0) sprintf(&out[l-2],"¤ó¤À");else
114 if( CMPTAIL("¤à")==0) sprintf(&out[l-2],"¤ó¤À");else
115 if( CMPTAIL("¤ë")==0) sprintf(&out[l-2],"¤Ã¤¿");else
116   sprintf(&out[l],"¤³¤È¤ä");}
117
118
119 void jverb( const char *in , char *out , int flag){
120   switch (flag){
121   case JVERB_AND:jverb1(in , out);break;
122   case JVERB_TO :jverb2(in , out);break;
123   case JVERB_OR :jverb3(in , out);break;
124   }
125 }
126
127 char* strstr_j(const char* s, const char* t)
128 {
129         int i, l1, l2;
130
131         l1 = strlen(s);
132         l2 = strlen(t);
133         if (l1 >= l2) {
134                 for(i = 0; i <= l1 - l2; i++) {
135                         if(!strncmp(s + i, t, l2))
136                                 return (char *)s + i;
137                         if (iskanji(*(s + i)))
138                                 i++;
139                 }
140         }
141         return NULL;
142 }
143
144
145 /*
146  * Convert SJIS string to EUC string
147  */
148 void sjis2euc(char *str)
149 {
150         int i;
151         unsigned char c1, c2;
152         unsigned char *tmp;
153
154         int len = strlen(str);
155
156         C_MAKE(tmp, len+1, byte);
157
158         for (i = 0; i < len; i++)
159         {
160                 c1 = str[i];
161                 if (c1 & 0x80)
162                 {
163                         i++;
164                         c2 = str[i];
165                         if (c2 >= 0x9f)
166                         {
167                                 c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe0 : 0x60);
168                                 c2 += 2;
169                         }
170                         else
171                         {
172                                 c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe1 : 0x61);
173                                 c2 += 0x60 + (c2 < 0x7f);
174                         }
175                         tmp[i - 1] = c1;
176                         tmp[i] = c2;
177                 }
178                 else
179                         tmp[i] = c1;
180         }
181         tmp[len] = 0;
182         strcpy(str, (char *)tmp);
183
184         C_KILL(tmp, len+1, byte);
185 }  
186
187
188 /*
189  * Convert EUC string to SJIS string
190  */
191 void euc2sjis(char *str)
192 {
193         int i;
194         unsigned char c1, c2;
195         unsigned char *tmp;
196         
197         int len = strlen(str);
198
199         C_MAKE(tmp, len+1, byte);
200
201         for (i = 0; i < len; i++)
202         {
203                 c1 = str[i];
204                 if (c1 & 0x80)
205                 {
206                         i++;
207                         c2 = str[i];
208                         if (c1 % 2)
209                         {
210                                 c1 = (c1 >> 1) + (c1 < 0xdf ? 0x31 : 0x71);
211                                 c2 -= 0x60 + (c2 < 0xe0);
212                         }
213                         else
214                         {
215                                 c1 = (c1 >> 1) + (c1 < 0xdf ? 0x30 : 0x70);
216                                 c2 -= 2;
217                         }
218
219                         tmp[i - 1] = c1;
220                         tmp[i] = c2;
221                 }
222                 else
223                         tmp[i] = c1;
224         }
225         tmp[len] = 0;
226         strcpy(str, (char *)tmp);
227
228         C_KILL(tmp, len+1, byte);
229 }  
230
231
232 /*
233  * str¤ò´Ä¶­¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤·¡¢ÊÑ´¹Á°¤Îʸ»ú¥³¡¼¥É¤òÊÖ¤¹¡£
234  * str¤ÎŤµ¤ËÀ©¸Â¤Ï¤Ê¤¤¡£
235  *
236  * 0: Unknown
237  * 1: ASCII (Never known to be ASCII in this function.)
238  * 2: EUC
239  * 3: SJIS
240  */
241 byte codeconv(char *str)
242 {
243         byte code = 0;
244         int i;
245
246         for (i = 0; str[i]; i++)
247         {
248                 unsigned char c1;
249                 unsigned char c2;
250
251                 /* First byte */
252                 c1 = str[i];
253
254                 /* ASCII? */
255                 if (!(c1 & 0x80)) continue;
256
257                 /* Second byte */
258                 i++;
259                 c2 = str[i];
260
261                 if (((0xa1 <= c1 && c1 <= 0xdf) || (0xfd <= c1 && c1 <= 0xfe)) &&
262                     (0xa1 <= c2 && c2 <= 0xfe))
263                 {
264                         /* Only EUC is allowed */
265                         if (!code)
266                         {
267                                 /* EUC */
268                                 code = 2;
269                         }
270
271                         /* Broken string? */
272                         else if (code != 2)
273                         {
274                                 /* No conversion */
275                                 return 0;
276                         }
277                 }
278
279                 else if (((0x81 <= c1 && c1 <= 0x9f) &&
280                           ((0x40 <= c2 && c2 <= 0x7e) || (0x80 <= c2 && c2 <= 0xfc))) ||
281                          ((0xe0 <= c1 && c1 <= 0xfc) &&
282                           (0x40 <= c2 && c2 <= 0x7e)))
283                 {
284                         /* Only SJIS is allowed */
285                         if (!code)
286                         {
287                                 /* SJIS */
288                                 code = 3;
289                         }
290
291                         /* Broken string? */
292                         else if (code != 3)
293                         {
294                                 /* No conversion */
295                                 return 0;
296                         }
297                 }
298         }
299
300
301         switch (code)
302         {
303 #ifdef EUC
304         case 3:
305                 /* SJIS -> EUC */
306                 sjis2euc(str);
307                 break;
308 #endif
309
310 #ifdef SJIS
311         case 2:
312                 /* EUC -> SJIS */
313                 euc2sjis(str);
314
315                 break;
316 #endif
317         }
318
319         /* Return kanji code */
320         return code;
321 }
322
323 /* Ê¸»úÎós¤Îx¥Ð¥¤¥ÈÌܤ¬´Á»ú¤Î1¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */
324 bool iskanji2(cptr s, int x)
325 {
326         int i;
327
328         for (i = 0; i < x; i++)
329         {
330                 if (iskanji(s[i])) i++;
331         }
332         if ((x == i) && iskanji(s[x])) return TRUE;
333
334         return FALSE;
335 }
336
337 #endif /* JP */
338