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: jishu.c,v 1.3 2003/09/17 08:50:53 aida_s Exp $";
25 #endif /* lint */
26
27 #include "canna.h"
28 #include <ctype.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 WToupper pro((wchar_t));
39 static void setInhibitInformation pro((yomiContext));
40 static void jishuAdjustRome pro((uiContext)), jishuAdjustRome pro((uiContext));
41 static int JishuZenkaku();
42 static int JishuHankaku();
43
44 /* yc->jishu_kc ����ʸ���狼
45 * d->jishu_rEndp
46 * d->jishu_kEndp
47 * �����
48 * ������sh|
49 * C- ������sh|
50 * C- ������s|h
51 * C- ������|sh
52 * C- ����|��sh
53 *
54 * ������sh|
55 * C- aishish|
56 * C- ��������|
57 * C- �������|h
58 * C- ������|sh
59 * C- �����|��sh
60 * C- aish|��sh
61 * C- ����sh|��sh
62 * C- ����sh|sh
63 * C- ����s|��sh
64 * C- ����|��sh
65 * C-
66 *
67 */
68
69 #define INHIBIT_HANKATA 0x01
70 #define INHIBIT_KANA 0x02
71 #define INHIBIT_ALPHA 0x04
72 #define INHIBIT_HIRA 0x08
73
74 void
enterJishuMode(d,yc)75 enterJishuMode(d, yc)
76 uiContext d;
77 yomiContext yc;
78 {
79 extern KanjiModeRec jishu_mode;
80 int pos;
81
82 yc->jishu_kc = JISHU_HIRA;/* ���ϤҤ餬�ʥ⡼�ɤǤ� */
83 yc->jishu_case = 0; /* Case �Ѵ��ʤ��Υ⡼�ɤǤ� */
84 setInhibitInformation(yc);
85 if (yc->cmark < yc->cStartp) {
86 yc->cmark = yc->cStartp;
87 }
88 if (yc->kCurs == yc->cmark) {
89 yc->jishu_kEndp = yc->kEndp;
90 yc->jishu_rEndp = yc->rEndp;
91 }
92 else if (yc->kCurs < yc->cmark) {
93 int rpos;
94
95 yc->jishu_kEndp = yc->cmark;
96 yc->cmark = yc->kCurs;
97 yc->kRStartp = yc->kCurs = yc->jishu_kEndp;
98 kPos2rPos(yc, 0, yc->kCurs, (int *)0, &rpos);
99 yc->jishu_rEndp = yc->rStartp = yc->rCurs = rpos;
100 }
101 else {
102 yc->jishu_kEndp = yc->kCurs;
103 yc->jishu_rEndp = yc->rCurs;
104 }
105 /* yc->majorMode = d->majorMode; */
106 kPos2rPos(yc, 0, (int)yc->cmark, (int *)0, &pos);
107 yc->rmark = (short)pos;
108 d->current_mode = yc->curMode = &jishu_mode;
109 }
110
111 void
leaveJishuMode(d,yc)112 leaveJishuMode(d, yc)
113 uiContext d;
114 yomiContext yc;
115 {
116 extern KanjiModeRec yomi_mode, cy_mode;
117
118 yc->jishu_kEndp = 0;
119 if (yc->generalFlags & CANNA_YOMI_CHIKUJI_MODE) {
120 d->current_mode = yc->curMode = &cy_mode;
121 }
122 else {
123 d->current_mode = yc->curMode = &yomi_mode;
124 }
125 yc->minorMode = getBaseMode(yc);
126 currentModeInfo(d);
127 }
128
129 static void
setInhibitInformation(yc)130 setInhibitInformation(yc)
131 yomiContext yc;
132 {
133 int i;
134
135 yc->inhibition = cannaconf.InhibitHankakuKana ? INHIBIT_HANKATA : 0;
136 for (i = 0 ; i < yc->kEndp ; i++) {
137 if ( !(yc->kAttr[i] & HENKANSUMI) && WIsG0(yc->kana_buffer[i]) ) {
138 yc->inhibition |= INHIBIT_KANA;
139 break;
140 }
141 }
142 for (i = 0 ; i < yc->rEndp ; i++) {
143 if (!WIsG0(yc->romaji_buffer[i])) {
144 yc->inhibition |= INHIBIT_ALPHA;
145 }
146 }
147 }
148
extractJishuString(yc,s,e,sr,er)149 extractJishuString(yc, s, e, sr, er)
150 yomiContext yc;
151 wchar_t *s, *e, **sr, **er;
152 {
153 wchar_t *ss = s;
154 int jishulen, len, revlen;
155 #ifndef USE_MALLOC_FOR_BIG_ARRAY
156 wchar_t xxxx[1024], yyyy[1024];
157 #else
158 wchar_t *xxxx, *yyyy;
159 xxxx = (wchar_t *)malloc(sizeof(wchar_t) * 1024);
160 yyyy = (wchar_t *)malloc(sizeof(wchar_t) * 1024);
161 if (!xxxx || !yyyy) {
162 if (xxxx) {
163 (void)free((char *)xxxx);
164 }
165 if (yyyy) {
166 (void)free((char *)yyyy);
167 }
168 return 0;
169 }
170 #endif
171
172 if (s + yc->cmark - yc->cStartp < e) {
173 WStrncpy(s, yc->kana_buffer + yc->cStartp, yc->cmark - yc->cStartp);
174 s += yc->cmark - yc->cStartp;
175 }
176 else {
177 WStrncpy(s, yc->kana_buffer + yc->cStartp, (int)(e - s));
178 s = e;
179 }
180
181 if ((yc->jishu_kc == JISHU_ZEN_KATA ||
182 yc->jishu_kc == JISHU_HAN_KATA ||
183 yc->jishu_kc == JISHU_HIRA)) {
184 int i, j, m, n, t, r;
185 wchar_t *p = yyyy;
186 for (i = yc->cmark ; i < yc->jishu_kEndp ;) {
187 if (yc->kAttr[i] & STAYROMAJI) {
188 j = i++;
189 while (i < yc->jishu_kEndp && (yc->kAttr[i] & STAYROMAJI)) {
190 i++;
191 }
192 t = r = 0;
193 while (j < i) {
194 int st = t;
195 WStrncpy(xxxx + t, yc->kana_buffer + j, i - j);
196 RkwMapPhonogram(yc->romdic, p, 1024 - (int)(p - yyyy),
197 xxxx, st + i - j, xxxx[0],
198 RK_FLUSH | RK_SOKON, &n, &m, &t, &r);
199 /* RK_SOKON ���դ���Τϵ켭���� */
200 p += m;
201 j += n - st;
202 WStrncpy(xxxx, p, t);
203 }
204 }
205 else {
206 *p++ = yc->kana_buffer[i++];
207 }
208 }
209 jishulen = p - yyyy;
210 }
211
212 switch (yc->jishu_kc)
213 {
214 case JISHU_ZEN_KATA: /* ���ѥ������ʤ��Ѵ����� */
215 len = RkwCvtZen(xxxx, 1024, yyyy, jishulen);
216 revlen = RkwCvtKana(s, (int)(e - s), xxxx, len);
217 break;
218
219 case JISHU_HAN_KATA: /* Ⱦ�ѥ������ʤ��Ѵ����� */
220 len = RkwCvtKana(xxxx, 1024, yyyy, jishulen);
221 revlen = RkwCvtHan(s, (int)(e - s), xxxx, len);
222 break;
223
224 case JISHU_HIRA: /* �Ҥ餬�ʤ��Ѵ����� */
225 len = RkwCvtZen(xxxx, 1024, yyyy, jishulen);
226 revlen = RkwCvtHira(s, (int)(e - s), xxxx, len);
227 break;
228
229 case JISHU_ZEN_ALPHA: /* ���ѱѿ����Ѵ����� */
230 if (yc->jishu_case == CANNA_JISHU_UPPER ||
231 yc->jishu_case == CANNA_JISHU_LOWER ||
232 yc->jishu_case == CANNA_JISHU_CAPITALIZE) {
233 int i, head = 1;
234 wchar_t *p = yc->romaji_buffer;
235
236 for (i = yc->rmark ; i < yc->jishu_rEndp ; i++) {
237 xxxx[i - yc->rmark] =
238 (yc->jishu_case == CANNA_JISHU_UPPER) ? WToupper(p[i]) :
239 (yc->jishu_case == CANNA_JISHU_LOWER) ? WTolower(p[i]) : p[i];
240 if (yc->jishu_case == CANNA_JISHU_CAPITALIZE) {
241 if (p[i] <= ' ') {
242 head = 1;
243 }
244 else if (head) {
245 head = 0;
246 xxxx[i - yc->rmark] = WToupper(p[i]);
247 }
248 }
249 }
250 xxxx[yc->jishu_rEndp - yc->rmark] = 0;
251 revlen = RkwCvtZen(s, (int)(e - s), xxxx,
252 yc->jishu_rEndp - yc->rmark);
253 #if 0
254 } else if (yc->jishu_case == CANNA_JISHU_CAPITALIZE) {
255 WStrncpy(xxxx, yc->romaji_buffer + yc->rmark,
256 yc->jishu_rEndp - yc->rmark);
257 *xxxx = WToupper(*xxxx);
258 xxxx[yc->jishu_rEndp - yc->rmark] = 0;
259 revlen = RkwCvtZen(s, (int)(e - s), xxxx,
260 yc->jishu_rEndp - yc->rmark);
261 #endif
262 } else {
263 revlen = RkwCvtZen(s, (int)(e - s), yc->romaji_buffer + yc->rmark,
264 yc->jishu_rEndp - yc->rmark);
265 }
266 break;
267
268 case JISHU_HAN_ALPHA: /* Ⱦ�ѱѿ����Ѵ����� */
269 revlen = yc->jishu_rEndp - yc->rmark;
270 if (yc->jishu_case == CANNA_JISHU_UPPER ||
271 yc->jishu_case == CANNA_JISHU_LOWER ||
272 yc->jishu_case == CANNA_JISHU_CAPITALIZE) {
273 int i, head = 1;
274 wchar_t *p = yc->romaji_buffer + yc->rmark;
275
276 for (i = 0 ; i < revlen && s < e ; i++) {
277 *s++ =
278 (yc->jishu_case == CANNA_JISHU_UPPER) ? WToupper(p[i]) :
279 (yc->jishu_case == CANNA_JISHU_LOWER) ? WTolower(p[i]) : p[i];
280 if (yc->jishu_case == CANNA_JISHU_CAPITALIZE) {
281 if (p[i] <= ' ') {
282 head = 1;
283 }
284 else if (head) {
285 head = 0;
286 s[-1] = WToupper(p[i]);
287 }
288 }
289 }
290 s -= revlen;
291 #if 0
292 } else if (yc->jishu_case == CANNA_JISHU_CAPITALIZE) {
293 if (s + revlen < e) {
294 WStrncpy(s, yc->romaji_buffer + yc->rmark, revlen);
295 }
296 else {
297 WStrncpy(s, yc->romaji_buffer + yc->rmark, (int)(e - s));
298 revlen = (int)(e - s);
299 }
300 *s = WToupper(yc->romaji_buffer[yc->rmark]);
301 #endif
302 }
303 else if (s + revlen < e) {
304 WStrncpy(s, yc->romaji_buffer + yc->rmark, revlen);
305 }
306 else {
307 WStrncpy(s, yc->romaji_buffer + yc->rmark, (int)(e - s));
308 revlen = (int)(e - s);
309 }
310 break;
311
312 default:/* �ɤ�Ǥ�ʤ��ä����Ѵ�����ʤ��ΤDz��⤷�ʤ� */
313 break;
314 }
315
316 *sr = s;
317 s += revlen;
318 *er = s;
319
320 /* ʸ�����Ѵ����ʤ���ʬ���դ��ä��� */
321 switch (yc->jishu_kc)
322 {
323 case JISHU_HIRA: /* �Ҥ餬�ʤʤ� */
324 case JISHU_ZEN_KATA: /* ���ѥ������ʤʤ� */
325 case JISHU_HAN_KATA: /* Ⱦ�ѥ������ʤʤ� */
326 /* ���ʥХåե�����ʸ�������Ф� */
327 if (s + yc->kEndp - yc->jishu_kEndp < e) {
328 WStrncpy(s, yc->kana_buffer + yc->jishu_kEndp,
329 yc->kEndp - yc->jishu_kEndp);
330 s += yc->kEndp - yc->jishu_kEndp;
331 }
332 else {
333 WStrncpy(s, yc->kana_buffer + yc->jishu_kEndp, (int)(e - s));
334 s = e;
335 }
336 break;
337
338 case JISHU_ZEN_ALPHA: /* ���ѱѿ��ʤ� */
339 case JISHU_HAN_ALPHA: /* Ⱦ�ѱѿ��ʤ� */
340 len = RkwCvtRoma(romajidic, s, (int)(e - s),
341 yc->romaji_buffer + yc->jishu_rEndp,
342 yc->rEndp - yc->jishu_rEndp,
343 RK_FLUSH | RK_SOKON | RK_XFER);
344 s += len;
345 break;
346 default:/* �ɤ�Ǥ�ʤ��ä��鲿�⤷�ʤ� */
347 break;
348 }
349
350 if (s < e) {
351 *s = (wchar_t)0;
352 }
353 #ifdef USE_MALLOC_FOR_BIG_ARRAY
354 (void)free((char *)xxxx);
355 (void)free((char *)yyyy);
356 #endif
357 return (int)(s - ss);
358 }
359
360 static
inhibittedJishu(d)361 inhibittedJishu(d)
362 uiContext d;
363 {
364 yomiContext yc = (yomiContext)d->modec;
365
366 return (((yc->inhibition & INHIBIT_KANA) &&
367 (yc->jishu_kc == JISHU_ZEN_KATA ||
368 yc->jishu_kc == JISHU_HAN_KATA)) ||
369 ((yc->inhibition & INHIBIT_ALPHA) &&
370 (yc->jishu_kc == JISHU_ZEN_ALPHA ||
371 yc->jishu_kc == JISHU_HAN_ALPHA)) ||
372 ((yc->inhibition & INHIBIT_HANKATA) &&
373 (yc->jishu_kc == JISHU_HAN_KATA))
374 );
375 }
376
377 static
nextJishu(d)378 nextJishu(d)
379 uiContext d;
380 {
381 yomiContext yc = (yomiContext)d->modec;
382 BYTE startkc = yc->jishu_kc;
383
384 do {
385 yc->jishu_kc = (BYTE)(((int)yc->jishu_kc + 1) % MAX_JISHU);
386 } while (inhibittedJishu(d) && yc->jishu_kc != startkc);
387 return yc->jishu_kc != startkc;
388 }
389
390 static
previousJishu(d)391 previousJishu(d)
392 uiContext d;
393 {
394 yomiContext yc = (yomiContext)d->modec;
395 BYTE startkc = yc->jishu_kc;
396
397 do {
398 yc->jishu_kc = (unsigned char)
399 (((int)yc->jishu_kc + MAX_JISHU - 1) % MAX_JISHU);
400 } while (inhibittedJishu(d) && yc->jishu_kc != startkc);
401 return yc->jishu_kc != startkc;
402 }
403
404 static JishuNextJishu pro((uiContext));
405
406 static
JishuNextJishu(d)407 JishuNextJishu(d) /* ����⡼�ɤλ��˽���ʸ�����Ѵ��� */
408 uiContext d;
409 {
410 yomiContext yc = (yomiContext)d->modec;
411
412 /* ���Ф���ʸ������Ѵ����� */
413 if (!nextJishu(d)) {
414 return NothingChangedWithBeep(d);
415 }
416 if (yc->jishu_kc == JISHU_HIRA) {
417 if (yc->jishu_kEndp == yc->kEndp && yc->jishu_rEndp == yc->rEndp) {
418 leaveJishuMode(d, yc);
419 }
420 }
421 makeKanjiStatusReturn(d, yc);
422 return 0;
423 }
424
425 static JishuPreviousJishu pro((uiContext));
426
427 static
JishuPreviousJishu(d)428 JishuPreviousJishu(d) /* ����⡼�ɤλ��˵ղ��ʸ�����Ѵ��� */
429 uiContext d;
430 {
431 yomiContext yc = (yomiContext)d->modec;
432
433 /* ���Ф���ʸ������Ѵ����� */
434 if (!previousJishu(d)) {
435 return NothingChangedWithBeep(d);
436 }
437 if (yc->jishu_kc == JISHU_HIRA) {
438 if (yc->jishu_kEndp == yc->kEndp && yc->jishu_rEndp == yc->rEndp) {
439 leaveJishuMode(d, yc);
440 }
441 }
442 makeKanjiStatusReturn(d, yc);
443 return 0;
444 }
445
446 static JishuRotateWithInhibition pro((uiContext, unsigned));
447
448 static
JishuRotateWithInhibition(d,inhibit)449 JishuRotateWithInhibition(d, inhibit)
450 uiContext d;
451 unsigned inhibit;
452 {
453 yomiContext yc = (yomiContext)d->modec;
454 BYTE savedInhibition = yc->inhibition;
455 int res;
456
457 yc->inhibition |= inhibit;
458
459 res = JishuNextJishu(d);
460 yc->inhibition = savedInhibition;
461 return res;
462 }
463
464 static JishuKanaRotate pro((uiContext));
465
466 static
JishuKanaRotate(d)467 JishuKanaRotate(d) /* ����⡼�ɤλ��˽��꤫��ʸ�����Ѵ��� */
468 uiContext d;
469 {
470 return JishuRotateWithInhibition(d, INHIBIT_ALPHA);
471 }
472
473 static JishuRomajiRotate pro((uiContext));
474
475 static
JishuRomajiRotate(d)476 JishuRomajiRotate(d) /* ����⡼�ɤλ��˽���ѿ�ʸ�����Ѵ��� */
477 uiContext d;
478 {
479 return JishuRotateWithInhibition(d, INHIBIT_KANA | INHIBIT_HIRA);
480 }
481
482 static void myjishuAdjustRome pro((uiContext));
483 static JishuShrink pro((uiContext));
484
485 static
JishuShrink(d)486 JishuShrink(d) /* ʸ�����Ѵ��ΰ��̤�� */
487 uiContext d;
488 {
489 yomiContext yc = (yomiContext)d->modec;
490
491 /* ��Υݥ����᤹ */
492 switch (yc->jishu_kc)
493 {
494 case JISHU_ZEN_ALPHA:
495 case JISHU_HAN_ALPHA: /* ���ѱѿ�����Ⱦ�ѱѿ����ʤ� */
496 myjishuAdjustRome(d);
497 yc->jishu_rEndp--; /* ��������Хåե�����ǥå������᤹ */
498 if (yc->rAttr[yc->jishu_rEndp] & SENTOU) {
499 /* ���������Ѵ���Ƭ�ե饰�Хåե���
500 * Ω�äƤ�����
501 */
502 for (--yc->jishu_kEndp ;
503 yc->jishu_kEndp > 0 && !(yc->kAttr[yc->jishu_kEndp] & SENTOU) ;) {
504 --yc->jishu_kEndp;
505 }
506 /* �����Ѵ������ե饰�Хåե�����Ƭ��
507 * Ω�äƤ����ޤ�
508 * ���狼�ʥХåե�����ǥå�����
509 * �᤹
510 */
511 }
512 break;
513 case JISHU_HIRA:
514 case JISHU_ZEN_KATA:
515 case JISHU_HAN_KATA: /* �Ҥ餬�ʤ����ѥ������ʤ�Ⱦ�ѥ������ʤʤ� */
516 jishuAdjustRome(d);
517 yc->jishu_kEndp--; /* ���狼�ʥХåե�����ǥå�����ʸ��ʬ�᤹ */
518 if (yc->kAttr[yc->jishu_kEndp] & SENTOU) {
519 /* �����Ѵ������ե饰�Хåե���
520 * Ω�äƤ�����
521 */
522 for (--yc->jishu_rEndp ;
523 yc->jishu_rEndp > 0 && !(yc->rAttr[yc->jishu_rEndp] & SENTOU) ;) {
524 --yc->jishu_rEndp;
525 }
526 /* ���������Ѵ���Ƭ�ե饰�Хåե���
527 * Ω�äƤ����ޤ�
528 * ��������Хåե�����ǥå�����
529 * �᤹
530 */
531 }
532 break;
533 }
534
535 if(yc->jishu_rEndp <= yc->rmark) {/* �������������Хåե�����ǥå�����
536 * ����Ĺ�����᤹
537 */
538 yc->jishu_kEndp = yc->kEndp;
539 yc->jishu_rEndp = yc->rEndp;
540 }
541 makeKanjiStatusReturn(d, yc);
542 return 0;
543 }
544
545 static JishuNop pro((uiContext));
546
547 static
JishuNop(d)548 JishuNop(d)
549 uiContext d;
550 {
551 /* currentModeInfo �ǥ⡼�ɾ���ɬ���֤�褦�˥��ߡ��Υ⡼�ɤ�����Ƥ��� */
552 d->majorMode = d->minorMode = CANNA_MODE_AlphaMode;
553 currentModeInfo(d);
554
555 makeKanjiStatusReturn(d, (yomiContext)d->modec);
556 return 0;
557 }
558
559 static JishuExtend pro((uiContext));
560
561 static
JishuExtend(d)562 JishuExtend(d) /* ʸ�����Ѵ��ΰ�Ф� */
563 uiContext d;
564 {
565 yomiContext yc = (yomiContext)d->modec;
566
567 /* ��Υݥ������䤹 */
568 switch (yc->jishu_kc) {
569 case JISHU_ZEN_ALPHA:
570 case JISHU_HAN_ALPHA: /* ���ѱѿ�����Ⱦ�ѱѿ����ʤ� */
571 myjishuAdjustRome(d);
572
573 if(yc->jishu_rEndp >= yc->rEndp && yc->jishu_kEndp >= yc->kEndp ) {
574 /* �������������Хåե�����ǥå�����
575 * ���������᤹
576 */
577 yc->jishu_rEndp = yc->rmark;
578 yc->jishu_kEndp = yc->cmark;
579 }
580
581 if (yc->rAttr[yc->jishu_rEndp] & SENTOU) {
582 /* ���������Ѵ���Ƭ�ե饰�Хåե���
583 * Ω�äƤ�����
584 */
585
586 for (yc->jishu_kEndp++ ;
587 yc->jishu_kEndp > 0 && !(yc->kAttr[yc->jishu_kEndp] & SENTOU) ;) {
588 yc->jishu_kEndp++;
589 }
590 /* �����Ѵ������ե饰�Хåե�����Ƭ��
591 * Ω�äƤ����ޤ�
592 * ���狼�ʥХåե�����ǥå��������䤹
593 */
594 }
595 yc->jishu_rEndp++; /* ��������Хåե�����ǥå��������䤹 */
596 break;
597 case JISHU_HIRA:
598 case JISHU_ZEN_KATA:
599 case JISHU_HAN_KATA: /* �Ҥ餬�ʤ����ѥ������ʤ�Ⱦ�ѥ������ʤʤ� */
600 jishuAdjustRome(d);
601
602 if(yc->jishu_rEndp >= yc->rEndp && yc->jishu_kEndp >= yc->kEndp ) {
603 /* �������������Хåե�����ǥå�����
604 * ���������᤹
605 */
606 yc->jishu_rEndp = yc->rmark;
607 yc->jishu_kEndp = yc->cmark;
608 }
609
610 if (yc->kAttr[yc->jishu_kEndp] & SENTOU) {
611 /* �����Ѵ������ե饰�Хåե���
612 * Ω�äƤ�����
613 */
614 for (yc->jishu_rEndp++ ;
615 yc->jishu_rEndp > 0 && !(yc->rAttr[yc->jishu_rEndp] & SENTOU) ;) {
616 yc->jishu_rEndp++;
617 }
618 /* ���������Ѵ���Ƭ�ե饰�Хåե���
619 * Ω�äƤ����ޤ�
620 * ��������Хåե�����ǥå��������䤹
621 */
622 }
623 yc->jishu_kEndp++; /* ���狼�ʥХåե�����ǥå�����ʸ��ʬ���䤹 */
624 break;
625 }
626 makeKanjiStatusReturn(d, yc);
627 return 0;
628 }
629
630 static void
jishuAdjustRome(d)631 jishuAdjustRome(d)
632 uiContext d;
633 {
634 yomiContext yc = (yomiContext)d->modec;
635
636 while (!(yc->rAttr[yc->jishu_rEndp] & SENTOU)) {
637 ++yc->jishu_rEndp;
638 }
639 }
640
641 static void
myjishuAdjustRome(d)642 myjishuAdjustRome(d)
643 uiContext d;
644 {
645 yomiContext yc = (yomiContext)d->modec;
646
647 while (!(yc->kAttr[yc->jishu_kEndp] & SENTOU)
648 && !(yc->jishu_kEndp == yc->kEndp)) {
649 ++yc->jishu_kEndp;
650 }
651 }
652
653 static JishuZenkaku pro((uiContext));
654
655 static
JishuZenkaku(d)656 JishuZenkaku(d) /* �����Ѵ� */
657 uiContext d;
658 {
659 yomiContext yc = (yomiContext)d->modec;
660
661 /* ���Ф���ʸ������Ѵ����� */
662 switch(yc->jishu_kc)
663 {
664 case JISHU_HIRA: /* �Ҥ餬�ʤʤ鲿�⤷�ʤ� */
665 break;
666
667 case JISHU_HAN_ALPHA: /* Ⱦ�ѱѿ��ʤ����ѱѿ����Ѵ����� */
668 yc->jishu_kc = JISHU_ZEN_ALPHA;
669 break;
670
671 case JISHU_ZEN_ALPHA: /* ���ѱѿ��ʤ鲿�⤷�ʤ� */
672 break;
673
674 case JISHU_HAN_KATA: /* Ⱦ�ѥ������ʤʤ����ѥ������ʤ��Ѵ����� */
675 yc->jishu_kc = JISHU_ZEN_KATA;
676 break;
677
678 case JISHU_ZEN_KATA: /* ���ѥ������ʤʤ鲿�⤷�ʤ� */
679 break;
680
681 default: /* �ɤ�Ǥ�ʤ��ä����Ѵ�����ʤ��ΤDz��⤷�ʤ� */
682 break;
683 }
684
685 makeKanjiStatusReturn(d, yc);
686 return 0;
687 }
688
689 static JishuHankaku pro((uiContext));
690
691 static
JishuHankaku(d)692 JishuHankaku(d) /* Ⱦ���Ѵ� */
693 uiContext d;
694 {
695 yomiContext yc = (yomiContext)d->modec;
696
697 /* ���Ф���ʸ������Ѵ����� */
698 switch(yc->jishu_kc)
699 {
700 case JISHU_HIRA: /* �Ҥ餬�ʤʤ�Ⱦ�ѥ������ʤ��Ѵ����� */
701 if (cannaconf.InhibitHankakuKana) {
702 return NothingChangedWithBeep(d);
703 }
704 yc->jishu_kc = JISHU_HAN_KATA;
705 break;
706
707 case JISHU_ZEN_KATA: /* ���ѥ������ʤʤ�Ⱦ�ѥ������ʤ��Ѵ����� */
708 if (cannaconf.InhibitHankakuKana) {
709 return NothingChangedWithBeep(d);
710 }
711 yc->jishu_kc = JISHU_HAN_KATA;
712 break;
713
714 case JISHU_HAN_KATA: /* Ⱦ�ѥ������ʤʤ鲿�⤷�ʤ� */
715 break;
716
717 case JISHU_ZEN_ALPHA: /* ���ѱѿ��ʤ�Ⱦ�ѱѿ����Ѵ����� */
718 yc->jishu_kc = JISHU_HAN_ALPHA;
719 break;
720
721 case JISHU_HAN_ALPHA: /* Ⱦ�ѱѿ��ʤ鲿�⤷�ʤ� */
722 break;
723
724 default: /* �ɤ�Ǥ�ʤ��ä����Ѵ�����ʤ��ΤDz��⤷�ʤ� */
725 break;
726 }
727
728 makeKanjiStatusReturn(d, yc);
729 return 0;
730 }
731
732 static
exitJishuAndDoSomething(d,fnum)733 exitJishuAndDoSomething(d, fnum)
734 uiContext d;
735 int fnum;
736 {
737 exitJishu(d);
738 d->more.todo = 1;
739 d->more.ch = d->ch;
740 d->more.fnum = fnum;
741 makeYomiReturnStruct(d);
742 currentModeInfo(d);
743 return d->nbytes = 0;
744 }
745
746 static JishuYomiInsert pro((uiContext));
747
748 static
JishuYomiInsert(d)749 JishuYomiInsert(d)
750 uiContext d;
751 {
752 if (cannaconf.MojishuContinue) {
753 return exitJishuAndDoSomething(d, 0);
754 }
755 else {
756 int res;
757
758 res = YomiKakutei(d);
759 /* �������ե饰���ߤ��ơ�����ˤ�äơ�
760 YomiKakutei(); more.todo = self-insert ������Ǥ���褦�ˤ��褦 */
761 d->more.todo = 1;
762 d->more.ch = d->ch;
763 d->more.fnum = CANNA_FN_FunctionalInsert;
764 makeYomiReturnStruct(d);
765 currentModeInfo(d);
766 return res;
767 }
768 }
769
770 static JishuQuit pro((uiContext));
771
772 static
JishuQuit(d)773 JishuQuit(d)
774 uiContext d;
775 {
776 leaveJishuMode(d, (yomiContext)d->modec);
777 makeKanjiStatusReturn(d, (yomiContext)d->modec);
778 return 0;
779 }
780
781 /* ��ʸ���ˤ���ؿ� */
782
783 static JishuToUpper pro((uiContext));
784
785 static
JishuToUpper(d)786 JishuToUpper(d)
787 uiContext d;
788 {
789 yomiContext yc = (yomiContext)d->modec;
790
791 if (!(yc->inhibition & INHIBIT_ALPHA)) { /* ̵��������ʸ�����Ѵ����� */
792 if (yc->jishu_kc == JISHU_HIRA || yc->jishu_kc == JISHU_ZEN_KATA) {
793 yc->jishu_kc = JISHU_ZEN_ALPHA;
794 }
795 else if (yc->jishu_kc == JISHU_HAN_KATA) {
796 yc->jishu_kc = JISHU_HAN_ALPHA;
797 }
798 }
799
800 if (yc->jishu_kc == JISHU_ZEN_ALPHA || yc->jishu_kc == JISHU_HAN_ALPHA) {
801 yc->jishu_case = CANNA_JISHU_UPPER;
802 makeKanjiStatusReturn(d, yc);
803 return 0;
804 }
805 else {
806 /* ���Ȳ����Ѥ��ޤ��� */
807 d->kanji_status_return->length = -1;
808 return 0;
809 }
810 }
811
812 static JishuCapitalize pro((uiContext));
813
814 static
JishuCapitalize(d)815 JishuCapitalize(d)
816 uiContext d;
817 {
818 yomiContext yc = (yomiContext)d->modec;
819
820 if (!(yc->inhibition & INHIBIT_ALPHA)) { /* ̵��������ʸ�����Ѵ����� */
821 if (yc->jishu_kc == JISHU_HIRA || yc->jishu_kc == JISHU_ZEN_KATA) {
822 yc->jishu_kc = JISHU_ZEN_ALPHA;
823 }
824 else if (yc->jishu_kc == JISHU_HAN_KATA) {
825 yc->jishu_kc = JISHU_HAN_ALPHA;
826 }
827 }
828
829 if (yc->jishu_kc == JISHU_ZEN_ALPHA || yc->jishu_kc == JISHU_HAN_ALPHA) {
830 yc->jishu_case = CANNA_JISHU_CAPITALIZE;
831 makeKanjiStatusReturn(d, yc);
832 return 0;
833 }
834 else {
835 /* ���Ȳ����Ѥ��ޤ��� */
836 d->kanji_status_return->length = -1;
837 return 0;
838 }
839 }
840
841 static JishuToLower pro((uiContext));
842
843 static
JishuToLower(d)844 JishuToLower(d)
845 uiContext d;
846 {
847 yomiContext yc = (yomiContext)d->modec;
848
849 if (!(yc->inhibition & INHIBIT_ALPHA)) { /* ̵��������ʸ�����Ѵ����� */
850 if (yc->jishu_kc == JISHU_HIRA || yc->jishu_kc == JISHU_ZEN_KATA) {
851 yc->jishu_kc = JISHU_ZEN_ALPHA;
852 }
853 else if (yc->jishu_kc == JISHU_HAN_KATA) {
854 yc->jishu_kc = JISHU_HAN_ALPHA;
855 }
856 }
857
858 if (yc->jishu_kc == JISHU_ZEN_ALPHA || yc->jishu_kc == JISHU_HAN_ALPHA) {
859 yc->jishu_case = CANNA_JISHU_LOWER;
860 makeKanjiStatusReturn(d, yc);
861 return 0;
862 }
863 else {
864 /* ���Ȳ����Ѥ��ޤ��� */
865 d->kanji_status_return->length = -1;
866 return 0;
867 }
868 }
869
870 static JishuHiragana pro((uiContext));
871
872 static
JishuHiragana(d)873 JishuHiragana(d)
874 uiContext d;
875 {
876 yomiContext yc = (yomiContext)d->modec;
877
878 yc->jishu_kc = JISHU_HIRA;
879 makeKanjiStatusReturn(d, yc);
880 return 0;
881 }
882
883 static JishuKatakana pro((uiContext));
884
885 static
JishuKatakana(d)886 JishuKatakana(d)
887 uiContext d;
888 {
889 yomiContext yc = (yomiContext)d->modec;
890
891 yc->jishu_kc = JISHU_ZEN_KATA;
892 makeKanjiStatusReturn(d, yc);
893 return 0;
894 }
895
896 static JishuRomaji pro((uiContext));
897
898 static
JishuRomaji(d)899 JishuRomaji(d)
900 uiContext d;
901 {
902 yomiContext yc = (yomiContext)d->modec;
903
904 if (yc->inhibition == INHIBIT_ALPHA) {
905 return NothingChangedWithBeep(d);
906 }
907 yc->jishu_kc = JISHU_ZEN_ALPHA;
908 makeKanjiStatusReturn(d, yc);
909 return 0;
910 }
911
912 static void
nextCase(yc)913 nextCase(yc)
914 yomiContext yc;
915 {
916 yc->jishu_case = (BYTE)(((int)yc->jishu_case + 1) % CANNA_JISHU_MAX_CASE);
917 }
918
919 static JishuCaseRotateForward pro((uiContext));
920
921 static
JishuCaseRotateForward(d)922 JishuCaseRotateForward(d)
923 uiContext d;
924 {
925 yomiContext yc = (yomiContext)d->modec;
926
927 if (yc->inhibition == INHIBIT_ALPHA) {
928 return NothingChangedWithBeep(d);
929 }
930 if (yc->jishu_kc == JISHU_ZEN_ALPHA ||
931 yc->jishu_kc == JISHU_HAN_ALPHA) {
932 nextCase(yc);
933 }
934 else if (yc->jishu_kc == JISHU_HIRA || yc->jishu_kc == JISHU_ZEN_KATA) {
935 yc->jishu_kc = JISHU_ZEN_ALPHA;
936 }
937 else if (yc->jishu_kc == JISHU_HAN_KATA) {
938 yc->jishu_kc = JISHU_HAN_ALPHA;
939 }
940 makeKanjiStatusReturn(d, yc);
941 return 0;
942 }
943
944 /*
945 * ���ʴ����Ѵ���Ԥ�(�Ѵ����������Ʋ����줿)��TanKouhoMode�˰ܹԤ���
946 *
947 * ������ uiContext
948 * ����� ���ェλ�� 0 �۾ェλ�� -1
949 */
950
951 static JishuKanjiHenkan pro((uiContext));
952
953 static
JishuKanjiHenkan(d)954 JishuKanjiHenkan(d)
955 uiContext d;
956 {
957 return exitJishuAndDoSomething(d, CANNA_FN_Henkan);
958 }
959
960 static JishuKanjiHenkanOInsert pro((uiContext));
961
962 static
JishuKanjiHenkanOInsert(d)963 JishuKanjiHenkanOInsert(d)
964 uiContext d;
965 {
966 return exitJishuAndDoSomething(d, CANNA_FN_HenkanOrInsert);
967 }
968
969 static JishuKanjiHenkanONothing pro((uiContext));
970
971 static
JishuKanjiHenkanONothing(d)972 JishuKanjiHenkanONothing(d)
973 uiContext d;
974 {
975 return exitJishuAndDoSomething(d, CANNA_FN_HenkanOrNothing);
976 }
977
978 #ifndef wchar_t
979 # error "wchar_t is already undefined"
980 #endif
981 #undef wchar_t
982 /*********************************************************************
983 * wchar_t replace end *
984 *********************************************************************/
985
986 #include "jishumap.h"
987