OSDN Git Service

update year to 2019
[jnethack/source.git] / japanese / jconj.c
1 /* JNetHack Copyright */
2 /* (c) Issei Numata 1994-2000                                      */
3 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019            */
4 /* JNetHack may be freely redistributed.  See license for details. */
5
6 #include <stdio.h>
7 #include <ctype.h>
8 #include <string.h>
9 #include "hack.h"
10
11 #define EUC     0
12 #define SJIS    1
13 #define JIS     2
14
15 /* internal kcode */
16 /* IC=0 EUC */
17 /* IC=1 SJIS */
18 #define IC ((unsigned char)("\8a¿"[0])==0x8a)
19
20 #define J_A     0
21 #define J_KA    (1*5)
22 #define J_SA    (2*5)
23 #define J_TA    (3*5)
24 #define J_NA    (4*5)
25 #define J_HA    (5*5)
26 #define J_MA    (6*5)
27 #define J_YA    (7*5)
28 #define J_RA    (8*5)
29 #define J_WA    (9*5)
30
31 #define J_GA    (10*5)
32 #define J_ZA    (11*5)
33 #define J_DA    (12*5)
34 #define J_BA    (13*5)
35 #define J_PA    (14*5)
36
37 static unsigned char hira_tab[][2]={
38     {0xa4, 0xa2}, {0xa4, 0xa4}, {0xa4, 0xa6}, {0xa4, 0xa8}, {0xa4, 0xaa}, 
39     {0xa4, 0xab}, {0xa4, 0xad}, {0xa4, 0xaf}, {0xa4, 0xb1}, {0xa4, 0xb3}, 
40     {0xa4, 0xb5}, {0xa4, 0xb7}, {0xa4, 0xb9}, {0xa4, 0xbb}, {0xa4, 0xbd}, 
41     {0xa4, 0xbf}, {0xa4, 0xc1}, {0xa4, 0xc4}, {0xa4, 0xc6}, {0xa4, 0xc8}, 
42     {0xa4, 0xca}, {0xa4, 0xcb}, {0xa4, 0xcc}, {0xa4, 0xcd}, {0xa4, 0xce}, 
43     {0xa4, 0xcf}, {0xa4, 0xd2}, {0xa4, 0xd5}, {0xa4, 0xd8}, {0xa4, 0xdb}, 
44     {0xa4, 0xde}, {0xa4, 0xdf}, {0xa4, 0xe0}, {0xa4, 0xe1}, {0xa4, 0xe2}, 
45     {0xa4, 0xe4}, {0xa4, 0xa4}, {0xa4, 0xe6}, {0xa4, 0xa8}, {0xa4, 0xe8}, 
46     {0xa4, 0xe9}, {0xa4, 0xea}, {0xa4, 0xeb}, {0xa4, 0xec}, {0xa4, 0xed}, 
47     {0xa4, 0xef}, {0xa4, 0xa4}, {0xa4, 0xa6}, {0xa4, 0xa8}, {0xa4, 0xaa}, 
48     {0xa4, 0xac}, {0xa4, 0xae}, {0xa4, 0xb0}, {0xa4, 0xb2}, {0xa4, 0xb4}, 
49     {0xa4, 0xb6}, {0xa4, 0xb8}, {0xa4, 0xba}, {0xa4, 0xbc}, {0xa4, 0xbe}, 
50     {0xa4, 0xc0}, {0xa4, 0xc2}, {0xa4, 0xc5}, {0xa4, 0xc7}, {0xa4, 0xc9}, 
51     {0xa4, 0xd0}, {0xa4, 0xd3}, {0xa4, 0xd6}, {0xa4, 0xd9}, {0xa4, 0xdc}, 
52     {0xa4, 0xd1}, {0xa4, 0xd4}, {0xa4, 0xd7}, {0xa4, 0xda}, {0xa4, 0xdd},
53 };
54
55 #define FIFTH   0 /* \8cÜ\92i */
56 #define UPPER   1 /* \8fã\88ê\92i */
57 #define LOWER   2 /* \89º\88ê\92i */
58 #define SAHEN   3 /* \83T\95Ï */
59 #define KAHEN   4 /* \83J\95Ï */
60
61 #define NORMAL  0 /* \82 \82¯\82é\81¨\81`\82½ */
62 #define SOKUON  1 /* \8d\8f\82Þ\81¨\81`\82ñ\82¾ */
63 #define HATSUON 2 /* \91Å\82Â\81¨\81`\82Á\82½ */
64 #define ION     3 /* \95\82\82­\81¨\81`\82¢\82½ */
65
66 struct _jconj_tab {
67     const char *main;
68     int column;
69 /* 0: fifth conj. 1:upper conj. 2:lower conj. 3:SAHEN 4:KAHEN */
70     int katsuyo_type;
71 /* 0: normal 1: sokuon 2: hatson 3: ion */
72     int onbin_type;
73 } jconj_tab[] = {
74 /* \82  */
75     {"\82 \82¯\82é", J_KA, LOWER, NORMAL},
76     {"\8aJ\82¯\82é", J_KA, LOWER, NORMAL},
77     {"\82¢\82ê\82é", J_RA, LOWER, NORMAL},
78     {"\93ü\82ê\82é", J_RA, LOWER, NORMAL},
79     {"\95\82\82­", J_KA, FIFTH, ION},
80     {"\91Å\82Â", J_TA, FIFTH, HATSUON},
81     {"\92u\82­", J_KA, FIFTH, ION},
82     {"\94[\82ß\82é", J_MA, LOWER, NORMAL},
83     {"\97\8e\82¿\82é", J_TA, UPPER, NORMAL},
84     {"\97\8e\82·", J_SA, FIFTH, NORMAL},
85     {"\82¨\82Ì\82Ì\82­", J_KA, FIFTH, ION},
86 /* \82© */
87     {"\8f\91\82­", J_KA, FIFTH, ION},
88     {"\82©\82¯\82é", J_KA, UPPER, NORMAL},
89     {"\82©\82Ô\82é", J_RA, FIFTH, HATSUON},
90     {"\8d\\82¦\82é", J_A, LOWER, NORMAL},
91     {"\8a\9a\82Ý\82Â\82­", J_KA, FIFTH, ION},
92     {"\8d\8f\82Þ", J_MA, FIFTH, SOKUON},
93     {"\92\85\82é", J_KA, UPPER, NORMAL},
94     {"\97\88\82é", J_KA, KAHEN, NORMAL}, 
95     {"\8dÓ\82­", J_KA, FIFTH, ION}, 
96     {"\89Á\82¦\82é", J_A, LOWER, NORMAL},
97     {"\82±\82·\82é", J_RA, FIFTH, HATSUON},
98     {"\82±\82Ü\82·", J_SA, FIFTH, NORMAL},
99     {"\8d\9e\82Þ", J_MA, FIFTH, SOKUON},
100     {"\8eE\82·", J_SA, FIFTH, NORMAL},
101     {"\89ó\82·", J_SA, FIFTH, NORMAL},
102 /* \82³ */
103     {"\95ù\82°\82é", J_KA, LOWER, NORMAL},
104     {"\8eK\82Ñ\82é", J_BA, UPPER, NORMAL},
105     {"\8e\80\82Ê", J_NA, FIFTH, SOKUON},
106     {"\8a\8a\82é", J_RA, FIFTH, HATSUON},
107     {"\82·\82é", J_SA, SAHEN, NORMAL}, 
108 /* \82½ */
109     {"\82½\82\82ë\82®", J_GA, FIFTH, ION},
110     {"\8fo\82·", J_SA, FIFTH, NORMAL},
111     {"\90H\82×\82é", J_HA, LOWER, NORMAL}, 
112     {"\8eg\82¤", J_WA, FIFTH, HATSUON},
113     {"\82Â\82¯\82é", J_KA, LOWER, NORMAL},
114     {"\82Â\82Ü\82¸\82­", J_KA, FIFTH, ION},
115     {"\8fo\82é", J_NA, LOWER, NORMAL},
116     {"\89ð\82­", J_KA, FIFTH, ION},
117     {"\97n\82¯\82é", J_KA, LOWER, NORMAL},
118     {"\82Æ\82Î\82·", J_SA, FIFTH, NORMAL},
119     {"\94ò\82Ô", J_BA, FIFTH, SOKUON},
120     {"\8eæ\82é", J_RA, FIFTH, HATSUON},
121 /* \82È */
122     {"\93\8a\82°\82é", J_GA, LOWER, NORMAL},
123     {"\96¼\82Ã\82¯\82é", J_KA, LOWER, NORMAL},
124     {"\88¬\82é", J_RA, FIFTH, HATSUON},
125     {"\92E\82®", J_GA, FIFTH, ION},
126     {"\94G\82ç\82·", J_SA, FIFTH, NORMAL},
127     {"\93h\82é", J_RA, FIFTH, HATSUON},
128     {"\88ù\82Þ", J_MA, FIFTH, SOKUON},
129 /* \82Í */
130     {"\82Í\82¢\82¸\82é", J_RA, FIFTH, HATSUON},
131     {"\97\9a\82­", J_KA, FIFTH, ION},
132     {"\82Í\82³\82Þ", J_MA, FIFTH, SOKUON},
133     {"\82Í\82¸\82·", J_SA, FIFTH, NORMAL},
134     {"\8aO\82·", J_SA, FIFTH, NORMAL},
135     {"\82Í\82ß\82é", J_MA, UPPER, NORMAL},
136     {"\90Z\82·", J_SA, FIFTH, NORMAL},
137     {"\82Ð\82Á\82©\82¯\82é", J_KA, LOWER, NORMAL},
138     {"\8fE\82¤", J_WA, FIFTH, HATSUON},
139     {"\93¥\82Þ", J_MA, FIFTH, SOKUON},
140     {"\90U\82è\82©\82´\82·", J_SA, FIFTH, NORMAL},
141     {"\8c@\82é", J_RA, FIFTH, HATSUON},
142 /* \82Ü */
143     {"\8aª\82­", J_KA, FIFTH, ION},
144     {"\8eç\82é", J_RA, FIFTH, HATSUON},
145     {"\89ñ\82·", J_SA, FIFTH, NORMAL},
146     {"\90g\82É\82Â\82¯\82é", J_KA, LOWER, NORMAL},
147     {"\8e\9d\82Â", J_TA, FIFTH, HATSUON},
148 /* \82â */
149     {"\8fÄ\82­", J_KA, FIFTH, ION},
150     {"\8cÄ\82Ô", J_BA, FIFTH, SOKUON},
151     {"\93Ç\82Þ", J_MA, FIFTH, SOKUON},
152     {"\82æ\82ë\82ß\82­", J_KA, FIFTH, ION},
153 /* \82ç */
154 /* \82í */
155     {(void*)0, 0, 0, 0},
156 };
157
158 extern unsigned char *e2sj(unsigned char *s);
159 extern unsigned char *sj2e(unsigned char *s);
160
161 /*
162 **      conjection verb word
163 **
164 **      Example
165 **      arg1    arg2    result
166 **      \92E\82®    \82È\82¢    \92E\82ª\82È\82¢
167 **      \92E\82®    \82½      \92E\82¢\82¾
168 **
169 */
170 static char *
171 jconjsub( tab, jverb, sfx )
172      struct _jconj_tab *tab;
173      char *jverb;
174      char *sfx;
175 {
176     int len;
177     unsigned char *p;
178     static unsigned char tmp[1024];
179
180     len = strlen(jverb);
181     strcpy((char *)tmp, jverb );
182
183     if(!strncmp(sfx, "\82Æ", 2)){
184         strcat((char *)tmp, sfx);
185         return (char *)tmp;
186     }
187
188     switch( tab->katsuyo_type ){
189       case FIFTH:
190         p = tmp + (len - 2);
191         if(!strncmp(sfx, "\82È", 2)){
192             if(!IC){
193                 p[0] = 0xa4;
194                 p[1] = hira_tab[tab->column][1];
195             } else {
196               memcpy(p, e2sj(hira_tab[tab->column]), 2);
197             }
198
199             strcpy((char *)p + 2, sfx);
200             break;
201         }
202         else if(!strncmp(sfx, "\82½", 2) || !strncmp(sfx, "\82Ä", 2)){
203             switch( tab->onbin_type ){
204               case NORMAL:
205                 if(!IC){
206                     p[1] = hira_tab[tab->column + 1][1];
207                 } else {
208                     memcpy(p, e2sj(hira_tab[tab->column + 1]), 2);
209                 }
210                 break;
211               case SOKUON:
212                 if(!IC){
213                     p[1] = 0xf3;
214                 } else {
215                     memcpy(p, "\82ñ", 2);
216                 }
217                 break;
218               case HATSUON:
219                 if(!IC){
220                     p[1] = 0xc3;
221                 } else {
222                     memcpy(p, "\82Á", 2);
223                 }
224                 break;
225               case ION:
226                 if(!IC){
227                     p[1] = 0xa4;
228                 } else {
229                     memcpy(p, "\82¢", 2);
230                 }
231                 break;
232             }
233             strcpy((char *)p + 2, sfx);
234             if(tab->onbin_type == SOKUON ||
235                (tab->onbin_type == ION && tab->column >= J_GA)){
236                 if(!IC){
237                   ++p[3];
238                 } else {
239                   ++p[3];
240                 }
241 /*        memcpy(p+2, e2sj(sj2e(p+2)+1), 2);*//* sj2e() returns ptr to char* */
242             }
243             break;
244         }
245         else if(!strncmp(sfx, "\82Î", 2)){
246             if(!IC){
247                 p[1] = hira_tab[tab->column + 3][1];
248             } else {
249                 memcpy(p, e2sj(hira_tab[tab->column + 3]), 2);
250             }
251             strcpy((char *)p + 2, sfx);
252         }
253         else if(!strncmp(sfx, "\82ê", 2)){
254             if(!IC){
255                 p[1]=hira_tab[tab->column + 3][1];
256             } else {
257                 memcpy(p, e2sj(hira_tab[tab->column + 3]), 2);
258             }
259             strcpy((char *)p + 2, sfx + 2);
260         }
261         else if(!strncmp(sfx, "\82Ü", 2)) {
262             if(!IC){
263                 p[1] = hira_tab[tab->column + 1][1];
264             } else {
265                 memcpy(p, e2sj(hira_tab[tab->column + 1]), 2);
266             }
267             strcpy((char *)p + 2, sfx);
268             break;
269         }
270         else if(!strncmp(sfx, "\82æ", 2)) {
271             if(!IC){
272                 p[1] = hira_tab[tab->column + 4][1];
273             } else {
274                 memcpy(p, e2sj(hira_tab[tab->column + 4]), 2);
275             }
276             strcpy((char *)p + 2, sfx + 2);
277             break;
278         }
279         break;
280       case LOWER:
281       case UPPER:
282       case KAHEN:
283         p = tmp + (len - 2);
284         if(!strncmp(sfx, "\82Î", 2)){
285             strcpy((char *)p, "\82ê");
286             strcpy((char *)p + 2, sfx);
287         }
288         else if(!strncmp(sfx, "\82ê", 2) && tab->katsuyo_type == LOWER){
289             strcpy((char *)p, "\82ç");
290             strcpy((char *)p + 2, sfx);
291         }
292         else
293           strcpy((char *)p, sfx);
294         break;
295       case SAHEN:
296         p = tmp + (len - 4);
297         if(!strncmp(sfx, "\82È", 2) ||
298            !strncmp(sfx, "\82Ü", 2) ||
299            !strncmp(sfx, "\82½", 2) ||
300            !strncmp(sfx, "\82Ä", 2) ||
301            !strncmp(sfx, "\82æ", 2)){
302             strcpy((char *)p, "\82µ");
303             strcpy((char *)p + 2, sfx);
304         }
305         else if(!strncmp(sfx, "\82Î", 2) || !strncmp(sfx, "\82ê\82Î", 4)){
306             strcpy((char *)p, "\82·\82ê\82Î");
307         }
308         break;
309     }
310     return (char *)tmp;
311 }
312
313 /* \93®\8e\8c\82Ì\95Ï\89» */
314 const char *
315 jconj( jverb, sfx )
316      const char *jverb;
317      const char *sfx;
318 {
319     struct _jconj_tab *tab;
320     int len;
321
322     len = strlen(jverb);
323     for( tab = jconj_tab; tab->main != (void*)0; ++tab){
324         if(!strcmp(jverb, tab->main)){
325             return jconjsub(tab, jverb, sfx);
326         }
327     }
328
329     for( tab = jconj_tab; tab->main != (void*)0; ++tab){
330         if(len - strlen(tab->main) > 0 &&
331            !strcmp(jverb + (len - strlen(tab->main)), tab->main)){
332             return jconjsub(tab, jverb, sfx);
333         }
334     }
335
336 #ifdef JAPANESETEST
337     fprintf( stderr, "I don't know such word \"%s\"\n");
338 #endif
339     return jverb;
340 }
341
342 /* \89Â\94\ */
343 const char *
344 jcan(jverb)
345      const char *jverb;
346 {
347     const char *ret;
348     static char tmp[1024];
349
350     int len = strlen(jverb);
351     if(!strcmp(jverb + len - 4, "\82·\82é")){
352         strncpy(tmp, jverb, len - 4);
353         strcpy(tmp + len - 4, "\82Å\82«\82é");
354         return tmp;
355     } else {
356         ret = jconj(jverb, "\82ê\82é");
357         return ret;
358     }
359 }
360
361 /* \95s\89Â\94\ */
362 const char *
363 jcannot(jverb)
364      const char *jverb;
365 {
366     static char tmp[1024];
367
368     int len = strlen(jverb);
369     if(!strcmp(jverb + len - 4, "\82·\82é")){
370         strncpy(tmp, jverb, len-4);
371         strcpy(tmp +len-4, "\82Å\82«\82È\82¢");
372         return tmp;
373     } else {
374         return jconj(jverb, "\82ê\82È\82¢");
375     }
376 }
377
378 /* \89ß\8b\8e */
379 const char *
380 jpast(jverb)
381      const char *jverb;
382 {
383     return jconj(jverb, "\82½");
384 }
385
386 /* \8ch\91Ì */
387 const char *
388 jpolite(jverb)
389      const char *jverb;
390 {
391     return jconj(jverb, "\82Ü\82·");
392 }
393
394
395 /*
396 **      conjection of adjective word
397 **
398 **      Example:
399 **
400 **      \8c`\97e\8e\8c\93I\97p\96@       \95\9b\8e\8c\93I\97p\96@
401 **
402 **      \90Ô\82¢            -> \90Ô\82­         (\8c`\97e\8e\8c)
403 **      ãY\97í\82È          -> ãY\97í\82É       (\8c`\97e\93®\8e\8c)
404 **      ãY\97í\82¾          -> ãY\97í\82É       (\8c`\97e\93®\8e\8c)
405 */
406 const char *
407 jconj_adj( jadj )
408      const char *jadj;
409 {
410     int len;
411     static unsigned char tmp[1024];
412
413     strcpy((char *)tmp, jadj);
414     len = strlen((char *)tmp);
415
416     if(!strcmp((char *)tmp + len - 2, "\82¢")){
417         strcpy((char *)tmp + len - 2, "\82­");
418     } else if(!strcmp((char *)tmp + len - 2, "\82¾") ||
419               !strcmp((char *)tmp + len - 2, "\82È") ||
420               !strcmp((char *)tmp + len - 2, "\82Ì")){
421         strcpy((char *)tmp + len - 2, "\82É");
422     }
423
424     return (char *)tmp;
425 }
426
427
428 #ifdef JAPANESETEST
429 unsigned char
430 *e2sj(unsigned char *s)
431 {
432     return *s;
433 }
434
435 unsigned char
436 *sj2e(unsigned char *s)
437 {
438     return *s;
439 }
440
441 void
442 main()
443 {
444     struct _jconj_tab *tab;
445
446     for(tab = jconj_tab; tab->main != (void*)0; ++tab){
447         printf("%-10s \82È\82¢ %s\n", tab->main, jconj(tab->main, "\82È\82¢"));
448         printf("%-10s \82Ü\82· %s\n", tab->main, jconj(tab->main, "\82Ü\82·"));
449         printf("%-10s \82½   %s\n", tab->main, jconj(tab->main, "\82½"));
450         printf("%-10s \82ê\82Π%s\n", tab->main, jconj(tab->main, "\82ê\82Î"));
451         printf("%-10s \82Æ\82« %s\n", tab->main, jconj(tab->main, "\82Æ\82«"));
452         printf("%-10s \82æ\82¤ %s\n", tab->main, jconj(tab->main, "\82æ\82¤"));
453         printf("%-10s %s\n", tab->main, jcan(tab->main));
454         printf("%-10s %s\n", tab->main, jcannot(tab->main));
455     }
456     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82È\82¢"));
457     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82Ü\82·"));
458     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82½"));
459     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82ê\82Î"));
460     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82Æ\82«"));
461 }
462 #endif