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/************************************************************************/ 25/* THIS SOURCE CODE IS MODIFIED FOR TKO BY T.MURAI 1997 26/************************************************************************/ 27 28#if !defined(lint) && !defined(__CODECENTER__) 29static char rcsid[] = "$Id: ebind.c 14875 2005-11-12 21:25:31Z bonefish $"; 30#endif 31 32#include "canna.h" 33// There is Exported Symbols !! 34extern int howToReturnModeInfo; 35 36static WCHAR_T *inbuf = 0; 37static int inbufsize = 0; 38 39 40static int 41StoreWCtoEUC(WCHAR_T *wbuf, int wbuflen, wcKanjiStatus *wks, char *ebuf, int maxebuf, jrKanjiStatus *ks, int ch, int nbytes) 42{ 43 int ret, rest, totallen = 0, len; 44 char *p; 45 46 /* info */ 47 48 ks->info = wks->info; 49 50 /* ·ë²Ì */ 51 52 if (ks->info & KanjiThroughInfo) { 53 if (nbytes) { 54 ebuf[0] = ch; 55 } 56 ret = nbytes; 57 } 58 else { 59 ret = (wbuflen > 0) ? WCstombs(ebuf, wbuf, maxebuf) : 0; 60 if (ks->info & KanjiYomiInfo) { 61 WCHAR_T *ep; 62 len = WCstombs(ebuf + ret + 1, wbuf + wbuflen + 1, 63 maxebuf - ret - 1); 64 ep = wbuf + wbuflen + 1; 65 while (*ep) ep++; 66 WCstombs(ebuf + ret + 1 + len + 1, ep + 1, 67 maxebuf - ret - 1 - len - 1); 68 } 69 } 70 71 if (wks->length > 0) { 72 totallen = wks->length; 73 } 74 if (wks->info & KanjiModeInfo) { 75 totallen += WStrlen(wks->mode); 76 } 77 if (wks->info & KanjiGLineInfo) { 78 totallen += wks->gline.length; 79 } 80 81 if (inbufsize < totallen) { 82 inbufsize = totallen; /* inbufsize will be greater than 0 */ 83 if (inbuf) free(inbuf); 84 inbuf = (WCHAR_T *)malloc(inbufsize * sizeof(WCHAR_T)); 85 if (!inbuf) { 86 inbufsize = 0; 87 jrKanjiError = "\245\341\245\342\245\352\244\254\302\255\244\352\244\336\244\273\244\363"; 88 /* ¥á¥â¥ê¤¬Â¤ê¤Þ¤»¤ó */ 89 return -1; 90 } 91 } 92 93 rest = inbufsize * sizeof(WCHAR_T); 94 p = (char *)inbuf; 95 96 if (wks->length < 0) { 97 ks->length = -1; 98 } 99 else { 100 /* ¥¨¥³¡¼Ê¸»ú */ 101 102 ks->length = ks->revLen = ks->revPos = 0; 103 104 if (wks->length > 0) { 105 ks->echoStr = (unsigned char *)p; 106 if (wks->revPos > 0) { 107 len = ks->revPos = CNvW2E(wks->echoStr, wks->revPos, p, rest); 108 p += len; 109 rest -= len; 110 } 111 if (wks->revLen > 0) { 112 len = ks->revLen 113 = CNvW2E(wks->echoStr + wks->revPos, wks->revLen, p, rest); 114 p += len; 115 rest -= len; 116 } 117 len = 0; 118 if (wks->length - wks->revPos - wks->revLen > 0) { 119 len = CNvW2E(wks->echoStr + wks->revPos + wks->revLen, 120 wks->length - wks->revPos - wks->revLen, p, rest); 121 p += len; 122 rest -= len; 123 } 124 ks->length = ks->revLen + ks->revPos + len; 125 *p++ = '\0'; 126 rest--; 127 } 128 } 129 130 /* ¥â¡¼¥Éɽ¼¨ */ 131 132 if (wks->info & KanjiModeInfo) { 133 len = WCstombs(p, wks->mode, rest); 134 ks->mode = (unsigned char *)p; 135 p[len] = '\0'; 136 p += len + 1; 137 rest -= len + 1; 138 } 139 140 /* °ìÍ÷¹Ôɽ¼¨ */ 141 142 if (wks->info & KanjiGLineInfo) { 143 ks->gline.length = ks->gline.revLen = ks->gline.revPos = 0; 144 145 if (wks->gline.length > 0) { 146 ks->gline.line = (unsigned char *)p; 147 if (wks->gline.revPos > 0) { 148 len = ks->gline.revPos 149 = CNvW2E(wks->gline.line, wks->gline.revPos, p, rest); 150 p += len; 151 rest -= len; 152 } 153 if (wks->gline.revLen > 0) { 154 len = ks->gline.revLen 155 = CNvW2E(wks->gline.line + wks->gline.revPos, wks->gline.revLen, 156 p, rest); 157 p += len; 158 rest -= len; 159 } 160 len = 0; 161 if (wks->gline.length - wks->gline.revPos - wks->gline.revLen > 0) { 162 len = CNvW2E(wks->gline.line + wks->gline.revPos + 163 wks->gline.revLen, 164 wks->gline.length - 165 wks->gline.revPos - wks->gline.revLen, 166 p, rest); 167 p += len; 168 rest -= len; 169 } 170 ks->gline.length = ks->gline.revLen + ks->gline.revPos + len; 171 *p++ = '\0'; 172 rest--; 173 } 174 } 175 return ret; 176} 177 178inline int 179XLookupKanji2( 180 unsigned int dpy, 181 unsigned int win, 182 char *buffer_return, 183 int bytes_buffer, 184 int nbytes, 185 int functionalChar, 186 jrKanjiStatus *kanji_status_return, 187 int key) 188{ 189 int ret; 190 wcKanjiStatus wks; 191 192 /* ÆâÉô¥Ð¥Ã¥Õ¥¡¤ò¥¢¥í¥±¡¼¥È¤¹¤ë */ 193 if (inbufsize < bytes_buffer) { 194 inbufsize = bytes_buffer; /* inbufsize will be greater than 0 */ 195 if (inbuf) free(inbuf); 196 inbuf = (WCHAR_T *)malloc(inbufsize * sizeof(WCHAR_T)); 197 if (!inbuf) { 198 inbufsize = 0; 199 jrKanjiError = "\245\341\245\342\245\352\244\254\302\255\244\352\244\336\244\273\244\363"; 200 /* ¥á¥â¥ê¤¬Â¤ê¤Þ¤»¤ó */ 201 return -1; 202 } 203 } 204 205 inbuf[0] = key; 206 207 ret = XwcLookupKanji2(dpy, win, inbuf, inbufsize, 1/*nbytes*/, 1/*functionalChar*/, 208 &wks); 209 if (ret >= inbufsize) 210 ret = inbufsize - 1; 211 inbuf[ret] = 0; 212 213 return StoreWCtoEUC(inbuf, ret, &wks, 214 buffer_return, bytes_buffer, kanji_status_return, 215 key, nbytes); 216} 217 218 219int 220XKanjiControl2(unsigned int display, unsigned int window, unsigned int request, BYTE *arg) 221{ 222 int ret = -1, len1, len2; 223 wcKanjiStatusWithValue wksv; 224 wcKanjiStatus wks; 225 int ch; 226 WCHAR_T arg2[256]; 227 WCHAR_T wbuf[320], wbuf1[320], wbuf2[320]; 228 229 wksv.buffer = wbuf; 230 wksv.n_buffer = 320; 231 wksv.ks = &wks; 232 233 switch (request) { 234 case KC_DO: /* val ¤È buffer_return ¤ËÆþ¤ì¤ë¥¿¥¤¥× */ 235 wbuf[0] = ((jrKanjiStatusWithValue *)arg)->buffer[0]; 236 /* ²¼¤Ø³¤¯ */ 237 case KC_CHANGEMODE: /* val ¤òÍ¿¤¨¤ë¥¿¥¤¥× */ 238 wksv.val = ((jrKanjiStatusWithValue *)arg)->val; 239 goto withksv; 240 case KC_STOREYOMI: /* echoStr ¤È length ¤È mode ¤òÍ¿¤¨¤ë¥¿¥¤¥× */ 241 /* ¤Þ¤º mode ¤ò¥ï¥¤¥É¤Ë¤·¤Æ¤ß¤è¤¦ */ 242 if (((jrKanjiStatusWithValue *)arg)->ks->mode) { 243 len2 = MBstowcs(wbuf2, (char *)((jrKanjiStatusWithValue *)arg)->ks->mode, 244 320); 245 wbuf2[len2] = (WCHAR_T)0; 246 wks.mode = wbuf2; 247 } 248 else { 249 wks.mode = (WCHAR_T *)0; 250 } 251 /* ²¼¤Ø³¤¯ */ 252 case KC_DEFINEKANJI: /* echoStr ¤È length ¤òÍ¿¤¨¤ë¥¿¥¤¥× */ 253 /* echoStr ¤ò¥ï¥¤¥É¤Ë¤·¤ÆÍ¿¤¨¤Æ¤ß¤è¤¦ */ 254 len1 = MBstowcs(wbuf1, 255 (char *)((jrKanjiStatusWithValue *)arg)->ks->echoStr, 320); 256 wbuf1[len1] = (WCHAR_T)0; 257 wks.echoStr = wbuf1; 258 wks.length = len1; 259 /* ²¼¤Ø³¤¯ */ 260 case KC_KAKUTEI: /* ¤¿¤Àñ¤ËÍ¿¤¨¤ÆÊ֤äÆÍè¤ë¥¿¥¤¥× */ 261 case KC_KILL: 262 goto withksv; 263 case KC_CLOSEUICONTEXT: 264 goto closecont; 265 case KC_QUERYMODE: /* querymode */ 266 ret = XwcKanjiControl2(display, window, request, (BYTE *)arg2); 267 if (!ret) { 268 switch (howToReturnModeInfo) { 269 case ModeInfoStyleIsString: 270 WCstombs((char *)arg, arg2, 256); 271 break; 272 case ModeInfoStyleIsBaseNumeric: 273 arg[2] = (unsigned char)arg2[2]; 274 case ModeInfoStyleIsExtendedNumeric: 275 arg[1] = (unsigned char)arg2[1]; 276 case ModeInfoStyleIsNumeric: 277 arg[0] = (unsigned char)arg2[0]; 278 break; 279 } 280 } 281 goto return_ret; 282 case KC_SETLISTCALLBACK: /* ¤É¤¦¤·¤¿¤éÎɤ¤¤«¤ï¤«¤é¤Ê¤¤¤â¤Î */ 283 ret = -1; 284 goto return_ret; 285 default: /* ¥ï¥¤¥É¤Ç¤âEUC¤Ç¤âÊѤï¤é¤Ê¤¤¤â¤Î */ 286 ret = XwcKanjiControl2(display, window, request, arg); 287 goto return_ret; 288 } 289 withksv: 290 ch = ((jrKanjiStatusWithValue *)arg)->buffer[0]; 291 ret = XwcKanjiControl2(display, window, request, (BYTE *)&wksv); 292 if (ret < 0) { 293 goto return_ret; 294 } 295 else { 296 wksv.buffer[ret] = (WCHAR_T)0; 297 ((jrKanjiStatusWithValue *)arg)->val = 298 StoreWCtoEUC(wksv.buffer, wksv.val, wksv.ks, 299 (char *)((jrKanjiStatusWithValue *)arg)->buffer, 300 ((jrKanjiStatusWithValue *)arg)->bytes_buffer, 301 ((jrKanjiStatusWithValue *)arg)->ks, 302 ch, ((jrKanjiStatusWithValue *)arg)->val); 303 ret = ((jrKanjiStatusWithValue *)arg)->val; 304 goto return_ret; 305 } 306 closecont: 307 ch = ((jrKanjiStatusWithValue *)arg)->buffer[0]; 308 ret = XwcKanjiControl2(display, window, request, (BYTE *)&wksv); 309 if (ret < 0) { 310 goto return_ret; 311 } 312 else { 313 wksv.val = 0; 314 ((jrKanjiStatusWithValue *)arg)->val = 315 StoreWCtoEUC(wksv.buffer, wksv.val, wksv.ks, 316 (char *)((jrKanjiStatusWithValue *)arg)->buffer, 317 ((jrKanjiStatusWithValue *)arg)->bytes_buffer, 318 ((jrKanjiStatusWithValue *)arg)->ks, 319 ch, ((jrKanjiStatusWithValue *)arg)->val); 320 goto return_ret; 321 } 322 return_ret: 323 return ret; 324} 325 326int 327jrKanjiString ( 328 int context_id, 329 int ch, 330 char *buffer_return, 331 int nbuffer, 332 jrKanjiStatus *kanji_status_return) 333{ 334 *buffer_return = ch; 335 336 return XLookupKanji2(0, context_id, 337 buffer_return, nbuffer, 338 1/* byte */, 1/* functional char*/, 339 kanji_status_return, ch); 340} 341 342/* jrKanjiControl -- ¥«¥Ê´Á»úÊÑ´¹¤ÎÀ©¸æ¤ò¹Ô¤¦ */ 343int 344jrKanjiControl ( 345int context, 346int request, 347char *arg) 348{ 349 return XKanjiControl2((unsigned int)0, (unsigned int)context, 350 request, (BYTE *)arg); 351} 352 353void 354setBasePath(const char *path) 355{ 356extern char basepath[]; 357 strcpy(basepath, path); 358} 359