OSDN Git Service

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