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