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