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