OSDN Git Service

update year to 2020
[jnethack/source.git] / japanese / jconj.c
1 /* JNetHack Copyright */
2 /* (c) Issei Numata 1994-2000                                      */
3 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2020            */
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     {"\8bP\82­", J_KA, FIFTH, ION},
88     {"\8f\91\82­", J_KA, FIFTH, ION},
89     {"\82©\82¯\82é", J_KA, UPPER, NORMAL},
90     {"\82©\82Ô\82é", J_RA, FIFTH, HATSUON},
91     {"\8d\\82¦\82é", J_A, LOWER, NORMAL},
92     {"\8a\9a\82Ý\82Â\82­", J_KA, FIFTH, ION},
93     {"\8d\8f\82Þ", J_MA, FIFTH, SOKUON},
94     {"\92\85\82é", J_KA, UPPER, NORMAL},
95     {"\97\88\82é", J_KA, KAHEN, NORMAL}, 
96     {"\8dÓ\82­", J_KA, FIFTH, ION}, 
97     {"\89Á\82¦\82é", J_A, LOWER, NORMAL},
98     {"\82±\82·\82é", J_RA, FIFTH, HATSUON},
99     {"\82±\82Ü\82·", J_SA, FIFTH, NORMAL},
100     {"\8d\9e\82Þ", J_MA, FIFTH, SOKUON},
101     {"\8eE\82·", J_SA, FIFTH, NORMAL},
102     {"\89ó\82·", J_SA, FIFTH, NORMAL},
103 /* \82³ */
104     {"\95ù\82°\82é", J_KA, LOWER, NORMAL},
105     {"\8eK\82Ñ\82é", J_BA, UPPER, NORMAL},
106     {"\8e\80\82Ê", J_NA, FIFTH, SOKUON},
107     {"\8a\8a\82é", J_RA, FIFTH, HATSUON},
108     {"\82·\82é", J_SA, SAHEN, NORMAL}, 
109 /* \82½ */
110     {"\82½\82\82ë\82®", J_GA, FIFTH, ION},
111     {"\8fo\82·", J_SA, FIFTH, NORMAL},
112     {"\90H\82×\82é", J_HA, LOWER, NORMAL}, 
113     {"\8eg\82¤", J_WA, FIFTH, HATSUON},
114     {"\82Â\82¯\82é", J_KA, LOWER, NORMAL},
115     {"\82Â\82Ü\82¸\82­", J_KA, FIFTH, ION},
116     {"\8fo\82é", J_NA, LOWER, NORMAL},
117     {"\89ð\82­", J_KA, FIFTH, ION},
118     {"\97n\82¯\82é", J_KA, LOWER, NORMAL},
119     {"\82Æ\82Î\82·", J_SA, FIFTH, NORMAL},
120     {"\94ò\82Ô", J_BA, FIFTH, SOKUON},
121     {"\8eæ\82é", J_RA, FIFTH, HATSUON},
122 /* \82È */
123     {"\93\8a\82°\82é", J_GA, LOWER, NORMAL},
124     {"\96¼\82Ã\82¯\82é", J_KA, LOWER, NORMAL},
125     {"\88¬\82é", J_RA, FIFTH, HATSUON},
126     {"\92E\82®", J_GA, FIFTH, ION},
127     {"\94G\82ç\82·", J_SA, FIFTH, NORMAL},
128     {"\93h\82é", J_RA, FIFTH, HATSUON},
129     {"\88ù\82Þ", J_MA, FIFTH, SOKUON},
130 /* \82Í */
131     {"\82Í\82¢\82¸\82é", J_RA, FIFTH, HATSUON},
132     {"\97\9a\82­", J_KA, FIFTH, ION},
133     {"\82Í\82³\82Þ", J_MA, FIFTH, SOKUON},
134     {"\82Í\82¸\82·", J_SA, FIFTH, NORMAL},
135     {"\8aO\82·", J_SA, FIFTH, NORMAL},
136     {"\82Í\82ß\82é", J_MA, UPPER, NORMAL},
137     {"\8cõ\82é", J_RA, FIFTH, HATSUON},
138     {"\90Z\82·", J_SA, FIFTH, NORMAL},
139     {"\82Ð\82Á\82©\82¯\82é", J_KA, LOWER, NORMAL},
140     {"\8fE\82¤", J_WA, FIFTH, HATSUON},
141     {"\93¥\82Þ", J_MA, FIFTH, SOKUON},
142     {"\90U\82è\82©\82´\82·", J_SA, FIFTH, NORMAL},
143     {"\90k\82¦\82é", J_A, LOWER, NORMAL},
144     {"\8c@\82é", J_RA, FIFTH, HATSUON},
145 /* \82Ü */
146     {"\8aª\82­", J_KA, FIFTH, ION},
147     {"\82Ü\82½\82½\82­", J_KA, FIFTH, ION},
148     {"\8eç\82é", J_RA, FIFTH, HATSUON},
149     {"\89ñ\82·", J_SA, FIFTH, NORMAL},
150     {"\90g\82É\82Â\82¯\82é", J_KA, LOWER, NORMAL},
151     {"\8e\9d\82Â", J_TA, FIFTH, HATSUON},
152 /* \82â */
153     {"\8fÄ\82­", J_KA, FIFTH, ION},
154     {"\8cÄ\82Ô", J_BA, FIFTH, SOKUON},
155     {"\93Ç\82Þ", J_MA, FIFTH, SOKUON},
156     {"\82æ\82ë\82ß\82­", J_KA, FIFTH, ION},
157 /* \82ç */
158 /* \82í */
159     {(void*)0, 0, 0, 0},
160 };
161
162 extern unsigned char *e2sj(unsigned char *s);
163 extern unsigned char *sj2e(unsigned char *s);
164
165 /*
166 **      conjection verb word
167 **
168 **      Example
169 **      arg1    arg2    result
170 **      \92E\82®    \82È\82¢    \92E\82ª\82È\82¢
171 **      \92E\82®    \82½      \92E\82¢\82¾
172 **
173 */
174 static char *
175 jconjsub( tab, jverb, sfx )
176      struct _jconj_tab *tab;
177      char *jverb;
178      char *sfx;
179 {
180     int len;
181     unsigned char *p;
182     static unsigned char tmp[1024];
183
184     len = strlen(jverb);
185     strcpy((char *)tmp, jverb );
186
187     if(!strncmp(sfx, "\82Æ", 2)){
188         strcat((char *)tmp, sfx);
189         return (char *)tmp;
190     }
191
192     switch( tab->katsuyo_type ){
193       case FIFTH:
194         p = tmp + (len - 2);
195         if(!strncmp(sfx, "\82È", 2)){
196             if(!IC){
197                 p[0] = 0xa4;
198                 p[1] = hira_tab[tab->column][1];
199             } else {
200               memcpy(p, e2sj(hira_tab[tab->column]), 2);
201             }
202
203             strcpy((char *)p + 2, sfx);
204             break;
205         }
206         else if(!strncmp(sfx, "\82½", 2) || !strncmp(sfx, "\82Ä", 2)){
207             switch( tab->onbin_type ){
208               case NORMAL:
209                 if(!IC){
210                     p[1] = hira_tab[tab->column + 1][1];
211                 } else {
212                     memcpy(p, e2sj(hira_tab[tab->column + 1]), 2);
213                 }
214                 break;
215               case SOKUON:
216                 if(!IC){
217                     p[1] = 0xf3;
218                 } else {
219                     memcpy(p, "\82ñ", 2);
220                 }
221                 break;
222               case HATSUON:
223                 if(!IC){
224                     p[1] = 0xc3;
225                 } else {
226                     memcpy(p, "\82Á", 2);
227                 }
228                 break;
229               case ION:
230                 if(!IC){
231                     p[1] = 0xa4;
232                 } else {
233                     memcpy(p, "\82¢", 2);
234                 }
235                 break;
236             }
237             strcpy((char *)p + 2, sfx);
238             if(tab->onbin_type == SOKUON ||
239                (tab->onbin_type == ION && tab->column >= J_GA)){
240                 if(!IC){
241                   ++p[3];
242                 } else {
243                   ++p[3];
244                 }
245 /*        memcpy(p+2, e2sj(sj2e(p+2)+1), 2);*//* sj2e() returns ptr to char* */
246             }
247             break;
248         }
249         else if(!strncmp(sfx, "\82Î", 2)){
250             if(!IC){
251                 p[1] = hira_tab[tab->column + 3][1];
252             } else {
253                 memcpy(p, e2sj(hira_tab[tab->column + 3]), 2);
254             }
255             strcpy((char *)p + 2, sfx);
256         }
257         else if(!strncmp(sfx, "\82ê", 2)){
258             if(!IC){
259                 p[1]=hira_tab[tab->column + 3][1];
260             } else {
261                 memcpy(p, e2sj(hira_tab[tab->column + 3]), 2);
262             }
263             strcpy((char *)p + 2, sfx + 2);
264         }
265         else if(!strncmp(sfx, "\82Ü", 2)) {
266             if(!IC){
267                 p[1] = hira_tab[tab->column + 1][1];
268             } else {
269                 memcpy(p, e2sj(hira_tab[tab->column + 1]), 2);
270             }
271             strcpy((char *)p + 2, sfx);
272             break;
273         }
274         else if(!strncmp(sfx, "\82æ", 2)) {
275             if(!IC){
276                 p[1] = hira_tab[tab->column + 4][1];
277             } else {
278                 memcpy(p, e2sj(hira_tab[tab->column + 4]), 2);
279             }
280             strcpy((char *)p + 2, sfx + 2);
281             break;
282         }
283         break;
284       case LOWER:
285       case UPPER:
286       case KAHEN:
287         p = tmp + (len - 2);
288         if(!strncmp(sfx, "\82Î", 2)){
289             strcpy((char *)p, "\82ê");
290             strcpy((char *)p + 2, sfx);
291         }
292         else if(!strncmp(sfx, "\82ê", 2) && tab->katsuyo_type == LOWER){
293             strcpy((char *)p, "\82ç");
294             strcpy((char *)p + 2, sfx);
295         }
296         else
297           strcpy((char *)p, sfx);
298         break;
299       case SAHEN:
300         p = tmp + (len - 4);
301         if(!strncmp(sfx, "\82È", 2) ||
302            !strncmp(sfx, "\82Ü", 2) ||
303            !strncmp(sfx, "\82½", 2) ||
304            !strncmp(sfx, "\82Ä", 2) ||
305            !strncmp(sfx, "\82æ", 2)){
306             strcpy((char *)p, "\82µ");
307             strcpy((char *)p + 2, sfx);
308         }
309         else if(!strncmp(sfx, "\82Î", 2) || !strncmp(sfx, "\82ê\82Î", 4)){
310             strcpy((char *)p, "\82·\82ê\82Î");
311         }
312         break;
313     }
314     return (char *)tmp;
315 }
316
317 /* \93®\8e\8c\82Ì\95Ï\89» */
318 const char *
319 jconj( jverb, sfx )
320      const char *jverb;
321      const char *sfx;
322 {
323     struct _jconj_tab *tab;
324     int len;
325
326     len = strlen(jverb);
327     for( tab = jconj_tab; tab->main != (void*)0; ++tab){
328         if(!strcmp(jverb, tab->main)){
329             return jconjsub(tab, jverb, sfx);
330         }
331     }
332
333     for( tab = jconj_tab; tab->main != (void*)0; ++tab){
334         if(len - strlen(tab->main) > 0 &&
335            !strcmp(jverb + (len - strlen(tab->main)), tab->main)){
336             return jconjsub(tab, jverb, sfx);
337         }
338     }
339
340 #ifdef JAPANESETEST
341     fprintf( stderr, "I don't know such word \"%s\"\n");
342 #endif
343     return jverb;
344 }
345
346 /* \89Â\94\ */
347 const char *
348 jcan(jverb)
349      const char *jverb;
350 {
351     const char *ret;
352     static char tmp[1024];
353
354     int len = strlen(jverb);
355     if(!strcmp(jverb + len - 4, "\82·\82é")){
356         strncpy(tmp, jverb, len - 4);
357         strcpy(tmp + len - 4, "\82Å\82«\82é");
358         return tmp;
359     } else {
360         ret = jconj(jverb, "\82ê\82é");
361         return ret;
362     }
363 }
364
365 /* \95s\89Â\94\ */
366 const char *
367 jcannot(jverb)
368      const char *jverb;
369 {
370     static char tmp[1024];
371
372     int len = strlen(jverb);
373     if(!strcmp(jverb + len - 4, "\82·\82é")){
374         strncpy(tmp, jverb, len-4);
375         strcpy(tmp +len-4, "\82Å\82«\82È\82¢");
376         return tmp;
377     } else {
378         return jconj(jverb, "\82ê\82È\82¢");
379     }
380 }
381
382 /* \89ß\8b\8e */
383 const char *
384 jpast(jverb)
385      const char *jverb;
386 {
387     return jconj(jverb, "\82½");
388 }
389
390 /* \8ch\91Ì */
391 const char *
392 jpolite(jverb)
393      const char *jverb;
394 {
395     return jconj(jverb, "\82Ü\82·");
396 }
397
398
399 /*
400 **      conjection of adjective word
401 **
402 **      Example:
403 **
404 **      \8c`\97e\8e\8c\93I\97p\96@       \95\9b\8e\8c\93I\97p\96@
405 **
406 **      \90Ô\82¢            -> \90Ô\82­         (\8c`\97e\8e\8c)
407 **      ãY\97í\82È          -> ãY\97í\82É       (\8c`\97e\93®\8e\8c)
408 **      ãY\97í\82¾          -> ãY\97í\82É       (\8c`\97e\93®\8e\8c)
409 */
410 const char *
411 jconj_adj( jadj )
412      const char *jadj;
413 {
414     int len;
415     static unsigned char tmp[1024];
416
417     strcpy((char *)tmp, jadj);
418     len = strlen((char *)tmp);
419
420     if(!strcmp((char *)tmp + len - 2, "\82¢")){
421         strcpy((char *)tmp + len - 2, "\82­");
422     } else if(!strcmp((char *)tmp + len - 2, "\82¾") ||
423               !strcmp((char *)tmp + len - 2, "\82È") ||
424               !strcmp((char *)tmp + len - 2, "\82Ì")){
425         strcpy((char *)tmp + len - 2, "\82É");
426     }
427
428     return (char *)tmp;
429 }
430
431
432 #ifdef JAPANESETEST
433 unsigned char
434 *e2sj(unsigned char *s)
435 {
436     return *s;
437 }
438
439 unsigned char
440 *sj2e(unsigned char *s)
441 {
442     return *s;
443 }
444
445 void
446 main()
447 {
448     struct _jconj_tab *tab;
449
450     for(tab = jconj_tab; tab->main != (void*)0; ++tab){
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 \82½   %s\n", tab->main, jconj(tab->main, "\82½"));
454         printf("%-10s \82ê\82Π%s\n", tab->main, jconj(tab->main, "\82ê\82Î"));
455         printf("%-10s \82Æ\82« %s\n", tab->main, jconj(tab->main, "\82Æ\82«"));
456         printf("%-10s \82æ\82¤ %s\n", tab->main, jconj(tab->main, "\82æ\82¤"));
457         printf("%-10s %s\n", tab->main, jcan(tab->main));
458         printf("%-10s %s\n", tab->main, jcannot(tab->main));
459     }
460     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82È\82¢"));
461     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82Ü\82·"));
462     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82½"));
463     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82ê\82Î"));
464     printf("%s\n", jconj("\93O\96é\82Ånethack\82Ì\96|\96ó\82ð\82·\82é", "\82Æ\82«"));
465 }
466 #endif