1 /* Copyright 1992 NEC Corporation, Tokyo, Japan.
2  *
3  * Permission to use, copy, modify, distribute and sell this software
4  * and its documentation for any purpose is hereby granted without
5  * fee, provided that the above copyright notice appear in all copies
6  * and that both that copyright notice and this permission notice
7  * appear in supporting documentation, and that the name of NEC
8  * Corporation not be used in advertising or publicity pertaining to
9  * distribution of the software without specific, written prior
10  * permission.  NEC Corporation makes no representations about the
11  * suitability of this software for any purpose.  It is provided "as
12  * is" without express or implied warranty.
13  *
14  * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
16  * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
18  * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
19  * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20  * PERFORMANCE OF THIS SOFTWARE.
21  */
22 
23 #if !defined(lint) && !defined(__CODECENTER__)
24 static char rcs_id[] = "@(#) 102.1 $Id: mode.c,v 1.2 2003/01/10 13:08:45 aida_s Exp $";
25 #endif /* lint */
26 
27 #include "canna.h"
28 #include <canna/mfdef.h>
29 
30 /*********************************************************************
31  *                      wchar_t replace begin                        *
32  *********************************************************************/
33 #ifdef wchar_t
34 # error "wchar_t is already defined"
35 #endif
36 #define wchar_t cannawc
37 
38 extern int howToReturnModeInfo;
39 static wchar_t numMode[2];
40 static wchar_t *bad = (wchar_t *)0;
41 struct ModeNameRecs ModeNames[CANNA_MODE_MAX_IMAGINARY_MODE];
42 
43 static
44 char *
45 _sModeNames[CANNA_MODE_MAX_IMAGINARY_MODE] = {
46   "      ",		          /* AlphaMode */
47   "[ \244\242 ]",	/* �� */  /* EmptyMode */
48   "[\265\255\271\346]",	/* ���� *//* KigoMode */
49   "[\244\350\244\337]",	/* ��� *//* YomiMode (�⡼��ʸ����ɽ���ˤϻȤ�ʤ�) */
50   "[\273\372\274\357]",	/* ���� *//* JishuMode */
51   "[\264\301\273\372]",	/* ���� *//* TanKouhoMode */
52   "[\260\354\315\367]",	/* ���� *//* IchiranMode */
53   "[\274\301\314\344]",	/* ���� *//* YesNoMode */
54   NULL,	                          /* OnOffMode */
55   "[\312\270\300\341]", /* ʸ�� *//* AdjustBunsetsuMode */
56   "[\303\340\274\241]",	/* �༡ *//* ChikujiYomiMode    �༡�λ����ɤ���ʬ */
57   "[\303\340\274\241]",	/* �༡ *//* ChikujiHenkanMode  �༡�λ����Ѵ�����ʬ */
58 
59   /* Imaginary Mode */
60 
61   "[ \224\242 ]",	/* �� */  /* HenkanNyuryokuMode */
62   "[\301\264\244\242]",	/* ���� *//* ZenHiraHenkanMode */
63   "[\310\276\244\242]",	/* Ⱦ�� *//* HanHiraHenkanMode */
64   "[\301\264\245\242]",	/* ���� *//* ZenKataHenkanMode */
65   "[\310\276\245\242]",	/* Ⱦ�� *//* HanKataHenkanMode */
66   "[\301\264\261\321]",	/* ���� *//* ZenAlphaHenkanMode */
67   "[\310\276\261\321]",	/* Ⱦ�� *//* HanAlphaHenkanMode */
68   "<\301\264\244\242>",	/* ���� *//* ZenHiraKakuteiMode */
69   "<\310\276\244\242>",	/* Ⱦ�� *//* HanHiraKakuteiMode */
70   "<\301\264\245\242>",	/* ���� *//* ZenKataKakuteiMode */
71   "<\310\276\245\242>",	/* Ⱦ�� *//* HanKataKakuteiMode */
72   "<\301\264\261\321>",	/* ���� *//* ZenAlphaKakuteiMode */
73   "<\310\276\261\321>",	/* Ⱦ�� *//* HanAlphaKakuteiMode */
74   "[16\277\312]",	/* 16�� *//* HexMode */
75   "[\311\364\274\363]",	/* ���� *//* BushuMode */
76   "[\263\310\304\245]",	/* ��ĥ *//* ExtendMode */
77   "[ \245\355 ]",	/* �� */  /* RussianMode */
78   "[ \245\256 ]",	/* �� */  /* GreekMode */
79   "[\267\323\300\376]",	/* ���� *//* LineMode */
80   "[\312\321\271\271]",	/* �ѹ� *//* ChangingServerMode */
81   "[\312\321\264\271]",	/* �Ѵ� *//* HenkanMethodMode */
82   "[\272\357\275\374]",	/* ��� *//* DeleteDicMode */
83   "[\305\320\317\277]",	/* ��Ͽ *//* TourokuMode */
84   "[\311\312\273\354]",	/* �ʻ� *//* TourokuHinshiMode */
85   "[\274\255\275\361]",	/* ���� *//* TourokuDicMode */
86   "[ \243\361 ]",	/* �� */  /* QuotedInsertMode */
87   "[\312\324\275\270]",	/* �Խ� *//* BubunMuhenkanMode */
88   "[\274\255\275\361]", /* ���� *//* MountDicMode */
89   };
90 
91 
92 static wchar_t * _ModeNames[CANNA_MODE_MAX_IMAGINARY_MODE];
93 
94 extern extraFunc *FindExtraFunc();
95 #define findExtraMode(mnum) \
96  FindExtraFunc((mnum) - CANNA_MODE_MAX_IMAGINARY_MODE + CANNA_FN_MAX_FUNC)
97 
98 newmode *
findExtraKanjiMode(mnum)99 findExtraKanjiMode(mnum)
100 int mnum;
101 {
102   extern extraFunc *extrafuncp;
103   extraFunc *extrafunc;
104   register int fnum =
105     mnum - CANNA_MODE_MAX_IMAGINARY_MODE + CANNA_FN_MAX_FUNC;
106 
107   for (extrafunc = extrafuncp; extrafunc; extrafunc = extrafunc->next) {
108     if (extrafunc->fnum == fnum) {
109       switch (extrafunc->keyword) {
110       case EXTRA_FUNC_DEFMODE:
111 	return extrafunc->u.modeptr;
112       default:
113 	return (newmode *)0;
114       }
115     }
116   }
117   return (newmode *)0;
118 }
119 
120 extern nothermodes;
121 
122 static wchar_t *
modestr(mid)123 modestr(mid)
124 int mid;
125 {
126   if (mid < CANNA_MODE_MAX_IMAGINARY_MODE) {
127       return(ModeNames[mid].name);
128   }
129   else if (mid - CANNA_MODE_MAX_IMAGINARY_MODE < nothermodes) {
130     extraFunc *ep = findExtraMode(mid);
131     if (ep) {
132       return ep->display_name;
133     }
134   }
135   return (wchar_t *)0;
136 }
137 
138 void
currentModeInfo(d)139 currentModeInfo(d)
140 uiContext d;
141 {
142   coreContext cc = (coreContext)d->modec;
143 
144   if (d->current_mode->flags & CANNA_KANJIMODE_EMPTY_MODE) {
145     d->kanji_status_return->info |= KanjiEmptyInfo;
146   }
147 
148   if (howToReturnModeInfo == ModeInfoStyleIsString) {
149     wchar_t *modename, *gmodename;
150     if (cc->minorMode != d->minorMode) {
151       modename = modestr(cc->minorMode);
152       gmodename = modestr(d->minorMode);
153       d->majorMode = cc->majorMode;
154       d->minorMode = cc->minorMode;
155       if (modename && (gmodename == (wchar_t *)NULL ||
156 		       WStrcmp(modename, gmodename))) {
157 	d->kanji_status_return->mode = modename;
158 	d->kanji_status_return->info |= KanjiModeInfo;
159       }
160     }
161   }
162   else {
163     if (cc->majorMode != d->majorMode) {
164       d->majorMode = cc->majorMode;
165       d->minorMode = cc->minorMode;
166       numMode[0] = (wchar_t)('@' + cc->majorMode);
167       numMode[1] = (wchar_t) 0;
168       d->kanji_status_return->info |= KanjiModeInfo;
169       d->kanji_status_return->mode = numMode;
170     }
171   }
172 }
173 
174 /* ���Υե�����ˤϥ⡼���ѹ��˴ؤ��������̤����äƤ��롣�⡼�ɤ���
175  * ���Ȥϡ����޻������Ѵ���ɽ�̤˸����⡼�ɤ��ѹ������ǤϤʤ�����
176  * ���ɤߤ��ʤ����֤��顢�ɤߤ�������֤˰ܤ���ˤ��������Τ�ؤ���
177  */
178 
179 void
initModeNames()180 initModeNames()
181 {
182   int i;
183 
184   for (i = 0 ; i < CANNA_MODE_MAX_IMAGINARY_MODE ; i++) {
185     ModeNames[i].alloc = 0;
186     ModeNames[i].name = _ModeNames[i] =
187       _sModeNames[i] ? WString(_sModeNames[i]) : 0;
188   }
189   if (!bad) {
190     bad = WString("\245\341\245\342\245\352\244\254\302\255\244\352\244\336"
191 	"\244\273\244\363");
192                   /* ���꤬­��ޤ��� */
193   }
194 }
195 
196 void
resetModeNames()197 resetModeNames()
198 {
199   int i;
200 
201   for (i = 0 ; i < CANNA_MODE_MAX_IMAGINARY_MODE ; i++) {
202     if (ModeNames[i].alloc && ModeNames[i].name) {
203       ModeNames[i].alloc = 0;
204       WSfree(ModeNames[i].name);
205     }
206     ModeNames[i].name = _ModeNames[i];
207   }
208 }
209 
210 static void
japaneseMode(d)211 japaneseMode(d)
212 uiContext d;
213 {
214   coreContext cc = (coreContext)d->modec;
215 
216   d->current_mode = cc->prevMode;
217   d->modec = cc->next;
218   freeCoreContext(cc);
219   d->status = EXIT_CALLBACK;
220 }
221 
222 /* cfuncdef
223 
224   JapaneseMode(d) -- �⡼�ɤ����ܸ����ϥ⡼�ɤ��Ѥ��롣
225 
226   ���� ���δؿ��Ϧ��⡼�ɤǤ����Ƥ�ǤϤ����ʤ���
227 
228  */
229 
JapaneseMode(d)230 JapaneseMode(d)
231 uiContext d;
232 {
233   coreContext cc = (coreContext)d->modec;
234   yomiContext yc = (yomiContext)cc->next;
235 
236   if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
237     return NothingChangedWithBeep(d);
238   }
239 
240   japaneseMode(d);
241   d->kanji_status_return->length = 0;
242   return 0;
243 }
244 
AlphaMode(d)245 AlphaMode(d)
246 uiContext d;
247 {
248   yomiContext yc = (yomiContext)d->modec;
249 
250   if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
251     return NothingChangedWithBeep(d);
252   }
253   else {
254     alphaMode(d);
255     currentModeInfo(d);
256     d->kanji_status_return->length = 0;
257     return 0;
258   }
259 }
260 
HenkanNyuryokuMode(d)261 HenkanNyuryokuMode(d)
262 uiContext d;
263 {
264   extern KanjiModeRec empty_mode;
265   yomiContext yc = (yomiContext)d->modec;
266 
267   if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
268     return NothingChangedWithBeep(d);
269   }
270 
271   yc->generalFlags &= (~CANNA_YOMI_ATTRFUNCS & ~CANNA_YOMI_IGNORE_USERSYMBOLS &
272 		       ~CANNA_YOMI_BASE_HANKAKU);
273   d->current_mode = yc->myEmptyMode = &empty_mode;
274   yc->majorMode = yc->minorMode = CANNA_MODE_EmptyMode;
275   yc->myMinorMode = 0; /* 0 �� AlphaMode �ȽŤʤ뤬����Ϥʤ� */
276   yc->romdic = romajidic;
277   EmptyBaseModeInfo(d, yc);
278 
279   if(yc->rCurs)
280     return RomajiFlushYomi(d, (wchar_t *)0, 0); /* ����ϻ���Ū */
281 
282   d->kanji_status_return->length = 0;
283   return 0;
284 }
285 
queryMode(d,arg)286 queryMode(d, arg)
287 uiContext d;
288 wchar_t *arg;
289 {
290   coreContext cc = (coreContext)d->modec;
291   wchar_t *mode_str = (wchar_t *)0;
292   extraFunc *ep;
293 
294   switch (howToReturnModeInfo) {
295   case ModeInfoStyleIsString:
296     if (d->minorMode < (BYTE)CANNA_MODE_MAX_IMAGINARY_MODE) {
297       mode_str = ModeNames[d->minorMode].name;
298     }
299     else if (d->minorMode <
300 	     (BYTE)(CANNA_MODE_MAX_IMAGINARY_MODE + nothermodes)) {
301       ep = findExtraMode(d->minorMode);
302       if (ep) {
303 	mode_str = ep->display_name;
304       }
305     }
306     if (!mode_str) {
307       int ii;
308       for (ii = 0; ii < 4; ii++, arg++) {
309 	*arg = (wchar_t)'\0';
310       }
311     }
312     else {
313       WStrcpy(arg, mode_str);
314     }
315     break;
316   case ModeInfoStyleIsBaseNumeric:
317     {
318       coreContext ccc;
319       yomiContext yc;
320       long fl;
321       int res;
322 
323       arg[3] = 0;
324 
325       for (ccc = cc ; ccc && ccc->id != YOMI_CONTEXT ; ccc = ccc->next);
326       yc = (yomiContext)ccc; /* This must not be NULL */
327 
328       if (yc->id == YOMI_CONTEXT) {
329         fl = yc->generalFlags;
330 
331         if (fl & CANNA_YOMI_ROMAJI) {
332           res = CANNA_MODE_ZenAlphaHenkanMode;
333         }
334         else if (fl & CANNA_YOMI_KATAKANA) {
335           res = CANNA_MODE_ZenKataHenkanMode;
336         }
337         else {
338           res = CANNA_MODE_ZenHiraHenkanMode;
339         }
340         if (fl & CANNA_YOMI_BASE_HANKAKU) {
341           res++;
342         }
343         if (fl & CANNA_YOMI_KAKUTEI) {
344            res += (CANNA_MODE_ZenHiraKakuteiMode
345                      - CANNA_MODE_ZenHiraHenkanMode);
346         }
347         if (fl & (CANNA_YOMI_CHIKUJI_MODE | CANNA_YOMI_BASE_CHIKUJI))
348           arg[3] = CANNA_MODE_ChikujiYomiMode;
349       }
350       else {
351         res = CANNA_MODE_HanAlphaHenkanMode;
352       }
353       arg[2] = res;
354     }
355   case ModeInfoStyleIsExtendedNumeric:
356     arg[1] = (wchar_t)('@' + (int)cc->minorMode);
357   case ModeInfoStyleIsNumeric:
358     arg[0] = (wchar_t)('@' + (int)cc->majorMode);
359     break;
360   default:
361     return(-1);
362     /* NOTREACHED */
363     break;
364   }
365   return 0;
366 }
367 
368 /*
369  *   ����⡼�ɤ��Ф��ƥ⡼��ɽ��ʸ�������ꤹ�롣
370  *
371  */
372 
changeModeName(modeid,str)373 changeModeName(modeid, str)
374 int modeid;
375 char *str;
376 {
377   extraFunc *ep;
378 
379   if (modeid == CANNA_MODE_HenkanNyuryokuMode)
380     modeid = CANNA_MODE_EmptyMode;
381 
382   if (modeid >= 0) {
383     if (modeid < CANNA_MODE_MAX_IMAGINARY_MODE) {
384       if (ModeNames[modeid].alloc && ModeNames[modeid].name) {
385 	WSfree(ModeNames[modeid].name);
386       }
387       if (str) {
388 	ModeNames[modeid].alloc = 1;
389 	ModeNames[modeid].name = WString(str);
390       }
391       else {
392 	ModeNames[modeid].alloc = 0;
393 	ModeNames[modeid].name = (wchar_t *)0;
394       }
395     }
396     else if (modeid < (CANNA_MODE_MAX_IMAGINARY_MODE + nothermodes)) {
397       ep = findExtraMode(modeid);
398       if (ep) {
399 	if (ep->display_name) {
400 	  WSfree(ep->display_name);
401 	}
402 	if (str) {
403 	  ep->display_name = WString(str);
404 	}
405 	else {
406 	  ep->display_name = (wchar_t *)0;
407 	}
408       }
409       else {
410 	return -1;
411       }
412     }
413     return 0;
414   }
415   return -1;
416 }
417 
418 
419 #ifndef wchar_t
420 # error "wchar_t is already undefined"
421 #endif
422 #undef wchar_t
423 /*********************************************************************
424  *                       wchar_t replace end                         *
425  *********************************************************************/
426