comparison lib/Xsj3clib/mode.c @ 0:92745d501b9a

initial import from kinput2-v3.1
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 04:44:30 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:92745d501b9a
1 #ifndef lint
2 static char *rcsid = "$Id: mode.c,v 2.6 1993/01/06 10:58:18 nao Exp $";
3 #endif
4 /*
5 * Copyright 1991 Sony Corporation
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and its
8 * documentation for any purpose is hereby granted without fee, provided that
9 * the above copyright notice appear in all copies and that both that
10 * copyright notice and this permission notice appear in supporting
11 * documentation, and that the name of Sony not be used in advertising or
12 * publicity pertaining to distribution of the software without specific,
13 * written prior permission. Sony makes no representations about the
14 * suitability of this software for any purpose. It is provided "as is"
15 * without express or implied warranty.
16 *
17 * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
19 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
21 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 */
24 /*
25 * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp)
26 */
27
28 #include <ctype.h>
29 #include "common.h"
30 #include "sj3ctype.h"
31 #include "util.h"
32
33 extern Xsj3cCVServerIF serverIF[SERVER_NUM];
34
35 Xsj3cEvent _Xsj3cModeChange();
36 Xsj3cEvent _Xsj3cModeClear();
37 Xsj3cEvent Xsj3cModeConv();
38
39 void _Xsj3cHiraToZKata();
40 void _Xsj3cHankakuToHira();
41 void _Xsj3cHankakuToZKata();
42 void _Xsj3cHKataToHira();
43 void _Xsj3cHKataToZKata();
44 void _Xsj3cZKanaToHKata();
45 void _Xsj3cZKataToHira();
46 void _Xsj3cHAlphaToZAlpha();
47 void _Xsj3cHAlphaToZKana();
48 void _Xsj3cHAlphaToHKata();
49 void _Xsj3cZAlphaToHAlpha();
50
51 static void _Xsj3cLowerToUpper();
52 static void _Xsj3cUpperToLower();
53 static void _Xsj3cRKConvs();
54 static void _Xsj3cKRConvs();
55
56 /*
57 * _Xsj3cModeChange()
58 *
59 * Change current character mode to apointed mode(secound argument)
60 */
61 Xsj3cEvent
62 _Xsj3cModeChange(buf, mode, conv)
63 Xsj3cBuf buf;
64 Xsj3csMode mode;
65 Xsj3cFlag conv;
66 {
67 Xsj3cEvent ret;
68 unsigned char *mbs;
69
70 if (buf->convmode != SelectModeMask) {
71 if (conv) {
72 Xsj3cSeg seg = buf->input[buf->curseg];
73
74 if ((mbs = (unsigned char *)
75 malloc(seg->size * 2 * sizeof(wchar))) == NULL)
76 Xsj3cError("Cannot allocate for mode conversion buffer");
77 _Xsj3cwPStomPS(buf, mbs, seg->yomi);
78 if ((ret = Xsj3cModeConv(buf, mbs, mode, seg->size))
79 & KEY_TEXT_CHANGE) {
80 seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, mbs, seg->size);
81 if (seg->num > seg->size - YBUFSIZ) {
82 Xsj3cResizeSegment(seg, seg->size * 2);
83 seg->num = _Xsj3cmPStowPS(buf, seg->yomi, mbs);
84 }
85 seg->cur = seg->num;
86 _Xsj3cStoreYomi(buf, seg, 0);
87 seg->change = OFF;
88 seg->cursegmode = mode;
89 }
90 free(mbs);
91 } else {
92 if (buf->inputmode != mode) {
93 buf->dispmode = buf->inputmode = mode;
94 return (_Xsj3cModeClear(buf));
95 } else {
96 #ifdef THROUGH_CONT
97 return (KEY_NULL);
98 #else /* THROUGH_CONT */
99 if (buf->cntrlsame)
100 return (KEY_NULL);
101 else
102 return (KEY_TEXT_CHANGE); /* dummy */
103 #endif /* THROUGH_CONT */
104 }
105 }
106 return ret;
107 } else {
108 return (KEY_BELL);
109 }
110 }
111
112 /*
113 * _Xsj3cModeClear()
114 * Clear romaji/kana buffer after changing mode.
115 */
116 Xsj3cEvent
117 _Xsj3cModeClear(buf)
118 Xsj3cBuf buf;
119 {
120 register Xsj3cSeg seg = buf->input[buf->curseg];
121
122 if (!seg)
123 return (KEY_MODE_CHANGE);
124 *seg->str = '\0';
125 seg->sp = seg->str;
126 seg->n_roma = 0;
127 seg->n_kana = -1;
128 *seg->oldstr = '\0';
129 seg->oldlen = 0;
130 seg->value = 0;
131 seg->change = OFF;
132 seg->cursegmode = MODE_HIRA;
133 if (buf->flushaconv)
134 return (KEY_MODE_CHANGE|KEY_TEXT_CLEAR);
135 else
136 return (KEY_MODE_CHANGE);
137 }
138
139 /*
140 * Xsj3cModeConv()
141 * Convert current segment to appointed character mode.
142 */
143 Xsj3cEvent
144 Xsj3cModeConv(buf, string, postmode, size)
145 Xsj3cBuf buf;
146 unsigned char *string;
147 Xsj3csMode postmode;
148 int size;
149 {
150 Xsj3cEvent ret = KEY_NULL;
151 unsigned char *tmp1, *tmp2;
152
153 if ((tmp1 = (unsigned char *)malloc(size * 2 * sizeof(wchar))) == NULL)
154 Xsj3cError("Cannot allocate for mode conversion buffer");
155 if ((tmp2 = (unsigned char *)malloc(size * 2 * sizeof(wchar))) == NULL)
156 Xsj3cError("Cannot allocate for mode conversion buffer");
157
158 switch (postmode) {
159 case MODE_HIRA:
160 _Xsj3cZKanaToHKata(buf, tmp2, string);
161 _Xsj3cHKataToHira(buf, tmp1, tmp2);
162 _Xsj3cKRConvs(buf, tmp2, tmp1);
163 _Xsj3cRKConvs(buf, tmp1, tmp2);
164 if (buf->alphaconv)
165 _Xsj3cHankakuToHira(buf, string, tmp1);
166 else
167 _Xsj3cZKataToHira(buf, string, tmp1);
168 ret = KEY_TEXT_CHANGE;
169 break;
170
171 case MODE_ZKATA:
172 _Xsj3cZKanaToHKata(buf, tmp2, string);
173 _Xsj3cHKataToHira(buf, tmp1, tmp2);
174 _Xsj3cKRConvs(buf, tmp2, tmp1);
175 _Xsj3cRKConvs(buf, tmp1, tmp2);
176 if (buf->alphaconv) {
177 _Xsj3cHiraToZKata(buf, tmp2, tmp1);
178 _Xsj3cHAlphaToZAlpha(buf, string, tmp2);
179 } else
180 _Xsj3cHiraToZKata(buf, string, tmp1);
181 ret = KEY_TEXT_CHANGE;
182 break;
183
184 case MODE_HKATA:
185 _Xsj3cHKataToHira(buf, tmp1, string);
186 _Xsj3cKRConvs(buf, tmp2, tmp1);
187 _Xsj3cRKConvs(buf, tmp1, tmp2);
188 _Xsj3cZKanaToHKata(buf, string, tmp1);
189 ret = KEY_TEXT_CHANGE;
190 break;
191
192 case MODE_HALPHA:
193 _Xsj3cZAlphaToHAlpha(buf, tmp2, string);
194 _Xsj3cRKConvs(buf, tmp1, tmp2);
195 _Xsj3cZKanaToHKata(buf, tmp2, tmp1);
196 _Xsj3cHKataToHira(buf, tmp1, tmp2);
197 _Xsj3cKRConvs(buf, string, tmp1);
198 ret = KEY_TEXT_CHANGE;
199 break;
200
201 case MODE_ZALPHA:
202 _Xsj3cZAlphaToHAlpha(buf, tmp2, string);
203 _Xsj3cRKConvs(buf, tmp1, tmp2);
204 _Xsj3cZKanaToHKata(buf, tmp2, tmp1);
205 _Xsj3cHKataToHira(buf, tmp1, tmp2);
206 _Xsj3cKRConvs(buf, tmp2, tmp1);
207 _Xsj3cHAlphaToZAlpha(buf, string, tmp2);
208 ret = KEY_TEXT_CHANGE;
209 break;
210
211 case MODE_HANKAKU:
212 _Xsj3cZKanaToHKata(buf, tmp1, string);
213 strcpy(string, tmp1);
214 ret = KEY_TEXT_CHANGE;
215 break;
216
217 case MODE_ZENKAKU:
218 _Xsj3cHankakuToZKata(buf, tmp1, string);
219 strcpy(string, tmp1);
220 ret = KEY_TEXT_CHANGE;
221 break;
222
223 case MODE_UPPER:
224 _Xsj3cLowerToUpper(buf, string);
225 ret = KEY_TEXT_CHANGE;
226 break;
227
228 case MODE_LOWER:
229 _Xsj3cUpperToLower(buf, string);
230 ret = KEY_TEXT_CHANGE;
231 break;
232
233 default:
234 ret = KEY_BELL;
235 break;
236 }
237 free(tmp1);
238 free(tmp2);
239 return (ret);
240 }
241
242 /*
243 * _Xsj3cRKConvs()
244 * Convert romaji to kana in 3rd argument and set to 2nd argument.
245 */
246 static void
247 _Xsj3cRKConvs(buf, yomi, alpha)
248 Xsj3cBuf buf;
249 unsigned char *yomi;
250 unsigned char *alpha;
251 {
252 unsigned char *p;
253 register unsigned char *q, *yp, *t;
254 register int i = 0, rlen = 0, tflg = 0, value;
255 unsigned char rbuf[RBUFSIZ];
256 unsigned char ybuf[YBUFSIZ];
257
258 yp = yomi;
259 p = rbuf;
260 rlen = 0;
261
262 while (*alpha != '\0') {
263 if (iskan1(*alpha, serverIF[buf->server].lang)
264 && iskan2(*(alpha + 1), serverIF[buf->server].lang)) {
265 *yp++ = *alpha++;
266 *yp++ = *alpha++;
267 i++;
268 continue;
269 } else if (!isascii(*alpha)) {
270 *yp++ = *alpha++;
271 i++;
272 continue;
273 }
274 if (i) {
275 rlen = 0;
276 p = rbuf;
277 i = 0;
278 }
279
280 *p = *alpha++;
281 *(p + 1) = '\0';
282 if (*alpha == '\0') {
283 t = buf->rkdouble;
284 while (*t != '\0') {
285 if (p > rbuf && *(p - 1) == *t) {
286 break;
287 } else if (*t == *p) {
288 *(p + 1) = *p;
289 *(p + 2) = '\0';
290 tflg++;
291 break;
292 }
293 t++;
294 }
295 }
296 if ((value = _Xsj3cRomaConv(buf->rktable, rbuf, ybuf)) > 0) {
297 q = ybuf;
298 yp -= rlen;
299 while (*q != '\0') {
300 *yp++ = *q++;
301 }
302 p = rbuf;
303 rlen = 0;
304 while (*p != '\0' && !tflg) {
305 *yp++ = *p++;
306 rlen++;
307 }
308 } else if (value < 0) {
309 if ((value = _Xsj3cRomaConv(buf->rktable, p, ybuf)) > 0) {
310 q = ybuf;
311 while (*q != '\0') {
312 *yp++ = *q++;
313 }
314 rlen = 0;
315 while (*p != '\0' && !tflg) {
316 *yp++ = *p++;
317 rlen++;
318 }
319 } else if (value < 0) {
320 *yp++ = *p;
321 rlen = 0;
322 p = rbuf;
323 } else {
324 *yp++ = *p;
325 q = rbuf;
326 *q++ = *p++;
327 *q = '\0';
328 rlen = 1;
329 }
330 } else {
331 *yp++ = *p++;
332 if (rlen++ > 3) { /* non-convert limit = 4: you can change this */
333 rlen = 0;
334 p = rbuf;
335 }
336 }
337 }
338 *yp = '\0';
339 }
340
341 static void
342 _Xsj3cKRConvs(buf, roma, kana)
343 Xsj3cBuf buf;
344 register unsigned char *roma;
345 register unsigned char *kana;
346 {
347 register unsigned char c, *p, *q, *r, *sp, *t, *d;
348 register wchar s;
349 register Xsj3cRKTable *rktp;
350 register Xsj3cHKTable *hktp;
351 register Xsj3cZHTable *zhtp;
352 register int ylen, plen, rlen, i, cont = 0;
353 register int zenflg = 0, plosflg = 0;
354 unsigned char tyomi[KANABUFSIZ];
355 unsigned char tmp[RBUFSIZ];
356
357 p = tyomi;
358 while ((c = *kana++) != '\0') {
359 if (iskan1(c, serverIF[buf->server].lang)
360 && iskan2(*kana, serverIF[buf->server].lang)) {
361 s = (c << 8) + *kana;
362 if (iskata(s, serverIF[buf->server].lang)) {
363 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
364 if (c == *hktp->zkata)
365 if (*kana == *(hktp->zkata + 1))
366 break;
367 }
368 if (hktp != NULL) {
369 *p++ = *hktp->hira;
370 *p++ = *(hktp->hira + 1);
371 } else {
372 *p++ = c;
373 *p++ = *kana;
374 Xsj3cWarning("wrong sjhk table");
375 }
376
377 } else if (!ishira(s, serverIF[buf->server].lang)) {
378 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
379 if (c == *zhtp->zkana)
380 if (*kana == *(zhtp->zkana + 1))
381 break;
382 }
383 if (zhtp != NULL) {
384 *p++ = *zhtp->halpha;
385 } else {
386 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
387 if (c == *zhtp->zalpha) {
388 if (*kana == *(zhtp->zalpha + 1))
389 break;
390 }
391 }
392 if (zhtp != NULL) {
393 *p++ = *zhtp->halpha;
394 } else {
395 Xsj3cWarning("can't convert to halpha %#x",s);
396 *p++ = c;
397 *p++ = *kana;
398 }
399 }
400 } else {
401 *p++ = c;
402 *p++ = *kana;
403 }
404 kana++;
405 } else {
406 *p++ = c;
407 }
408 }
409 *p = '\0';
410 p = tyomi;
411 plen = strlen(tyomi);
412
413 while ((c = *p) != '\0') {
414 if (iskan1(c, serverIF[buf->server].lang)
415 && iskan2(*(p + 1), serverIF[buf->server].lang)) {
416 /* Multi-byte character */
417 q = tmp;
418 *q = '\0';
419 ylen = 0;
420 for (rktp = buf->rktable; rktp->next != NULL; rktp = rktp->next) {
421 if (ylen < rktp->ylen) {
422 if (plen >= rktp->ylen
423 && !strncmp(rktp->yomi, p, rktp->ylen)) {
424 ylen = rktp->ylen;
425 plosflg = 0;
426 if (*(sp = rktp->str) != '\0') {
427 /* Leaving any character case */
428 if (t = buf->plosive) {
429 while (*t != '\0') {
430 if (*t++ == *sp) {
431 plosflg = 1;
432 break;
433 }
434 }
435 if (plosflg) {
436 if (*(p + 2) == '\0') {
437 /* Last of the segment: */
438 /* continue to search */
439 plosflg = 0;
440 ylen = 0;
441 continue;
442 } else if (iskan1(*(p + 2),
443 serverIF[buf->server].lang)
444 && iskan2(*(p + 3),
445 serverIF[buf->server].lang)) {
446 /* Next character is zvowel: */
447 /* continue to search */
448 if (iszvowel((*(p + 2) << 8) | *(p + 3),
449 serverIF[buf->server].lang)){
450 plosflg = 0;
451 ylen = 0;
452 continue;
453 }
454 } else if (isvowel(*(p + 2))) {
455 /* Next character is vowel: */
456 /* continue to search */
457 plosflg = 0;
458 ylen = 0;
459 continue;
460 }
461 }
462 }
463 strcpy(tmp, rktp->roma);
464 /* Reduce leaved character */
465 i = 1;
466 while (*(++sp) != '\0')
467 i++;
468 r = (q + rktp->rlen);
469 while (*(--sp) == *(--r) && (--i));
470 *r = '\0';
471 } else if (d = buf->rkdouble) {
472 /* Double defined by a same character case */
473 strcpy(tmp, rktp->roma);
474 while (*d != '\0') {
475 if (*d++ == *q) {
476 if (*q == *(q + 1)) {
477 /* Last of the segment */
478 if (*(p + 2) == '\0')
479 *(q + 1) = '\0';
480 } else if (*(q + 1) == '\0') {
481 /* Single case: continue to search */
482 ylen = 0;
483 }
484 break;
485 }
486 }
487 } else {
488 strcpy(tmp, rktp->roma);
489 }
490 }
491 }
492 }
493 if (ylen > 0) {
494 /* Succeeded in converting. */
495 if (!zenflg && !plosflg && !isvowel(*q)
496 && p > tyomi && (t = buf->plosive)) {
497 /* Same as plosive table first character */
498 if (*t == *(p - 1))
499 cont++;
500 }
501 if (plosflg) {
502 cont++;
503 } else if (cont && !isvowel(*q)) {
504 /* Correct consonant character of previous plosive */
505 sp = roma;
506 while (cont--)
507 *(--sp) = *q;
508 cont = 0;
509 } else if (cont) {
510 cont = 0;
511 }
512 /* Copy characters to output string */
513 plen -= ylen;
514 p += ylen;
515 while (*q != '\0')
516 *roma++ = *q++;
517 } else {
518 /* Failed to convert. */
519 cont = 0;
520 /* Normal japanese character(except gaiji) is 2byte. */
521 *roma++ = *p++;
522 *roma++ = *p++;
523 plen -= 2;
524 }
525 zenflg++;
526 } else {
527 /* Non multi-byte character */
528 sp = p;
529 while (*sp != '\0' && !(iskan1(*sp, serverIF[buf->server].lang)
530 && iskan2(*(sp + 1), serverIF[buf->server].lang))) {
531 sp++;
532 }
533 ylen = sp - p;
534 i = 0;
535 for (rktp = buf->rktable; rktp->next != NULL; rktp = rktp->next) {
536 if (rktp->rlen > i) {
537 r = p;
538 t = rktp->roma;
539 while (r < sp && *r++ == *t++)
540 ;
541 if ((rlen = r - p) > i)
542 i = rlen;
543 }
544 }
545 if (i > 0) {
546 if (!zenflg && !plosflg && !isvowel(*p) && p > tyomi
547 && (t = buf->plosive)) {
548 /* Same as plosive table first character */
549 if (*t == *(p - 1))
550 cont++;
551 }
552 if (cont && !isvowel(*p)) {
553 /* Correct consonant character of previous plosive */
554 sp = roma;
555 while (cont--)
556 *(--sp) = *p;
557 cont = 0;
558 } else if (cont) {
559 cont = 0;
560 }
561 }
562 /* Copy characters to output string */
563 plen -= ylen;
564 while (ylen--)
565 *roma++ = *p++;
566 zenflg = 0;
567 plosflg = 0;
568 }
569 }
570 *roma = '\0';
571
572 if (!zenflg && (r = buf->plosive)) {
573 p--;
574 while (*r != '\0') {
575 if (*r == *p) {
576 t = buf->plosive;
577 while (*t != '\0') {
578 if (p > tyomi && *t == *p && *t == *(p - 1)) {
579 cont++;
580 break;
581 }
582 t++;
583 }
584 break;
585 }
586 r++;
587 }
588 if (*r != '\0') {
589 /* Correct consonant character of previous plosive */
590 sp = (--roma);
591 while (cont--)
592 *(--sp) = *p;
593 }
594 } else if (zenflg && cont && plosflg) {
595 q = tmp;
596 if (*q != '\0') {
597 /* Correct consonant character of previous plosive */
598 sp = (--roma);
599 while (cont--) {
600 if (!isvowel(*(--sp)))
601 *sp = *q;
602 }
603 }
604 }
605 }
606
607 void
608 _Xsj3cHiraToZKata(buf, dest, src)
609 Xsj3cBuf buf;
610 register unsigned char *dest, *src;
611 {
612 register wchar s;
613 register unsigned char c;
614 register Xsj3cHKTable *hktp;
615 register Xsj3cZHTable *zhtp;
616
617 while ((c = *src++) != '\0') {
618 if (iskan1(c, serverIF[buf->server].lang)
619 && iskan2(*src, serverIF[buf->server].lang)) {
620 s = (c << 8) + *src;
621 if (ishira(s, serverIF[buf->server].lang)) {
622 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
623 if (c == *hktp->hira)
624 if (*src == *(hktp->hira + 1))
625 break;
626 }
627 if (hktp != NULL) {
628 *dest++ = *hktp->zkata;
629 *dest++ = *(hktp->zkata + 1);
630 } else {
631 *dest++ = c;
632 *dest++ = *src;
633 Xsj3cWarning("wrong sjhk table");
634 }
635 } else {
636 *dest++ = c;
637 *dest++ = *src;
638 }
639 src++;
640 } else if (isdakuten(c)) {
641 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
642 if (c == *zhtp->hkata)
643 break;
644 }
645 if (zhtp != NULL) {
646 *dest++ = *zhtp->zkana;
647 *dest++ = *(zhtp->zkana + 1);
648 } else {
649 *dest++ = c;
650 }
651 } else {
652 *dest++ = c;
653 }
654 }
655 *dest = '\0';
656 }
657
658 void
659 _Xsj3cHankakuToHira(buf, dest, src)
660 Xsj3cBuf buf;
661 register unsigned char *dest, *src;
662 {
663 register unsigned char c;
664 register Xsj3cHKTable *hktp;
665 register Xsj3cZHTable *zhtp;
666 register int len;
667 unsigned char tmp[RBUFSIZ];
668
669 while ((c = *src++) != '\0') {
670 if (iskan1(c, serverIF[buf->server].lang)
671 && iskan2(*src, serverIF[buf->server].lang)) {
672 *dest++ = c;
673 *dest++ = *src++;
674 continue;
675 }
676 if (iskana(c)) {
677 len = 0;
678 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
679 if (len < hktp->hlen && c == *hktp->hkata) {
680 if (hktp->hlen > 1) {
681 if (iskana(*src) && *src == *(hktp->hkata + 1)) {
682 src++;
683 len = hktp->hlen;
684 strcpy(tmp, hktp->hira);
685 }
686 } else {
687 len = 1;
688 strcpy(tmp, hktp->hira);
689 }
690 }
691 }
692 if (len) {
693 strcpy(dest, tmp);
694 dest += strlen(tmp);
695 } else {
696 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
697 if (c == *zhtp->hkata)
698 break;
699 }
700 if (zhtp != NULL) {
701 *dest++ = *zhtp->zkana;
702 *dest++ = *(zhtp->zkana + 1);
703 } else {
704 *dest++ = c;
705 }
706 }
707 } else {
708 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
709 if (c == *zhtp->hkata)
710 break;
711 }
712 if (zhtp != NULL) {
713 *dest++ = *zhtp->zkana;
714 *dest++ = *(zhtp->zkana + 1);
715 } else {
716 *dest++ = c;
717 }
718 }
719 }
720 *dest = '\0';
721 }
722
723 void
724 _Xsj3cHankakuToZKata(buf, dest, src)
725 Xsj3cBuf buf;
726 register unsigned char *dest, *src;
727 {
728 register unsigned char c;
729 register Xsj3cHKTable *hktp;
730 register Xsj3cZHTable *zhtp;
731 register int len;
732 unsigned char tmp[RBUFSIZ];
733
734 while ((c = *src++) != '\0') {
735 if (iskan1(c, serverIF[buf->server].lang)
736 && iskan2(*src, serverIF[buf->server].lang)) {
737 *dest++ = c;
738 *dest++ = *src++;
739 continue;
740 }
741 if (iskana(c)) {
742 len = 0;
743 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
744 if (len < hktp->hlen && c == *hktp->hkata) {
745 if (hktp->hlen > 1) {
746 if (iskana(*src) && *src == *(hktp->hkata + 1)) {
747 src++;
748 strcpy(tmp, hktp->zkata);
749 len = hktp->hlen;
750 }
751 } else {
752 strcpy(tmp, hktp->zkata);
753 len = hktp->hlen;
754 }
755 }
756 }
757 if (len) {
758 strcpy(dest, tmp);
759 dest += strlen(tmp);
760 } else {
761 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
762 if (c == *zhtp->hkata)
763 break;
764 }
765 if (zhtp != NULL) {
766 *dest++ = *zhtp->zkana;
767 *dest++ = *(zhtp->zkana + 1);
768 } else {
769 *dest++ = c;
770 }
771 }
772 } else {
773 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
774 if (c == *zhtp->hkata)
775 break;
776 }
777 if (zhtp != NULL) {
778 *dest++ = *zhtp->zkana;
779 *dest++ = *(zhtp->zkana + 1);
780 } else {
781 *dest++ = c;
782 }
783 }
784 }
785 *dest = '\0';
786 }
787
788 void
789 _Xsj3cHKataToHira(buf, dest, src)
790 Xsj3cBuf buf;
791 register unsigned char *dest, *src;
792 {
793 register unsigned char c;
794 register Xsj3cHKTable *hktp;
795 register Xsj3cZHTable *zhtp;
796 register int len;
797 unsigned char tmp[RBUFSIZ];
798
799 while ((c = *src++) != '\0') {
800 if (iskan1(c, serverIF[buf->server].lang)
801 && iskan2(*src, serverIF[buf->server].lang)) {
802 *dest++ = c;
803 *dest++ = *src++;
804 continue;
805 }
806 if (iskana(c)) {
807 len = 0;
808 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
809 if (len < hktp->hlen && c == *hktp->hkata) {
810 if (hktp->hlen > 1) {
811 if (iskana(*src) && *src == *(hktp->hkata + 1)) {
812 src++;
813 len = hktp->hlen;
814 strcpy(tmp, hktp->hira);
815 }
816 } else {
817 len = 1;
818 strcpy(tmp, hktp->hira);
819 }
820 }
821 }
822 if (len) {
823 strcpy(dest, tmp);
824 dest += strlen(tmp);
825 } else {
826 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
827 if (c == *zhtp->hkata)
828 break;
829 }
830 if (zhtp != NULL) {
831 *dest++ = *zhtp->zkana;
832 *dest++ = *(zhtp->zkana + 1);
833 } else {
834 *dest++ = c;
835 }
836 }
837 } else {
838 *dest++ = c;
839 }
840 }
841 *dest = '\0';
842 }
843
844 void
845 _Xsj3cHKataToZKata(buf, dest, src)
846 Xsj3cBuf buf;
847 register unsigned char *dest, *src;
848 {
849 register unsigned char c;
850 register Xsj3cHKTable *hktp;
851 register Xsj3cZHTable *zhtp;
852 register int len;
853 unsigned char tmp[RBUFSIZ];
854
855 while ((c = *src++) != '\0') {
856 if (iskan1(c, serverIF[buf->server].lang)
857 && iskan2(*src, serverIF[buf->server].lang)) {
858 *dest++ = c;
859 *dest++ = *src++;
860 continue;
861 }
862 if (iskana(c)) {
863 len = 0;
864 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
865 if (len < hktp->hlen && c == *hktp->hkata) {
866 if (hktp->hlen > 1) {
867 if (iskana(*src) && *src == *(hktp->hkata + 1)) {
868 src++;
869 strcpy(tmp, hktp->zkata);
870 len = hktp->hlen;
871 }
872 } else {
873 strcpy(tmp, hktp->zkata);
874 len = hktp->hlen;
875 }
876 }
877 }
878 if (len) {
879 strcpy(dest, tmp);
880 dest += strlen(tmp);
881 } else {
882 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
883 if (c == *zhtp->hkata)
884 break;
885 }
886 if (zhtp != NULL) {
887 *dest++ = *zhtp->zkana;
888 *dest++ = *(zhtp->zkana + 1);
889 } else {
890 *dest++ = c;
891 }
892 }
893 } else {
894 *dest++ = c;
895 }
896 }
897 *dest = '\0';
898 }
899
900
901 void
902 _Xsj3cZKanaToHKata(buf, dest, src)
903 Xsj3cBuf buf;
904 register unsigned char *dest, *src;
905 {
906 register unsigned char c;
907 register wchar s;
908 register Xsj3cHKTable *hktp;
909 register Xsj3cZHTable *zhtp;
910
911 while ((c = *src++) != '\0') {
912 if (iskan1(c, serverIF[buf->server].lang)
913 && iskan2(*src, serverIF[buf->server].lang)) {
914 s = (c << 8) + *src;
915 if (ishira(s, serverIF[buf->server].lang)) {
916 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
917 if (c == *hktp->hira)
918 if (*src == *(hktp->hira + 1))
919 break;
920 }
921 if (hktp != NULL) {
922 *dest++ = *hktp->hkata;
923 if (hktp->hlen > 1)
924 *dest++ = *(hktp->hkata + 1);
925 } else {
926 *dest++ = c;
927 *dest++ = *src;
928 Xsj3cWarning("wrong sjhk table");
929 }
930 } else if (iskata(s, serverIF[buf->server].lang)) {
931 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
932 if (c == *hktp->zkata)
933 if (*src == *(hktp->zkata + 1))
934 break;
935 }
936 if (hktp != NULL) {
937 *dest++ = *hktp->hkata;
938 if (hktp->hlen > 1)
939 *dest++ = *(hktp->hkata + 1);
940 } else {
941 *dest++ = c;
942 *dest++ = *src;
943 Xsj3cWarning("wrong sjhk table");
944 }
945 } else {
946 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
947 if (c == *zhtp->zkana)
948 if (*src == *(zhtp->zkana + 1))
949 break;
950 }
951 if (zhtp != NULL) {
952 *dest++ = *zhtp->hkata;
953 } else {
954 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
955 if (c == *zhtp->zalpha)
956 if (*src == *(zhtp->zalpha + 1))
957 break;
958 }
959 if (zhtp != NULL) {
960 *dest++ = *zhtp->hkata;
961 } else {
962 *dest++ = c;
963 *dest++ = *src;
964 }
965 }
966 }
967 src++;
968 } else {
969 *dest++ = c;
970 }
971 }
972 *dest = '\0';
973 }
974
975 void
976 _Xsj3cZKataToHira(buf, dest, src)
977 Xsj3cBuf buf;
978 register unsigned char *dest, *src;
979 {
980 register wchar s;
981 register unsigned char c;
982 register Xsj3cHKTable *hktp;
983 register Xsj3cZHTable *zhtp;
984
985 while ((c = *src++) != '\0') {
986 if (iskan1(c, serverIF[buf->server].lang)
987 && iskan2(*src, serverIF[buf->server].lang)) {
988 s = (c << 8) + *src;
989 if (iskata(s, serverIF[buf->server].lang)) {
990 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
991 if (c == *hktp->zkata)
992 if (*src == *(hktp->zkata + 1))
993 break;
994 }
995 if (hktp != NULL) {
996 *dest++ = *hktp->hira;
997 *dest++ = *(hktp->hira + 1);
998 } else {
999 *dest++ = c;
1000 *dest++ = *src;
1001 Xsj3cWarning("wrong sjhk table");
1002 }
1003 } else {
1004 *dest++ = c;
1005 *dest++ = *src;
1006 }
1007 src++;
1008 } else if (isdakuten(c)) {
1009 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
1010 if (c == *zhtp->hkata)
1011 break;
1012 }
1013 if (zhtp != NULL) {
1014 *dest++ = *zhtp->zkana;
1015 *dest++ = *(zhtp->zkana + 1);
1016 } else {
1017 *dest++ = c;
1018 }
1019 } else {
1020 *dest++ = c;
1021 }
1022 }
1023 *dest = '\0';
1024 }
1025
1026 void
1027 _Xsj3cHAlphaToZAlpha(buf, dest, src)
1028 Xsj3cBuf buf;
1029 register unsigned char *dest, *src;
1030 {
1031 register unsigned char c;
1032 register Xsj3cZHTable *zhtp;
1033
1034 while ((c = *src++) != '\0') {
1035 if (iskan1(c, serverIF[buf->server].lang)
1036 && iskan2(*src, serverIF[buf->server].lang)) {
1037 *dest++ = c;
1038 *dest++ = *src++;
1039 continue;
1040 }
1041 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
1042 if (c == *zhtp->halpha)
1043 break;
1044 }
1045 if (zhtp != NULL) {
1046 *dest++ = *zhtp->zalpha;
1047 *dest++ = *(zhtp->zalpha + 1);
1048 } else {
1049 *dest++ = c;
1050 }
1051 }
1052 *dest = '\0';
1053 }
1054
1055 void
1056 _Xsj3cHAlphaToZKana(buf, dest, src)
1057 Xsj3cBuf buf;
1058 register unsigned char *dest, *src;
1059 {
1060 register unsigned char c;
1061 register Xsj3cZHTable *zhtp;
1062
1063 while ((c = *src++) != '\0') {
1064 if (iskan1(c, serverIF[buf->server].lang)
1065 && iskan2(*src, serverIF[buf->server].lang)) {
1066 *dest++ = c;
1067 *dest++ = *src++;
1068 continue;
1069 }
1070 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
1071 if (c == *zhtp->halpha)
1072 break;
1073 }
1074 if (zhtp != NULL) {
1075 *dest++ = *zhtp->zkana;
1076 *dest++ = *(zhtp->zkana + 1);
1077 } else {
1078 *dest++ = c;
1079 }
1080 }
1081 *dest = '\0';
1082 }
1083
1084 void
1085 _Xsj3cHAlphaToHKata(buf, dest, src)
1086 Xsj3cBuf buf;
1087 register unsigned char *dest, *src;
1088 {
1089 register unsigned char c;
1090 register Xsj3cHKTable *hktp;
1091
1092 while ((c = *src++) != '\0') {
1093 if (iskan1(c, serverIF[buf->server].lang)
1094 && iskan2(*src, serverIF[buf->server].lang)) {
1095 *dest++ = c;
1096 *dest++ = *src++;
1097 continue;
1098 }
1099 for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
1100 if (c == *hktp->halpha)
1101 break;
1102 }
1103 if (hktp != NULL) {
1104 *dest++ = *hktp->hkata;
1105 } else {
1106 *dest++ = c;
1107 }
1108 }
1109 *dest = '\0';
1110 }
1111
1112 void
1113 _Xsj3cZAlphaToHAlpha(buf, dest, src)
1114 Xsj3cBuf buf;
1115 register unsigned char *dest, *src;
1116 {
1117 register unsigned char c;
1118 register Xsj3cZHTable *zhtp;
1119
1120 while ((c = *src++) != '\0') {
1121 if (iskan1(c, serverIF[buf->server].lang)
1122 && iskan2(*src, serverIF[buf->server].lang)) {
1123 for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
1124 if (c == *zhtp->zalpha)
1125 if (*src == *(zhtp->zalpha + 1))
1126 break;
1127 }
1128 if (zhtp != NULL) {
1129 *dest++ = *zhtp->halpha;
1130 } else {
1131 *dest++ = c;
1132 *dest++ = *src;
1133 }
1134 src++;
1135 } else {
1136 *dest++ = c;
1137 }
1138 }
1139 *dest = '\0';
1140 }
1141
1142 static void
1143 _Xsj3cLowerToUpper(buf, str)
1144 Xsj3cBuf buf;
1145 register unsigned char *str;
1146 {
1147 register unsigned char c;
1148 register wchar s;
1149
1150 while ((c = *str++) != '\0') {
1151 if (iskan1(c, serverIF[buf->server].lang)
1152 && iskan2(*str, serverIF[buf->server].lang)) {
1153 s = (c << 8) + *str;
1154 if (iszlower(s, serverIF[buf->server].lang)) {
1155 s -= 0x21;
1156 *(str - 1) = (s >> 8);
1157 *str++ = (s & 0xff);
1158 } else {
1159 str++;
1160 }
1161 continue;
1162 }
1163 if (islower(c)) {
1164 *(str - 1) = toupper(c);
1165 }
1166 }
1167 }
1168
1169 static void
1170 _Xsj3cUpperToLower(buf, str)
1171 Xsj3cBuf buf;
1172 register unsigned char *str;
1173 {
1174 register unsigned char c;
1175 register wchar s;
1176
1177 while ((c = *str++) != '\0') {
1178 if (iskan1(c, serverIF[buf->server].lang)
1179 && iskan2(*str, serverIF[buf->server].lang)) {
1180 s = (c << 8) + *str;
1181 if (iszupper(s, serverIF[buf->server].lang)) {
1182 s += 0x21;
1183 *(str - 1) = (s >> 8);
1184 *str++ = (s & 0xff);
1185 } else {
1186 str++;
1187 }
1188 continue;
1189 }
1190 if (isupper(c)) {
1191 *(str - 1) = tolower(c);
1192 }
1193 }
1194 }