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/************************************************************************/
24/* THIS SOURCE CODE IS MODIFIED FOR TKO BY T.MURAI 1997
25/************************************************************************/
26
27
28/* filedef
29
30  util.c -- ¥æ¡¼¥Æ¥£¥ê¥Æ¥£´Ø¿ô¤ò½¸¤á¤¿¡£
31
32  °Ê²¼¤Î´Ø¿ô¤¬¤¢¤ë¡£(Äɲä·¤¿¿Í¤Ï¤Á¤ã¤ó¤È½ñ¤¤¤È¤¤¤Æ¤è)
33
34  GlineClear         ¥¬¥¤¥É¥é¥¤¥ó¤¬¾Ã¤µ¤ì¤ë¤è¤¦¤Ê¥ê¥¿¡¼¥óÃͤòºî¤ë
35  Gline2echostr      ¥¬¥¤¥É¥é¥¤¥ó¤ÇÊÖ¤½¤¦¤È¤·¤¿¤â¤Î¤ò¤½¤Î¾ì¤ÇÊÖ¤¹
36  echostrClear       ¤½¤Î¾ì¤¬Á´¤¯¾Ã¤µ¤ì¤ë¤è¤¦¤Ê¥ê¥¿¡¼¥óÃͤòºî¤ë
37  checkGLineLen      ¥¬¥¤¥É¥é¥¤¥ó¤Ëɽ¼¨¤·¤­¤ì¤ë¤«¤É¤¦¤«¤Î¥Á¥§¥Ã¥¯
38  NothingChanged     ²¿¤âÊѲ½¤¬¤Ê¤¤¤³¤È¤ò¼¨¤¹¥ê¥¿¡¼¥óÃͤòºî¤ë
39  NothingForGLine    ¥¬¥¤¥É¥é¥¤¥ó¤Ë´Ø¤·¤Æ¤Ï²¿¤âÊѲ½¤¬¤Ê¤¤
40  NothingChangedWithBeep
41                     NothingChange ¤ò¤·¤Æ¤µ¤é¤Ë¥Ó¡¼¥×²»¤òÌĤ餹
42  NothingForGLineWithBeep
43                     NothingForGLine ¤ò¤·¤Æ¤µ¤é¤Ë¥Ó¡¼¥×²»¤òÌĤ餹
44  CannaBeep          ¥Ó¡¼¥×²»¤ò¤Ê¤é¤¹¡£
45  makeGLineMessage   °ú¿ô¤Îʸ»úÎó¤òGLine¤Ëɽ¼¨¤¹¤ë¤è¤¦¤Ê¥ê¥¿¡¼¥óÃͤòºî¤ë
46  makeGLineMessageFromString
47  		     °ú¿ô¤Îeucʸ»úÎó¤òGLine¤Ëɽ¼¨¤¹¤ë¤è¤¦¤Ê¥ê¥¿¡¼¥óÃͤòºî¤ë
48  setWStrings	     ʸ»úÇÛÎó¤Î½é´ü²½¤ò¹Ô¤¦
49  NoMoreMemory       ¥á¥â¥ê¤¬¤Ê¤¤¤«¤é¥¨¥é¡¼¤À¤è¤È¤¤¤¦¥¨¥é¡¼ÃͤòÊÖ¤¹
50  GLineNGReturn      ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò¥¬¥¤¥É¥é¥¤¥ó¤Ë°Ü¤¹
51  GLineNGReturnFI    °ìÍ÷¥â¡¼¥É¤òÈ´¤±¤Æ GLineNGReturn ¤ò¤¹¤ë¡£
52  GLineNGReturnTK    ÅÐÏ¿¥â¡¼¥É¤òÈ´¤±¤Æ GLineNGReturn ¤ò¤¹¤ë¡£
53  WStrlen            ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤ÎŤµ¤òµá¤á¤ë (cf. strlen)
54  WStrcat            ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤ò²Ã¤¨¤ë¡£(cf. strcat)
55  WStrcpy            ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤ò¥³¥Ô¡¼¤¹¤ë¡£(cf. strcpy)
56  WStrncpy           ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤ò£îʸ»ú¥³¥Ô¡¼¤¹¤ë¡£(cf. strncpy)
57  WStraddbcpy        ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤ò¶õÇòʸ»ú¡¢¥¿¥Ö¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å
58                     ¤ÎÁ°¤Ë¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤òÆþ¤ì¤Ê¤¬¤é¥³¥Ô¡¼¤¹¤ë¡£
59  WStrcmp	     ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤òÈæ³Ó¤¹¤ë¡£(cf. strcmp)
60  WStrncmp	     ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤ò£îʸ»úÈæ³Ó¤¹¤ë¡£(cf. strncmp)
61  WWhatGPlain	     ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿£±Ê¸»ú¤Î°¤¹¤ë¥°¥é¥Õ¥£¥Ã¥¯¥×¥ì¡¼¥ó¤òÊÖ¤¹
62  WIsG0              G0¤Î¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»ú¤«¡©
63  WIsG1              G1¤Î¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»ú¤«¡©
64  WIsG2              G2¤Î¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»ú¤«¡©
65  WIsG3              G3¤Î¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»ú¤«¡©
66  CANNA_mbstowcs     EUC ¤ò¥ï¥¤¥É¥­¥ã¥é¥¯¥¿Ê¸»úÎó¤ËÊÑ´¹
67  CNvW2E             ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¤ò EUC ¤ËÊÑ´¹(¥Á¥§¥Ã¥¯ÉÕ¤­)
68  CANNA_wcstombs     ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¤ò EUC ¤ËÊÑ´¹
69  WSfree	     WString¤Ç³ÎÊݤ·¤¿Îΰè¤ò³«Êü¤¹¤ë
70  WString            EUC ¤ò¥ï¥¤¥É¤ËÊÑ´¹¤·¤Æ malloc ¤Þ¤Ç¤·¤ÆÊÖ¤¹(free ÉÔÍ×)
71  WStringOpen        ¾åµ­´Ø¿ô¤Î½é´ü²½½èÍý
72  WStringClose       ¾åµ­´Ø¿ô¤Î½ªÎ»½èÍý
73  WToupper           °ú¿ô¤Îʸ»ú¤òÂçʸ»ú¤Ë¤¹¤ë
74  WTolower           °ú¿ô¤Îʸ»ú¤ò¾®Ê¸»ú¤Ë¤¹¤ë
75  key2wchar          ¥­¡¼¥Ü¡¼¥ÉÆþÎϤò¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¤Ë¤¹¤ë¡£
76  US2WS              Ushort ¤ò WCHAR_T ¤ËÊÑ´¹¤¹¤ë¡£
77  WS2US              WCHAR_T ¤ò Ushort ¤ËÊÑ´¹¤¹¤ë¡£
78  confirmContext     yc->context ¤¬»È¤¨¤ë¤â¤Î¤«³Îǧ¤¹¤ë
79  makeRkError        Rk ¤Î´Ø¿ô¤Ç¥¨¥é¡¼¤¬¤Ç¤¿¤È¤­¤Î½èÍý¤ò¤¹¤ë¡£
80  canna_alert        ¥á¥Ã¥»¡¼¥¸¤ò Gline ¤Ë½ñ¤¤¤Æ key ¤òÂԤġ£
81
82 */
83
84#if !defined(lint) && !defined(__CODECENTER__)
85static char rcs_id[] = "@(#) 102.1 $Id: util.c 14875 2005-11-12 21:25:31Z bonefish $";
86#endif	/* lint */
87
88#include "canna.h"
89#include <errno.h>
90#include "RK.h"
91#include "RKintern.h"
92#include <fcntl.h>
93
94#ifdef HAVE_WCHAR_OPERATION
95#include <locale.h>
96#if defined(__STDC__) || defined(SVR4)
97#include <limits.h>
98#endif
99#endif
100
101#ifndef MB_LEN_MAX
102#define MB_LEN_MAX 5 /* 5 ¤â¹Ô¤«¤Ê¤¤¤À¤í¤¦¤È¤Ï»×¤¦ */
103#endif
104
105static int wait_anykey_func(uiContext d, KanjiMode mode, int whattodo, int key, int fnum);
106
107/* arraydef
108
109  tmpbuf -- ¤Á¤ç¤Ã¤È²¾¤Ë»È¤ï¤ì¤ë¥Ð¥Ã¥Õ¥¡
110
111 */
112
113/*
114 * Gline ¤ò¥¯¥ê¥¢¤¹¤ë
115 *
116 * °ú¤­¿ô	uiContext
117 * Ìá¤êÃÍ	¤Ê¤·
118 */
119void
120GlineClear(uiContext d)
121{
122  d->kanji_status_return->info |= KanjiGLineInfo;
123  d->kanji_status_return->gline.line = (WCHAR_T *)NULL;
124  d->kanji_status_return->gline.length = 0;
125  d->kanji_status_return->gline.revPos = 0;
126  d->kanji_status_return->gline.revLen = 0;
127}
128
129/* cfuncdef
130
131  Gline2echostr -- °ìÍ÷¹Ô¤ÎÆâÍƤò¤½¤Î¾ì¤Ë°ÜÆ°
132
133 */
134
135inline void
136Gline2echostr(uiContext d)
137{
138  d->kanji_status_return->echoStr =
139    d->kanji_status_return->gline.line;
140  d->kanji_status_return->length =
141    d->kanji_status_return->gline.length;
142  d->kanji_status_return->revPos =
143    d->kanji_status_return->gline.revPos;
144  d->kanji_status_return->revLen =
145    d->kanji_status_return->gline.revLen;
146  GlineClear(d);
147}
148
149void
150echostrClear(uiContext d)
151{
152  d->kanji_status_return->echoStr = (WCHAR_T *)NULL;
153  d->kanji_status_return->length =
154    d->kanji_status_return->revPos = d->kanji_status_return->revLen = 0;
155}
156
157/*
158 * ʸ»úÎ󤫤饳¥é¥àÉý¤ò¼è¤Ã¼êÍè¤ë´Ø¿ô
159 */
160
161inline
162int colwidth(WCHAR_T *s, int len)
163{
164  int ret = 0;
165  WCHAR_T *es = s + len;
166
167  for (; s < es ; s++) {
168    switch (WWhatGPlain(*s)) {
169    case 0:
170    case 2:
171      ret ++;
172      break;
173    case 1:
174    case 3:
175      ret += 2;
176      break;
177    }
178  }
179  return ret;
180}
181
182
183/* cfuncdef
184
185  checkGLineLen -- °ìÍ÷¹Ô¤Ëɽ¼¨¤Ç¤­¤ëŤµ¤ò±Û¤¨¤Æ¤¤¤ë¤«¤ò¥Á¥§¥Ã¥¯
186
187  Ťµ¤¬±Û¤¨¤Æ¤¤¤¿¤é¡¢¥«¡¼¥½¥ëÉôʬ¤Ëɽ¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¡£
188
189 */
190
191int
192checkGLineLen(uiContext d)
193{
194  if (d->kanji_status_return->info & KanjiGLineInfo) {
195    if (colwidth(d->kanji_status_return->gline.line,
196		 d->kanji_status_return->gline.length) > d->ncolumns) {
197      Gline2echostr(d);
198      return -1;
199    }
200  }
201  return 0;
202}
203
204/* cfuncdef
205
206  NothingChanged -- ÆɤߤˤĤ¤¤Æ¤Ï²¿¤âÊѤ¨¤Ê¤¤¤è¤¦¤Ë¤¹¤ë
207
208 */
209
210int
211NothingChanged(uiContext d)
212{
213  d->kanji_status_return->length = -1; /* ÊѤï¤é¤Ê¤¤¡£ */
214  d->kanji_status_return->revPos
215    = d->kanji_status_return->revLen = 0;
216  d->kanji_status_return->info = 0;
217  return 0;
218}
219
220int NothingForGLine(uiContext d)
221{
222  d->kanji_status_return->length = -1; /* ÊѤï¤é¤Ê¤¤¡£ */
223  d->kanji_status_return->revPos
224    = d->kanji_status_return->revLen = 0;
225  return 0;
226}
227
228void
229CannaBeep(void)
230{
231  extern int (*jrBeepFunc) (void);
232
233  if (jrBeepFunc) {
234    jrBeepFunc();
235  }
236}
237
238int
239NothingChangedWithBeep(uiContext d)
240{
241  CannaBeep();
242  return NothingChanged(d);
243}
244
245int
246NothingForGLineWithBeep(uiContext d)
247{
248  CannaBeep();
249  return NothingForGLine(d);
250}
251
252#ifdef SOMEONE_USE_THIS
253/* ï¤â»È¤Ã¤Æ¤¤¤Ê¤¤¤ß¤¿¤¤¡£ */
254Insertable(unsigned char ch)
255{
256  if ((0x20 <= ch && ch <= 0x7f) || (0xa0 <= ch && ch <= 0xff)) {
257    return 1;
258  }
259  else {
260    return 0;
261  }
262}
263#endif /* SOMEONE_USE_THIS */
264
265
266/*
267  extractSimpleYomiString -- yomiContext ¤ÎÆɤßÉôʬ¤À¤±¤ò¼è¤ê½Ð¤¹
268
269  °ú¿ô
270     yc  -- yomiContext
271     s   -- ¼è¤ê½Ð¤¹Àè¤Î¥¢¥É¥ì¥¹
272     e   -- ¤³¤³¤ò±Û¤¨¤Æ¼è¤ê½Ð¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¢¤È¸À¤¦¥¢¥É¥ì¥¹
273     sr  -- ȿžÎΰè¤Î³«»Ï°ÌÃÖ¤òÊÖ¤¹¥¢¥É¥ì¥¹
274     er  -- ȿžÎΰè¤Î½ªÎ»°ÌÃÖ¤òÊÖ¤¹¥¢¥É¥ì¥¹
275     pat -- pointer to an attribute buffer.
276     focused -- indicates yc is focused or not
277 */
278
279inline int
280extractSimpleYomiString(yomiContext yc, WCHAR_T *s, WCHAR_T *e, WCHAR_T **sr, WCHAR_T **er, wcKanjiAttributeInternal *pat, int focused)
281{
282  int len = yc->kEndp - yc->cStartp;
283
284  if (yc->jishu_kEndp) {
285    int len = extractJishuString(yc, s, e, sr, er);
286    char target = focused ?
287      CANNA_ATTR_TARGET_NOTCONVERTED : CANNA_ATTR_CONVERTED;
288    if (pat && pat->sp + len < pat->ep) {
289      char *ap = pat->sp, *ep = ap + len;
290      char *mp1 = ap + (*sr - s), *mp2 = ap + (*er - s);
291      while (ap < mp1) {
292	*ap++ = CANNA_ATTR_INPUT;
293      }
294      while (ap < mp2) {
295	*ap++ = target;
296      }
297      while (ap < ep) {
298	*ap++ = CANNA_ATTR_INPUT;
299      }
300      pat->sp = ap;
301    }
302    return len;
303  }
304
305  if (s + len >= e) {
306    len = (int)(e - s);
307  }
308  WStrncpy(s, yc->kana_buffer + yc->cStartp, len);
309  if (pat && pat->sp + len < pat->ep) {
310    char *ap = pat->sp, *ep = ap + len;
311
312    if (focused) {
313      pat->u.caretpos = (ap - pat->u.attr) + yc->kCurs - yc->cStartp;
314      /* ¾åµ­¤Î·×»»¤Î²òÀâ: ¥­¥ã¥ì¥Ã¥È¤Î°ÌÃ֤ϡ¢º£¤«¤é½ñ¤­¹þ¤ß¤ò¤·¤è¤¦¤È
315	 ¤·¤Æ¤¤¤ë°ÌÃÖ¤«¤é¤ÎÁêÂФǡ¢·×»»¤·¡¢yc->kCurs - yc->cStartp ¤Î°Ì
316	 Ã֤Ǥ¢¤ë¡£ */
317    }
318
319    while (ap < ep) {
320      *ap++ = CANNA_ATTR_INPUT;
321    }
322    pat->sp = ap;
323  }
324  if (cannaconf.ReverseWidely) {
325    *sr = s;
326    *er = s + yc->kCurs - yc->cStartp;
327  }
328  else if (yc->kCurs == yc->kEndp && !yc->right) {
329    *sr = *er = s + yc->kCurs - yc->cStartp;
330  }
331  else {
332    *sr = s + yc->kCurs - yc->cStartp;
333    *er = *sr + 1;
334  }
335  return len;
336}
337
338/*
339  extractKanjiString -- yomiContext ¤Î´Á»ú¸õÊä¤ò¼è¤ê½Ð¤¹
340
341  °ú¿ô
342     yc  -- yomiContext
343     s   -- ¼è¤ê½Ð¤¹Àè¤Î¥¢¥É¥ì¥¹
344     e   -- ¤³¤³¤ò±Û¤¨¤Æ¼è¤ê½Ð¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¢¤È¸À¤¦¥¢¥É¥ì¥¹
345     b   -- ʸÀá¶èÀÚ¤ê¤ò¤¹¤ë¤«¤É¤¦¤«
346     sr  -- ȿžÎΰè¤Î³«»Ï°ÌÃÖ¤òÊÖ¤¹¥¢¥É¥ì¥¹
347     er  -- ȿžÎΰè¤Î½ªÎ»°ÌÃÖ¤òÊÖ¤¹¥¢¥É¥ì¥¹
348     pat -- wcKanjiAttributeInternal structure to store attribute information
349     focused -- focus is on this yc.
350 */
351
352inline int
353extractKanjiString(yomiContext yc, WCHAR_T *s, WCHAR_T *e, int b, WCHAR_T **sr, WCHAR_T **er, wcKanjiAttributeInternal *pat, int focused)
354{
355  WCHAR_T *ss = s;
356  int i, len, nbun;
357
358  nbun = yc->bunlen ? yc->curbun : yc->nbunsetsu;
359
360  for (i = 0 ; i < nbun ; i++) {
361    if (i && b && s < e) {
362      *s++ = (WCHAR_T)' ';
363      if (pat && pat->sp < pat->ep) {
364	*pat->sp++ = CANNA_ATTR_CONVERTED;
365      }
366    }
367    RkwGoTo(yc->context, i);
368    len = RkwGetKanji(yc->context, s, (int)(e - s));
369    if (len < 0) {
370      if (errno == EPIPE) {
371	jrKanjiPipeError();
372      }
373      jrKanjiError = "¥«¥ì¥ó¥È¸õÊä¤ò¼è¤ê½Ð¤»¤Þ¤»¤ó¤Ç¤·¤¿";
374    }
375    else {
376      char curattr;
377      if (i == yc->curbun && !yc->bunlen && focused) { /* focused */
378	*sr = s; *er = s + len;
379	curattr = CANNA_ATTR_TARGET_CONVERTED;
380      }else{
381	curattr = CANNA_ATTR_CONVERTED;
382      }
383      if (pat && pat->sp + len < pat->ep) {
384	char *ap = pat->sp, *ep = ap + len;
385	while (ap < ep) {
386	  *ap++ = curattr;
387	}
388	pat->sp = ap;
389      }
390      s += len;
391    }
392  }
393
394  if (yc->bunlen) {
395    if (i && b && s < e) {
396      *s++ = (WCHAR_T)' ';
397      if (pat && pat->sp < pat->ep) {
398	*pat->sp++ = CANNA_ATTR_CONVERTED;
399      }
400    }
401    len = yc->kEndp - yc->kanjilen;
402    if ((int)(e - s) < len) {
403      len = (int)(e - s);
404    }
405    WStrncpy(s, yc->kana_buffer + yc->kanjilen, len);
406    if (pat && pat->sp + len < pat->ep) {
407      char *ap = pat->sp, *mp = ap + yc->bunlen, *ep = ap + len;
408      char target = focused ?
409	CANNA_ATTR_TARGET_NOTCONVERTED : CANNA_ATTR_CONVERTED;
410      while (ap < mp) {
411	*ap++ = target;
412      }
413      while (ap < ep) {
414	*ap++ = CANNA_ATTR_INPUT;
415      }
416      pat->sp = ap;
417    }
418    if (b) {
419      *er = (*sr = s + yc->bunlen) +
420	((yc->kanjilen + yc->bunlen == yc->kEndp) ? 0 : 1);
421    }
422    else {
423      *sr = s; *er = s + yc->bunlen;
424    }
425    s += len;
426  }
427
428  if (s < e) {
429    *s = (WCHAR_T)'\0';
430  }
431
432  RkwGoTo(yc->context, yc->curbun);
433  return (int)(s - ss);
434}
435
436/*
437  extractYomiString -- yomiContext ¤Îʸ»ú¤ò¼è¤ê½Ð¤¹
438
439  °ú¿ô
440     yc  -- yomiContext
441     s   -- ¼è¤ê½Ð¤¹Àè¤Î¥¢¥É¥ì¥¹
442     e   -- ¤³¤³¤ò±Û¤¨¤Æ¼è¤ê½Ð¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¢¤È¸À¤¦¥¢¥É¥ì¥¹
443     b   -- ʸÀá¶èÀÚ¤ê¤ò¤¹¤ë¤«¤É¤¦¤«
444     sr  -- ȿžÎΰè¤Î³«»Ï°ÌÃÖ¤òÊÖ¤¹¥¢¥É¥ì¥¹
445     er  -- ȿžÎΰè¤Î½ªÎ»°ÌÃÖ¤òÊÖ¤¹¥¢¥É¥ì¥¹
446     pat -- wcKanjiAttributeInternal structure to store attribute information
447     focused -- The yc is now focused.
448 */
449
450inline int
451extractYomiString(yomiContext yc, WCHAR_T *s, WCHAR_T *e, int b, WCHAR_T **sr, WCHAR_T **er, wcKanjiAttributeInternal *pat, int focused)
452{
453  int autoconvert = yc->generalFlags & CANNA_YOMI_CHIKUJI_MODE, len;
454  WCHAR_T *ss = s;
455
456  if (autoconvert) {
457    int OnBunsetsu = ((yc->status & CHIKUJI_ON_BUNSETSU) ||
458		      (yc->nbunsetsu && !(yc->status & CHIKUJI_OVERWRAP)));
459    len = extractKanjiString(yc, s, e, b, sr, er, pat, focused && OnBunsetsu);
460    s += len;
461    if (yc->kEndp - yc->cStartp > 0) {
462      WCHAR_T *ssr, *eer;
463
464      if (b && len && s < e) {
465	*s++ = (WCHAR_T)' ';
466	if (pat && pat->sp < pat->ep) {
467	  *pat->sp++ = CANNA_ATTR_CONVERTED;
468	}
469      }
470      len = extractSimpleYomiString(yc, s, e, &ssr, &eer, pat,
471				    focused && !OnBunsetsu);
472/* ºÇ¸å¤Î !OnBunsetsu ¤Ã¤Æ¤È¤³¤í¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë¤·¤¿Êý¤¬É½¼¨¤¬¥­¥ã¥ì¥Ã¥È
473   ¤Ä¤­¤Ç¡¢È¿Å¾Ê¸À᤬½Ð¤Æ¤â¥­¥ã¥ì¥Ã¥È¤¬¥«¡¼¥½¥ë¥Ý¥¸¥·¥ç¥ó¤Ç¤¢¤ë¤³¤È¤¬¤ï
474   ¤«¤ê¤ä¤¹¤¤¤Î¤À¤¬¡¢OVERWRAP ¥Õ¥é¥°¤¬¤Á¤ã¤ó¤È¥â¡¼¥ÉÅù¤È¤ÎÂбþ¤¬¤µ¤ì¤Æ¤¤
475   ¤Ê¤¤¤è¤¦¤Ê¤Î¤Ç¡¢¤È¤ê¤¢¤¨¤º¾åµ­¤Î¤Þ¤Þ¤È¤¹¤ë¡£
476				    (!yc->nbunsetsu ||
477				     (yc->status & CHIKUJI_OVERWRAP)));
478 */
479      s += len;
480      if (!OnBunsetsu) {
481	*sr = ssr; *er = eer;
482	if (pat && focused) {
483	  pat->u.caretpos = pat->sp - pat->u.attr - (s - *sr);
484	  /* ¾åµ­¤Î·×»»¤Î²òÀâ: ¥­¥ã¥ì¥Ã¥È°ÌÃ֤ϡ¢º£¸å¥¢¥È¥ê¥Ó¥å¡¼¥È
485	     ¤ò½ñ¤­¹þ¤à°ÌÃÖ¤«¤éÌá¤Ã¤¿°ÌÃ֤ˤ¢¤ë¡£¤É¤Î¤¯¤é¤¤Ìá¤ë¤«¤È
486	     ¸À¤¦¤È¡¢¼¡¤Ëʸ»úÎó¤ò½ñ¤­¹þ¤à°ÌÃÖ¤«¤é¡¢È¿Å¾³«»Ï°ÌÃÖ¤Þ¤Ç
487	     Ìá¤ëÎ̤À¤±Ìá¤ë */
488	}
489      }
490    }
491  }
492  else if (yc->nbunsetsu) { /* ñ¸õÊä¥â¡¼¥É */
493    len = extractKanjiString(yc, s, e, b, sr, er, pat, focused);
494    s += len;
495  }
496  else {
497    len = extractSimpleYomiString(yc, s, e, sr, er, pat, focused);
498    s += len;
499  }
500  if (s < e) {
501    *s = (WCHAR_T)'\0';
502  }
503  return (int)(s - ss);
504}
505
506inline
507int extractString(WCHAR_T *str, WCHAR_T *s, WCHAR_T *e)
508{
509  int len;
510
511  len = WStrlen(str);
512  if (s + len < e) {
513    WStrcpy(s, str);
514    return len;
515  }
516  else {
517    WStrncpy(s, str, (int)(e - s));
518    return (int)(e - s);
519  }
520}
521
522/*
523  extractTanString -- tanContext ¤Îʸ»ú¤ò¼è¤ê½Ð¤¹
524
525  °ú¿ô
526     tan -- tanContext
527     s   -- ¼è¤ê½Ð¤¹Àè¤Î¥¢¥É¥ì¥¹
528     e   -- ¤³¤³¤ò±Û¤¨¤Æ¼è¤ê½Ð¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¢¤È¸À¤¦¥¢¥É¥ì¥¹
529 */
530
531int
532extractTanString(tanContext tan, WCHAR_T *s, WCHAR_T *e)
533{
534  return extractString(tan->kanji, s, e);
535}
536
537/*
538  extractTanYomi -- tanContext ¤Îʸ»ú¤ò¼è¤ê½Ð¤¹
539
540  °ú¿ô
541     tan -- tanContext
542     s   -- ¼è¤ê½Ð¤¹Àè¤Î¥¢¥É¥ì¥¹
543     e   -- ¤³¤³¤ò±Û¤¨¤Æ¼è¤ê½Ð¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¢¤È¸À¤¦¥¢¥É¥ì¥¹
544 */
545
546int
547extractTanYomi(tanContext tan, WCHAR_T *s, WCHAR_T *e)
548{
549  return extractString(tan->yomi, s, e);
550}
551
552/*
553  extractTanRomaji -- tanContext ¤Îʸ»ú¤ò¼è¤ê½Ð¤¹
554
555  °ú¿ô
556     tan -- tanContext
557     s   -- ¼è¤ê½Ð¤¹Àè¤Î¥¢¥É¥ì¥¹
558     e   -- ¤³¤³¤ò±Û¤¨¤Æ¼è¤ê½Ð¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¢¤È¸À¤¦¥¢¥É¥ì¥¹
559 */
560
561int
562extractTanRomaji(tanContext tan, WCHAR_T *s, WCHAR_T *e)
563{
564  return extractString(tan->roma, s, e);
565}
566
567void
568makeKanjiStatusReturn(uiContext d, yomiContext yc)
569{
570  int len;
571  WCHAR_T *s = d->genbuf, *e = s + ROMEBUFSIZE, *sr, *er, *sk, *ek;
572  tanContext tan = (tanContext)yc;
573  long truecaret = -1;
574
575  if (d->attr) {
576    d->attr->sp = d->attr->u.attr;
577    d->attr->ep = d->attr->u.attr + d->attr->len;
578  }
579
580  /* ºÇ½é¤ÏÊÑ´¹¤µ¤ì¤Æ¤¤¤ëÉôʬ¤ò¼è¤ê½Ð¤¹ */
581  while (tan->left) {
582    tan = tan->left;
583  }
584
585  while (tan) {
586    if (d->attr) d->attr->u.caretpos = -1;
587    switch (tan->id) {
588    case TAN_CONTEXT:
589      len = extractTanString(tan, s, e);
590      sk = s; ek = s + len;
591      if (d->attr &&
592	  d->attr->sp + len < d->attr->ep) {
593	char *ap = d->attr->sp, *ep = ap + len;
594	char curattr =
595	  ((mode_context)tan == (mode_context)yc) ?
596	    CANNA_ATTR_TARGET_CONVERTED : CANNA_ATTR_CONVERTED;
597	for (; ap < ep ; ap++) {
598	  *ap = curattr;
599	}
600	d->attr->sp = ap;
601      }
602      break;
603    case YOMI_CONTEXT:
604      len = extractYomiString((yomiContext)tan, s, e, cannaconf.BunsetsuKugiri,
605			      &sk, &ek, d->attr,
606			      (mode_context)tan == (mode_context)yc);
607      break;
608    default:
609      break;
610    }
611
612    if ((mode_context)tan == (mode_context)yc) {
613      sr = sk;
614      er = ek;
615      if (d->attr) truecaret = d->attr->u.caretpos;
616    }
617    s += len;
618    tan = tan->right;
619    if (cannaconf.BunsetsuKugiri && tan && s < e) {
620      *s++ = (WCHAR_T)' ';
621      if (d->attr && d->attr->sp < d->attr->ep) {
622	*d->attr->sp++ = CANNA_ATTR_CONVERTED;
623      }
624    }
625  }
626
627  if (s < e) {
628    *s = (WCHAR_T)'\0';
629  }
630
631  d->kanji_status_return->length = (int)(s - d->genbuf);
632  d->kanji_status_return->echoStr = d->genbuf;
633  d->kanji_status_return->revPos = (int)(sr - d->genbuf);
634  d->kanji_status_return->revLen = (int)(er - sr);
635  if (d->attr) {
636    d->attr->u.caretpos = truecaret;
637    if (d->kanji_status_return->length < d->attr->len) {
638      d->attr->u.attr[d->kanji_status_return->length] = '\0';
639    }
640    d->kanji_status_return->info |= KanjiAttributeInfo;
641  }
642}
643
644#ifdef WIN
645#define MESSBUFSIZE 128
646#else
647#define MESSBUFSIZE 256
648#endif
649
650/*
651 * ¥ê¥Ð¡¼¥¹¤Ê¤·¤Î¥á¥Ã¥»¡¼¥¸¤ò¥¬¥¤¥É¥é¥¤¥ó¤Ëɽ¼¨¤¹¤ë
652 * ¼¡¤ÎÆþÎϤ¬¤¢¤Ã¤¿¤È¤­¤Ë¾Ã¤¨¤ë¤è¤¦¤Ë¥Õ¥é¥°¤òÀßÄꤹ¤ë
653 */
654void
655makeGLineMessage(uiContext d, WCHAR_T *msg, int sz)
656{
657  static WCHAR_T messbuf[MESSBUFSIZE];
658  int len = sz < MESSBUFSIZE ? sz : MESSBUFSIZE - 1;
659
660  WStrncpy(messbuf, msg, len);
661  messbuf[len] = (WCHAR_T)0;
662  d->kanji_status_return->gline.line = messbuf;
663  d->kanji_status_return->gline.length = len;
664  d->kanji_status_return->gline.revPos = 0;
665  d->kanji_status_return->gline.revLen = 0;
666  d->kanji_status_return->info |= KanjiGLineInfo;
667
668  d->flags &= ~PCG_RECOGNIZED;
669  d->flags |= PLEASE_CLEAR_GLINE;
670  checkGLineLen(d);
671}
672
673void
674makeGLineMessageFromString(uiContext d, char *msg)
675{
676  int len;
677
678  len = MBstowcs(d->genbuf, msg, ROMEBUFSIZE);
679  makeGLineMessage(d, d->genbuf, len);
680}
681
682int setWStrings(WCHAR_T **ws, char **s, int sz)
683{
684  int f = sz;
685
686  for (; (f && sz) || (!f && *s); ws++, s++, sz--) {
687    *ws = WString(*s);
688    if (!*ws) {
689      return NG;
690    }
691  }
692  return 0;
693}
694
695#ifdef DEBUG
696dbg_msg(char *fmt, int x, int y, int z)
697{
698  if (iroha_debug) {
699    fprintf(stderr, fmt, x, y, z);
700  }
701}
702
703checkModec(uiContext d)
704{
705  coreContext c;
706  struct callback *cb;
707  int depth = 0, cbDepth = 0;
708  int callbacks = 0;
709
710  for (c = (coreContext)d->modec ; c ; c = (coreContext)c->next)
711    depth++;
712  for (cb = d->cb ; cb ; cb = cb->next) {
713    int i;
714
715    cbDepth++;
716    for (i = 0 ; i < 4 ; i++) {
717      callbacks <<= 1;
718      if (cb->func[i]) {
719	callbacks++;
720      }
721    }
722  }
723  if (depth != cbDepth) {
724    fprintf(stderr, "¢£¢£¢£¢£¢£¡ª¡ª¡ª¿¼¤µ¤¬°ã¤¦¤¾¡ª¡ª¡ª¢£¢£¢£¢£¢£\n");
725  }
726  debug_message("\242\243\40\277\274\244\265: d->modec:%d d->cb:%d callbacks:0x%08x ",
727		depth, cbDepth, callbacks);
728                /* ¢£ ¿¼¤µ */
729  debug_message("EXIT_CALLBACK = 0x%x\n", d->cb->func[EXIT_CALLBACK],0,0);
730  {
731    extern KanjiModeRec yomi_mode;
732    if (d->current_mode == &yomi_mode) {
733      yomiContext yc = (yomiContext)d->modec;
734      if (yc->kana_buffer[yc->kEndp]) {
735        fprintf(stderr, "¢£¢£¢£¢£¢£ ¥«¥Ê¥Ð¥Ã¥Õ¥¡¤Ë¥´¥ß¤¬Æþ¤Ã¤Æ¤¤¤ë¤¾¡ª\n");
736      }
737    }
738  }
739}
740
741static char pbufstr[] = " o|do?b%";
742
743showRomeStruct(unsigned int dpy, unsigned int win)
744{
745  uiContext d, keyToContext();
746  extern defaultContext;
747  static int n = 0;
748  int i;
749  char buf[1024];
750
751  n++;
752  fprintf(stderr, "\n¡Ú¥Ç¥Ð¥°¥á¥Ã¥»¡¼¥¸(%d)¡Û\n", n);
753  d = keyToContext((unsigned int)dpy, (unsigned int)win);
754  fprintf(stderr, "buffer(0x%x), bytes(%d)\n",
755	  d->buffer_return, d->n_buffer);
756  fprintf(stderr, "nbytes(%d), ch(0x%x)\n", d->nbytes, d->ch);
757  fprintf(stderr, "¥â¡¼¥É: %d\n", ((coreContext)d->modec)->minorMode);
758  /* ¥³¥ó¥Æ¥¯¥¹¥È */
759  fprintf(stderr, "¥³¥ó¥Æ¥¯¥¹¥È(%d)\n", d->contextCache);
760  fprintf(stderr, "¥Ç¥Õ¥©¥ë¥È¥³¥ó¥Æ¥¯¥¹¥È(%d)\n", defaultContext);
761
762  /* ¥í¡¼¥Þ»ú¤«¤Ê´ØÏ¢ */
763  if (((coreContext)d->modec)->id == YOMI_CONTEXT) {
764    yomiContext yc = (yomiContext)d->modec;
765
766    fprintf(stderr, "r:       Start(%d), Cursor(%d), End(%d)\n",
767	    yc->rStartp, yc->rCurs, yc->rEndp);
768    fprintf(stderr, "k: ̤ÊÑ´¹Start(%d), Cursor(%d), End(%d)\n",
769	    yc->kRStartp, yc->kCurs, yc->kEndp);
770    WStrncpy(buf, yc->romaji_buffer, yc->rEndp);
771    buf[yc->rEndp] = '\0';
772    fprintf(stderr, "romaji_buffer(%s)\n", buf);
773    fprintf(stderr, "romaji_attrib(");
774    for (i = 0 ; i <= yc->rEndp ; i++) {
775      fprintf(stderr, "%1x", yc->rAttr[i]);
776    }
777    fprintf(stderr, ")\n");
778    fprintf(stderr, "romaji_pointr(");
779    for (i = 0 ; i <= yc->rEndp ; i++) {
780      int n = 0;
781      if (i == yc->rStartp)
782	n |= 1;
783      if (i == yc->rCurs)
784	n |= 2;
785      if (i == yc->rEndp)
786	n |= 4;
787      fprintf(stderr, "%c", pbufstr[n]);
788    }
789    fprintf(stderr, ")\n");
790    WStrncpy(buf, yc->kana_buffer, yc->kEndp);
791    buf[yc->kEndp] = '\0';
792    fprintf(stderr, "kana_buffer(%s)\n", buf);
793    fprintf(stderr, "kana_attrib(");
794    for (i = 0 ; i <= yc->kEndp ; i++) {
795      fprintf(stderr, "%1x", yc->kAttr[i]);
796    }
797    fprintf(stderr, ")\n");
798    fprintf(stderr, "kana_pointr(");
799    for (i = 0 ; i <= yc->kEndp ; i++) {
800      int n = 0;
801      if (i == yc->kRStartp)
802	n |= 1;
803      if (i == yc->kCurs)
804	n |= 2;
805      if (i == yc->kEndp)
806	n |= 4;
807      fprintf(stderr, "%c", pbufstr[n]);
808    }
809    fprintf(stderr, ")\n");
810    fprintf(stderr, "\n");
811  }
812/*  RkPrintDic(0, "kon"); */
813}
814#endif /* DEBUG */
815
816extern char *jrKanjiError;
817
818int NoMoreMemory(void)
819{
820  jrKanjiError = "\245\341\245\342\245\352\244\254\311\324\302\255\244\267\244\306\244\244\244\336\244\271\241\243";
821                /* ¥á¥â¥ê¤¬ÉÔ­¤·¤Æ¤¤¤Þ¤¹¡£ */
822  return NG;
823}
824
825int GLineNGReturn(uiContext d)
826{
827  int len;
828  len = MBstowcs(d->genbuf, jrKanjiError, ROMEBUFSIZE);
829  makeGLineMessage(d, d->genbuf, len);
830  currentModeInfo(d);
831
832  return(0);
833}
834
835int GLineNGReturnFI(uiContext d)
836{
837  popForIchiranMode(d);
838  popCallback(d);
839  GLineNGReturn(d);
840  return(0);
841}
842
843#ifdef WIN
844
845specialfunc(uiContext d, int fn)
846{
847  static WCHAR_T fnbuf[2];
848
849  fnbuf[0] = fn;
850  d->kanji_status_return->echoStr = fnbuf;
851  d->kanji_status_return->length = 0;
852  d->kanji_status_return->info = KanjiSpecialFuncInfo | KanjiEmptyInfo;
853  return 0;
854}
855
856#endif /* WIN */
857
858#ifndef NO_EXTEND_MENU
859
860int GLineNGReturnTK(uiContext d)
861{
862  extern void popTourokuMode (uiContext);
863
864  popCallback(d);
865  GLineNGReturn(d);
866  return(0);
867}
868
869#endif /* NO_EXTEND_MENU */
870
871#ifdef USE_COPY_ATTRIBUTE
872copyAttribute(BYTE *dest, BYTE *src, int n)
873{
874  if (dest > src && dest < src + n) {
875    dest += n;
876    src += n;
877    while (n-- > 0) {
878      *--dest = *--src;
879    }
880  }
881  else {
882    while (n-- > 0) {
883      *dest++ = *src++;
884    }
885  }
886}
887#endif
888
889#ifdef DEBUG_ALLOC
890int fail_malloc = 0;
891
892#undef malloc
893
894char *
895debug_malloc(int n)
896{
897  if (fail_malloc)
898    return (char *)0;
899  else
900    return malloc(n);
901}
902#endif /* DEBUG_ALLOC */
903
904/*
905 * ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¥ª¥Ú¥ì¡¼¥·¥ç¥ó
906 *
907 */
908
909static int wchar_type; /* ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¤Î¥¿¥¤¥×(²¼¤ò¸«¤è) */
910
911#define CANNA_WCTYPE_16 0  /* 16¥Ó¥Ã¥Èɽ¸½ */
912#define CANNA_WCTYPE_32 1  /* 32¥Ó¥Ã¥Èɽ¸½ */
913#define CANNA_WCTYPE_OT 99 /* ¤½¤Î¾¤Îɽ¸½ */
914
915/*
916 WCinit() -- ¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¤È¤·¤Æ¤É¤ì¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«¤ò³Îǧ¤¹¤ë
917
918        ¤³¤Î´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤Þ¤¨¤Ë setlocale ¤¬¤Ê¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
919 */
920
921#define TYPE16A 0x0000a4a2
922#define TYPE32A 0x30001222
923
924int
925WCinit(void)
926{
927#if defined(HAVE_WCHAR_OPERATION) && !defined(WIN)
928  extern int locale_insufficient;
929  WCHAR_T wc[24];
930  char *a = "\244\242"; /* ¤¢ */ /* 0xa4a2 */
931
932  locale_insufficient = 0;
933  if (mbstowcs(wc, a, sizeof(wc) / sizeof(WCHAR_T)) != 1) {
934    /* ¿ʬ setlocale ¤¬¤Ê¤µ¤ì¤Æ¤¤¤Ê¤¤ */
935    setlocale(LC_CTYPE, "");
936    if (mbstowcs(wc, a, sizeof(wc) / sizeof(WCHAR_T)) != 1) {
937      setlocale(LC_CTYPE, JAPANESE_LOCALE);
938      if (mbstowcs(wc, a, sizeof(wc) / sizeof(WCHAR_T)) != 1) {
939	locale_insufficient = 1;
940	return -1;
941      }
942    }
943  }
944  switch (wc[0]) {
945  case TYPE16A:
946    wchar_type = CANNA_WCTYPE_16;
947    break;
948  case TYPE32A:
949    wchar_type = CANNA_WCTYPE_32;
950    break;
951  default:
952    wchar_type = CANNA_WCTYPE_OT;
953    break;
954  }
955#else /* !HAVE_WCHAR_OPERATION || WIN */
956# ifdef WCHAR16
957
958  wchar_type = CANNA_WCTYPE_16;
959
960# else /* !WCHAR16 */
961
962  if (sizeof(WCHAR_T) == 2) {
963    /* NOTREACHED */
964    wchar_type = CANNA_WCTYPE_16;
965  }
966  else {
967    /* NOTREACHED */
968    wchar_type = CANNA_WCTYPE_32;
969  }
970
971# endif /* !WCHAR16 */
972#endif /* !HAVE_WCHAR_OPERATION || WIN */
973
974  return 0;
975}
976
977
978int
979WStrlen(WCHAR_T *ws)
980{
981  int res = 0;
982  while (*ws++) {
983    res++;
984  }
985  return res;
986}
987
988WCHAR_T *
989WStrcpy(WCHAR_T *ws1, WCHAR_T *ws2)
990{
991WCHAR_T *ws;
992int len;
993
994	ws = ws2;
995	while (*ws) {
996		ws++;
997	}
998
999	len =  ws - ws2;
1000	memmove(ws1, ws2, len * sizeof(WCHAR_T));
1001	ws1[len] = (WCHAR_T)0;
1002	return ws1;
1003}
1004
1005WCHAR_T *
1006WStrncpy(WCHAR_T *ws1, WCHAR_T *ws2, int cnt)
1007{
1008	if  (!ws2){
1009		return((WCHAR_T *)0);
1010	}else{
1011		return (WCHAR_T *)memmove(ws1, ws2, cnt * sizeof(WCHAR_T));
1012	}
1013}
1014
1015WCHAR_T *
1016WStraddbcpy(WCHAR_T *ws1, WCHAR_T *ws2, int cnt)
1017{
1018  WCHAR_T *strp = ws1, *endp = ws1 + cnt - 1;
1019
1020  while (*ws2 != (WCHAR_T)'\0' && ws1 < endp) {
1021    if (*ws2 == (WCHAR_T)' ' || *ws2 == (WCHAR_T)'\t' || *ws2 == (WCHAR_T)'\\')
1022      *ws1++ = (WCHAR_T)'\\';
1023    *ws1++ = *ws2++;
1024  }
1025  if (ws1 == endp) {
1026    ws1--;
1027  }
1028  *ws1 = (WCHAR_T)'\0';
1029  return(strp);
1030}
1031
1032WCHAR_T *
1033WStrcat(WCHAR_T *ws1, WCHAR_T *ws2)
1034{
1035  WCHAR_T *ws;
1036
1037  ws = ws1;
1038  while (*ws) {
1039    ws++;
1040  }
1041  WStrcpy(ws, ws2);
1042  return ws1;
1043}
1044
1045int
1046WStrcmp(WCHAR_T *w1, WCHAR_T *w2)
1047{
1048  while (*w1 && *w1 == *w2) {
1049    w1++;
1050    w2++;
1051  }
1052  return(*w1 - *w2);
1053}
1054
1055int
1056WStrncmp(WCHAR_T *w1, WCHAR_T *w2, int n)
1057{
1058  if (n == 0) return(0);
1059  while (--n && *w1 && *w1 == *w2) {
1060    w1++;
1061    w2++;
1062  }
1063  return *w1 - *w2;
1064}
1065
1066/* WWhatGPlain -- ¤É¤Î¥°¥é¥Õ¥£¥Ã¥¯¥×¥ì¡¼¥ó¤Îʸ»ú¤«¡©
1067
1068   Ìá¤êÃÍ:
1069     0 : G0 ASCII
1070     1 : G1 ´Á»ú(JISX0208)
1071     2 : G2 Ⱦ³Ñ¥«¥¿¥«¥Ê(JISX0201)
1072     3 : G3 ³°»ú(Êä½õ´Á»ú JISX0212)
1073 */
1074
1075int
1076WWhatGPlain(WCHAR_T wc)
1077{
1078  static char plain[4] = {0, 2, 3, 1};
1079
1080  switch (wchar_type) {
1081  case CANNA_WCTYPE_16:
1082    switch (((unsigned long)wc) & 0x8080) {
1083    case 0x0000:
1084      return 0;
1085    case 0x8080:
1086      return 1;
1087    case 0x0080:
1088      return 2;
1089    case 0x8000:
1090      return 3;
1091    }
1092    break;
1093  case CANNA_WCTYPE_32:
1094    return plain[(((unsigned long)wc) >> 28) & 3];
1095  default:
1096    return 0; /* ¤É¤¦¤·¤è¤¦ */
1097  }
1098  /* NOTREACHED */
1099}
1100
1101int
1102WIsG0(WCHAR_T wc)
1103{
1104  return (WWhatGPlain(wc) == 0);
1105}
1106
1107int
1108WIsG1(WCHAR_T wc)
1109{
1110  return (WWhatGPlain(wc) == 1);
1111}
1112
1113int
1114WIsG2(WCHAR_T wc)
1115{
1116  return (WWhatGPlain(wc) == 2);
1117}
1118
1119int
1120WIsG3(WCHAR_T wc)
1121{
1122  return (WWhatGPlain(wc) == 3);
1123}
1124
1125#ifndef HAVE_WCHAR_OPERATION
1126int
1127CANNA_mbstowcs(WCHAR_T *dest, char *src, int destlen)
1128{
1129  register int i, j;
1130  register unsigned ec;
1131
1132    for (i = 0, j = 0 ;
1133	 (ec = (unsigned)(unsigned char)src[i]) != 0 && j < destlen ; i++) {
1134      if (ec & 0x80) {
1135	switch (ec) {
1136	case 0x8e: /* SS2 */
1137	  dest[j++] = (WCHAR_T)(0x80 | ((unsigned)src[++i] & 0x7f));
1138	  break;
1139	case 0x8f: /* SS3 */
1140	  dest[j++] = (WCHAR_T)(0x8000
1141				| (((unsigned)src[i + 1] & 0x7f) << 8)
1142				| ((unsigned)src[i + 2] & 0x7f));
1143	  i += 2;
1144	  break;
1145	default:
1146	  dest[j++] = (WCHAR_T)(0x8080 | (((unsigned)src[i] & 0x7f) << 8)
1147				| ((unsigned)src[i + 1] & 0x7f));
1148	  i++;
1149	  break;
1150	}
1151      }else{
1152	dest[j++] = (WCHAR_T)ec;
1153      }
1154    }
1155    if (j < destlen)
1156      dest[j] = (WCHAR_T)0;
1157    return j;
1158}
1159
1160#endif /* HAVE_WCHAR_OPERATION */
1161
1162int
1163CNvW2E(WCHAR_T *src, int srclen, char *dest, int destlen)
1164{
1165	int i, j;
1166
1167//  case CANNA_WCTYPE_16:
1168    for (i = 0, j = 0 ; i < srclen && j + 2 < destlen ; i++) {
1169      WCHAR_T wc = src[i];
1170      switch (wc & 0x8080) {
1171      case 0:
1172	/* ASCII */
1173	dest[j++] = (char)((unsigned)wc & 0x7f);
1174	break;
1175      case 0x0080:
1176	/* Ⱦ³Ñ¥«¥Ê */
1177	dest[j++] = (char)0x8e; /* SS2 */
1178	dest[j++] = (char)(((unsigned)wc & 0x7f) | 0x80);
1179	break;
1180      case 0x8000:
1181	/* ³°»ú */
1182	dest[j++] = (char)0x8f; /* SS3 */
1183	dest[j++] = (char)((((unsigned)wc & 0x7f00) >> 8) | 0x80);
1184	dest[j++] = (char)(((unsigned)wc & 0x7f) | 0x80);
1185	break;
1186      case 0x8080:
1187	/* ´Á»ú */
1188	dest[j++] = (char)((((unsigned)wc & 0x7f00) >> 8) | 0x80);
1189	dest[j++] = (char)(((unsigned)wc & 0x7f) | 0x80);
1190	break;
1191      }
1192    }
1193    dest[j] = (char)0;
1194    return j;
1195}
1196
1197#ifndef HAVE_WCHAR_OPERATION
1198int
1199CANNA_wcstombs(char *dest, WCHAR_T *src, int destlen)
1200{
1201  return CNvW2E(src, WStrlen(src), dest, destlen);
1202}
1203
1204#endif /* HAVE_WCHAR_OPERATION */
1205
1206
1207/* cfuncdef
1208
1209  WString -- EUC¤«¤é¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¤Ø¤Î¥Þ¥Ã¥Ô¥ó¥°¤ª¤è¤Ó malloc
1210
1211  WString ¤Ï°ú¿ô¤Îʸ»úÎó¤ò¥ï¥¤¥É¥­¥ã¥é¥¯¥¿¤ËÊÑ´¹¤·¡¢¤½¤Îʸ»úÎ󤬼ý¤Þ¤ë
1212  ¤À¤±¤Î¥á¥â¥ê¤ò malloc ¤·¡¢¤½¤Îʸ»úÎó¤òǼ¤áÊÖ¤¹¡£
1213
1214  ÍøÍѼԤϤ³¤Î´Ø¿ô¤ÇÆÀ¤¿¥Ý¥¤¥ó¥¿¤ò free ¤¹¤ëɬÍפϤ¢¤Þ¤ê¤Ê¤¤¡£
1215
1216  ¤¹¤Ê¤ï¤Á¡¢¤³¤Î´Ø¿ô¤ÇÆÀ¤¿¥á¥â¥ê¤Ï¸å¤Ç WStringClose ¤ò¸Æ¤Ó½Ð¤·¤¿¤È¤­¤Ë
1217  free ¤µ¤ì¤ë¡£
1218
1219  ¤½¤¦¤¤¤¦»ö¾ð¤Ê¤Î¤Ç¤³¤Î´Ø¿ô¤òÉÑÈˤ˸ƤӽФ·¤Æ¤Ï¤¤¤±¤Ê¤¤¡£º£¤Þ¤ÇEUC¤Ç
1220  ½é´üÄêµÁ¤Ç¤­¤Æ¤¤¤¿Ê¸»úÎó¤Ê¤É¤Ëα¤á¤ë¤Ù¤­¤Ç¤¢¤ë¡£
1221
1222  ¤³¤Îµ¡Ç½¤ò»È¤¦¿Í¤ÏºÇ½é¤Ë WStringOpen ¤ò¸Æ¤Ó½Ð¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¬¡¢
1223  ¥æ¡¼¥¶¥¤¥ó¥¿¥Õ¥§¡¼¥¹¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¥·¥¹¥Æ¥à¤¬¼«Æ°Åª¤ËÆɤó¤Ç¤¯¤ì¤ë¤Î
1224  ¤Ç¤½¤ÎɬÍפϤʤ¤¡£
1225
1226 */
1227
1228static WCHAR_T **wsmemories = (WCHAR_T **)NULL;
1229static int nwsmemories = 0;
1230
1231#define WSBLOCKSIZE 128
1232
1233int
1234WStringOpen(void)
1235{
1236  return 0;
1237}
1238
1239WCHAR_T *
1240WString(char *s)
1241{
1242  int i, len;
1243  WCHAR_T *temp, **wm;
1244
1245  if (wsmemories == (WCHAR_T **)NULL) {
1246    nwsmemories = WSBLOCKSIZE;
1247    if (!(wsmemories = (WCHAR_T **)calloc(nwsmemories, sizeof(WCHAR_T *))))
1248      return((WCHAR_T *)0) ;
1249    /* calloc ¤µ¤ì¤¿¥á¥â¥ê¤Ï¥¯¥ê¥¢¤µ¤ì¤Æ¤¤¤ë */
1250  }
1251
1252  for (i = 0 ; i < nwsmemories && wsmemories[i] ;) {
1253    i++;
1254  }
1255
1256  if (i == nwsmemories) { /* »È¤¤Àڤ俤ΤÇÁý¤ä¤¹ */
1257    if (!(wm = (WCHAR_T **)realloc(wsmemories,
1258				 (nwsmemories + WSBLOCKSIZE)
1259				 * sizeof(WCHAR_T *))))
1260      return((WCHAR_T *)0);
1261    wsmemories = wm;
1262    for (; i < nwsmemories + WSBLOCKSIZE ; i++)
1263      wsmemories[i] = (WCHAR_T *)0;
1264    i = nwsmemories;
1265    nwsmemories += WSBLOCKSIZE;
1266  }
1267
1268  /* ¤È¤ê¤¢¤¨¤ºÂ礭¤¯¤È¤Ã¤Æ¤ª¤¤¤Æ¡¢¤½¤Î¥µ¥¤¥º¤ò¸«¤ÆÃúÅ٤Υµ¥¤¥º¤Ë
1269     ľ¤·¤ÆÊÖ¤¹ */
1270
1271  len = strlen(s);
1272  if (!(temp = (WCHAR_T *)malloc((len + 1) * WCHARSIZE)))
1273    return((WCHAR_T *)0);
1274  len = MBstowcs(temp, s, len + 1);
1275  if (!(wsmemories[i] = (WCHAR_T *)malloc((len + 1) * WCHARSIZE))) {
1276    free(temp);
1277    return((WCHAR_T *) 0);
1278  }
1279  WStrncpy(wsmemories[i], temp, len);
1280  wsmemories[i][len] = (WCHAR_T)0;
1281  free(temp);
1282  return(wsmemories[i]);
1283}
1284
1285void
1286WStringClose(void)
1287{
1288  int i;
1289
1290  for (i = 0 ; i < nwsmemories ; i++)
1291    if (wsmemories[i])
1292      free(wsmemories[i]);
1293  free(wsmemories);
1294  wsmemories = (WCHAR_T **)0;
1295  nwsmemories = 0;
1296}
1297
1298int WSfree(WCHAR_T *s)
1299{
1300  int	i;
1301  WCHAR_T **t;
1302
1303  for (t = wsmemories, i = nwsmemories; s != *t && i;) {
1304    t++;
1305    i--;
1306  }
1307  if (s != *t)
1308    return(-1);
1309  free(*t);
1310  *t = (WCHAR_T *) 0;
1311  return(0);
1312}
1313
1314/*
1315 generalReplace -- ¥«¥Ê¥Ð¥Ã¥Õ¥¡¤Ë¤â¥í¡¼¥Þ»ú¥Ð¥Ã¥Õ¥¡¤Ë¤â»È¤¨¤ëÃÖ´¹¥ë¡¼¥Á¥ó
1316
1317  ¤³¤ÎÃÖ´¹¥ë¡¼¥Á¥ó¤Ïʸ»úÎó¤Î¥á¥â¥ê¾å¤ÎÃÖ´¹¤ò¹Ô¤¦¤¿¤á¤Î¥é¥¤¥Ö¥é¥ê¥ë¡¼¥Á
1318  ¥ó¤Ç¤¢¤ë¡£¥á¥â¥ê¾å¤Ëʸ»úÎó¤òÊÝ»ý¤·¤Æ¤ª¤¯»ÅÁȤߤϼ¡¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë
1319  ¤â¤Î¤È¤¹¤ë¡£
1320
1321    ¡¦Ê¸»úÎóÍѤΥХåե¡
1322    ¡¦Ê¸»ú¤Î°À­ÍѤΥХåե¡
1323    ¡¦¥«¡¼¥½¥ë(¥¤¥ó¥Ç¥Ã¥¯¥¹(¥Ý¥¤¥ó¥¿¤Ç¤Ï¤Ê¤¤))
1324    ¡¦Ê¸»úÎó¤Î½ª¤ï¤ê¤ò»Ø¤¹¥¤¥ó¥Ç¥Ã¥¯¥¹
1325    ¡¦É¬¤º¥«¡¼¥½¥ë¤è¤êº¸¤Ë¸ºß¤¹¤ë¥¤¥ó¥Ç¥Ã¥¯¥¹(̤ÊÑ´¹Ê¸»ú¤Ø¤Î¥¤¥ó¥Ç¥Ã
1326      ¥¯¥¹¤Ë»È¤Ã¤¿¤ê¤¹¤ë)
1327
1328  ¾åµ­¤Ë¼¨¤µ¤ì¤ë¥Ð¥Ã¥Õ¥¡¾å¤Î¥«¡¼¥½¥ë¤ÎÁ°¤«¸å¤í¤Î»ØÄꤵ¤ì¤¿Ä¹¤µ¤Îʸ»úÎó
1329  ¤òÊ̤˻ØÄꤵ¤ì¤ëʸ»úÎó¤ÇÃÖ¤­´¹¤¨¤ë½èÍý¤ò¤¹¤ë¡£
1330
1331  ¥È¡¼¥¿¥ë¤Î¥Ð¥¤¥È¿ô¤¬ÊѲ½¤¹¤ë¾ì¹ç¤Ïʸ»úÎó¤Î½ª¤ï¤ê¤ò»Ø¤¹¥¤¥ó¥Ç¥Ã¥¯¥¹¤Î
1332  ÃͤâÊѲ½¤µ¤»¤ë¡£¤Þ¤¿¡¢¥«¡¼¥½¥ë¤ÎÁ°¤ÎÉôʬ¤ËÂФ·¤Æʸ»úÎó¤ÎÃÖ´¹¤ò¹Ô¤¦¾ì
1333  ¹ç¤Ë¤Ï¥«¡¼¥½¥ë¥Ý¥¸¥·¥ç¥ó¤ÎÃͤâÊѲ½¤µ¤»¤ë¡£¥«¡¼¥½¥ë¤òÊѲ½¤µ¤»¤¿·ë²Ì¡¢
1334  ̤ÊÑ´¹Ê¸»úÅù¤Ø¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤è¤ê¤â¾®¤µ¤¯¤Ê¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢Ì¤ÊÑ´¹Ê¸»úÅù
1335  ¤Ø¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ÎÃͤò¥«¡¼¥½¥ë¤ÎÃͤ˹ç¤ï¤»¤Æ¾®¤µ¤¯¤¹¤ë¡£
1336
1337  ¤³¤Î´Ø¿ô¤ÎºÇ½ª°ú¿ô¤Ë¤Ï¿·¤¿¤ËÁÞÆþ¤¹¤ëʸ»úÎó¤Î°À­¤Ë´Ø¤¹¤ë¥Ò¥ó¥È¤¬µ­½Ò
1338  ¤Ç¤­¤ë¡£¿·¤¿¤ËÁÞÆþ¤µ¤ì¤ëʸ»úÎó¤Î³Æʸ»ú¤ËÂФ·¤Æ¡¢¥Ò¥ó¥È¤ÇÍ¿¤¨¤é¤ì¤¿ÃÍ
1339  ¼«¿È¤¬Â°À­ÃͤȤ·¤Æ³ÊǼ¤µ¤ì¤ë¡£
1340
1341  ¡Ú°ú¿ô¡Û
1342     buf      ¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
1343     attr     °À­¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
1344     startp   ¥Ð¥Ã¥Õ¥¡¤Î̤³ÎÄêʸ»úÎó¤Ê¤É¤Ø¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò¼ý¤á¤Æ¤¤¤ëÊÑ
1345              ¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿
1346     cursor   ¥«¡¼¥½¥ë°ÌÃÖ¤ò¼ý¤á¤Æ¤¤¤ëÊÑ¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿
1347     endp     ʸ»úÎó¤ÎºÇ½ª°ÌÃÖ¤ò»Ø¤·¼¨¤·¤Æ¤¤¤ëÊÑ¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿
1348
1349     bytes    ²¿¥Ð¥¤¥ÈÃÖ´¹¤¹¤ë¤«¡©Éé¤Î¿ô¤¬»ØÄꤵ¤ì¤ë¤È¥«¡¼¥½¥ë¤ÎÁ°¤ÎÉô
1350              ʬ¤Î |bytes| ʬ¤Îʸ»úÎó¤¬ÃÖ´¹¤ÎÂоݤȤʤꡢÀµ¤Î¿ô¤¬»ØÄê
1351              ¤µ¤ì¤ë¤È¥«¡¼¥½¥ë¤Î¸å¤í¤ÎÉôʬ¤Î bytes ʬ¤Îʸ»úÎó¤¬ÂоݤÈ
1352              ¤Ê¤ë¡£
1353     rplastr  ¿·¤·¤¯ÃÖ¤¯Ê¸»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
1354     len      ¿·¤·¤¯ÃÖ¤¯Ê¸»úÎó¤ÎŤµ
1355     attrmask ¿·¤·¤¯ÃÖ¤¯Ê¸»úÎó¤Î°À­¤Î¥Ò¥ó¥È
1356
1357  ¼ÂºÝ¤Ë¤Ï¤³¤Î´Ø¿ô¤òľÀܤ˻Ȥ鷺¤Ë¡¢bytes, rplastr, len, attrmask ¤À¤±
1358  ¤òÍ¿¤¨¤ë¤À¤±¤Ç¤¹¤à¥Þ¥¯¥í¡¢kanaReplace, romajiReplace ¤ò»È¤¦¤Î¤¬Îɤ¤¡£
1359*/
1360
1361void
1362generalReplace(WCHAR_T *buf, BYTE *attr, int *startp, int *cursor, int *endp, int bytes, WCHAR_T *rplastr, int len, int attrmask)
1363{
1364  int idou, begin, end, i;
1365  int cursorMove;
1366
1367  if (bytes > 0) {
1368    cursorMove = 0;
1369    begin = *cursor;
1370    end = *endp;
1371  }
1372  else {
1373    bytes = -bytes;
1374    cursorMove = 1;
1375    begin = *cursor - bytes;
1376    end = *endp;
1377  }
1378
1379  idou = len - bytes;
1380
1381  moveStrings(buf, attr, begin + bytes, end, idou);
1382  *endp += idou;
1383  if (cursorMove) {
1384    *cursor += idou;
1385    if (*cursor < *startp)
1386      *startp = *cursor;
1387  }
1388
1389  WStrncpy(buf + begin, rplastr, len);
1390  for (i = 0 ; i < len ; i++) {
1391    attr[begin + i] = attrmask;
1392  }
1393/*  if (len)
1394    attr[begin] |= attrmask; */
1395}
1396
1397int WToupper(WCHAR_T w)
1398{
1399  if ('a' <= w && w <= 'z')
1400    return((WCHAR_T) (w - 'a' + 'A'));
1401  else
1402    return(w);
1403}
1404
1405int WTolower(WCHAR_T w)
1406{
1407  if ('A' <= w && w <= 'Z') {
1408    return (WCHAR_T)(w - 'A' + 'a');
1409  }
1410  else {
1411    return w;
1412  }
1413}
1414
1415/*
1416  ¥­¡¼¤ò wchar ¤Îʸ»ú¤ËÊÑ´¹¤¹¤ë¡£
1417
1418  °ú¿ô:
1419      key         ÆþÎϤµ¤ì¤¿¥­¡¼
1420      check       WCHAR_T ¤ËÊÑ´¹¤µ¤ì¤¿¤«¤É¤¦¤«¤ò³ÊǼ¤¹¤ë¤¿¤á¤ÎÊÑ¿ô¤Î¥¢¥É¥ì¥¹
1421  ÊÖÃÍ:
1422      ´Ø¿ô¤ÎÊÖÃÍ  ÊÑ´¹¤µ¤ì¤¿ WCHAR_T ¤Îʸ»ú
1423      check       ¤¦¤Þ¤¯ÊÑ´¹¤Ç¤­¤¿¤«¤É¤¦¤«
1424  Ãí°Õ:
1425      check ¤Ïɬ¤ºÍ­¸ú¤ÊÊÑ¿ô¤Î¥¢¥É¥ì¥¹¤ò¥Ý¥¤¥ó¥È¤¹¤ë¤³¤È¡£
1426      check ¤Î¥Ý¥¤¥ó¥ÈÀè¤ÎÍ­¸úÀ­¤Ï key2wchar ¤Ç¤Ï¥Á¥§¥Ã¥¯¤·¤Ê¤¤¡£
1427 */
1428
1429WCHAR_T
1430key2wchar(int key, int *check)
1431{
1432  *check = 1; /* Success as default */
1433  if (161 <= key && key <= 223) { /* ¥«¥¿¥«¥Ê¤ÎÈϰϤÀ¤Ã¤¿¤é */
1434    char xxxx[4];
1435    WCHAR_T yyyy[4];
1436    int nchars;
1437
1438    xxxx[0] = (char)0x8e; /* SS2 */
1439    xxxx[1] = (char)key;
1440    xxxx[2] = '\0';
1441    nchars = MBstowcs(yyyy, xxxx, 4);
1442    if (nchars != 1) {
1443      *check = 0;
1444      return 0; /* ¥¨¥é¡¼ */
1445    }
1446    return yyyy[0];
1447  }
1448  else {
1449    return (WCHAR_T)key;
1450  }
1451}
1452
1453int
1454confirmContext(uiContext d, yomiContext yc)
1455{
1456  extern int defaultContext;
1457
1458  if (yc->context < 0) {
1459    if (d->contextCache >= 0) {
1460      yc->context = d->contextCache;
1461      d->contextCache = -1;
1462    }
1463    else {
1464      if (defaultContext == -1) {
1465	if (KanjiInit() < 0 || defaultContext == -1) {
1466	  jrKanjiError = KanjiInitError();
1467	  return -1;
1468	}
1469      }
1470      yc->context = RkwDuplicateContext(defaultContext);
1471      if (yc->context < 0) {
1472	if (errno == EPIPE) {
1473	  jrKanjiPipeError();
1474	}
1475	jrKanjiError = "\244\253\244\312\264\301\273\372\312\321\264\271\244\313\274\272\307\324\244\267\244\336\244\267\244\277";
1476                      /* ¤«¤Ê´Á»úÊÑ´¹¤Ë¼ºÇÔ¤·¤Þ¤·¤¿ */
1477	return -1;
1478      }
1479    }
1480  }
1481  return yc->context;
1482}
1483
1484int
1485abandonContext(uiContext d, yomiContext yc)
1486{
1487  extern int defaultContext;
1488
1489  if (yc->context >= 0) {
1490    if (d->contextCache >= 0) {
1491      RkwCloseContext(yc->context);
1492    }
1493    else {
1494      d->contextCache = yc->context;
1495    }
1496    yc->context = -1;
1497  }
1498  return 0;
1499}
1500
1501int
1502makeRkError(uiContext d, char *str)
1503{
1504  if (errno == EPIPE) {
1505    jrKanjiPipeError();
1506  }
1507  jrKanjiError = str;
1508  makeGLineMessageFromString(d, jrKanjiError);
1509  return -1;
1510}
1511
1512/* °Ê²¼¥á¥Ã¥»¡¼¥¸¤ò gline ¤Ë½Ð¤¹¤¿¤á¤Î»ÅÁÈ¤ß */
1513
1514inline
1515int ProcAnyKey(uiContext d)
1516{
1517  coreContext cc = (coreContext)d->modec;
1518
1519  d->current_mode = cc->prevMode;
1520  d->modec = cc->next;
1521  freeCoreContext(cc);
1522
1523  d->status = EXIT_CALLBACK;
1524  return 0;
1525}
1526
1527static int wait_anykey_func (uiContext, KanjiMode, int, int, int);
1528
1529static
1530int wait_anykey_func(uiContext d, KanjiMode mode, int whattodo, int key, int fnum)
1531/* ARGSUSED */
1532{
1533  switch (whattodo) {
1534  case KEY_CALL:
1535    return ProcAnyKey(d);
1536  case KEY_CHECK:
1537    return 1;
1538  case KEY_SET:
1539    return 0;
1540  }
1541  /* NOTREACHED */
1542}
1543
1544static KanjiModeRec canna_message_mode = {
1545  wait_anykey_func,
1546  0, 0, 0,
1547};
1548
1549inline void
1550cannaMessageMode(uiContext d, canna_callback_t cnt)
1551{
1552  coreContext cc;
1553  extern coreContext newCoreContext (void);
1554
1555
1556  cc = newCoreContext();
1557  if (cc == 0) {
1558    NothingChangedWithBeep(d);
1559    return;
1560  }
1561  cc->prevMode = d->current_mode;
1562  cc->next = d->modec;
1563  cc->majorMode = d->majorMode;
1564  cc->minorMode = d->minorMode;
1565  if (pushCallback(d, d->modec, NO_CALLBACK, cnt,
1566                     NO_CALLBACK, NO_CALLBACK) == (struct callback *)0) {
1567    freeCoreContext(cc);
1568    NothingChangedWithBeep(d);
1569    return;
1570  }
1571  d->modec = (mode_context)cc;
1572  d->current_mode = &canna_message_mode;
1573  return;
1574}
1575
1576/*
1577  canna_alert(d, message, cnt) -- ¥á¥Ã¥»¡¼¥¸¤ò gline ¤Ë½Ð¤¹
1578
1579  ²¿¤«¥­¡¼¤¬ÆþÎϤµ¤ì¤¿¤é cnt ¤È¸À¤¦´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¡£
1580
1581  °ú¿ô:
1582    d        UI Context
1583    message  ¥á¥Ã¥»¡¼¥¸
1584    cnt      ¼¡¤Î½èÍý¤ò¹Ô¤¦´Ø¿ô
1585
1586  cnt ¤Ç¤Ï popCallback(d) ¤ò¤ä¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ËÃí°Õ¡ª
1587
1588 */
1589
1590int canna_alert(uiContext d, char *message, canna_callback_t cnt)
1591{
1592  d->nbytes = 0;
1593
1594  makeGLineMessageFromString(d, message);
1595  cannaMessageMode(d, cnt);
1596  return 0;
1597}
1598
1599char *
1600KanjiInitError(void)
1601{
1602  extern int standalone;
1603
1604  if (standalone) {
1605    return "\244\253\244\312\264\301\273\372\312\321\264\271\244\307\244\255\244\336\244\273\244\363";
1606    /* "¤«¤Ê´Á»úÊÑ´¹¤Ç¤­¤Þ¤»¤ó" */
1607  }
1608  else {
1609    return "\244\253\244\312\264\301\273\372\312\321\264\271\245\265"
1610      "\241\274\245\320\244\310\304\314\277\256\244\307\244\255\244\336"
1611	"\244\273\244\363";
1612    /* "¤«¤Ê´Á»úÊÑ´¹¥µ¡¼¥Ð¤ÈÄÌ¿®¤Ç¤­¤Þ¤»¤ó" */
1613  }
1614}
1615
1616