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