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