1 #ifndef lint
2 static char *rcsid = "$Id: util.c,v 2.2 1993/09/21 09:42:34 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 <stdio.h>
30 #include "common.h"
31 #include "sj3ctype.h"
32 #include "segment.h"
33 
34 extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
35 
36 int                         in_lang = JP_EUC;
37 int                         out_lang = JP_EUC;
38 int                         locked[SERVER_NUM] = {0};
39 Xsj3ccMode                  KanaMask = 0;
40 
41 void                        Xsj3cSetInLang();
42 void                        Xsj3cSetOutLang();
43 void                        Xsj3cError();
44 void                        Xsj3cWarning();
45 
46 int                         _Xsj3cwPStowOUT();
47 int                         _Xsj3cwOUTtowPS();
48 int                         _Xsj3cmPStowPS();
49 int                         _Xsj3cmPStowOUT();
50 int                         _Xsj3cmPStowPSn();
51 int                         _Xsj3cmPStowOUTn();
52 void                        _Xsj3cwPStomPS();
53 void                        _Xsj3cwOUTtomPS();
54 
55 int                         _Xsj3cCmp();
56 int                         _Xsj3cWcpy();
57 void                        _Xsj3cWcat();
58 int                         _Xsj3cWlen();
59 char                       *_Xsj3cItoa();
60 char                       *_Xsj3cXtoa();
61 
62 void                        _Xsj3cInsertChar();
63 void                        _Xsj3cInsertWchar();
64 void                        _Xsj3cExtractChar();
65 void                        _Xsj3cStoreYomi();
66 int                         _Xsj3cStoreKanji();
67 
68 void                        _Xsj3cFlushDcid();
69 void                        _Xsj3cClearDcid();
70 
71 Xsj3csMode                  _Xsj3cCheckMode();
72 
73 extern wchar                _Xsj3csjis2euc();
74 extern wchar                _Xsj3csjis2jis();
75 extern wchar                _Xsj3ceuc2sjis();
76 extern wchar                _Xsj3ceuc2jis();
77 extern wchar                _Xsj3cjis2sjis();
78 extern wchar                _Xsj3cjis2euc();
79 
80 wchar (*CodeConvFunc[4][4])() = {
81     NULL,            _Xsj3csjis2euc,  _Xsj3csjis2jis,  _Xsj3csjis2jis,
82     _Xsj3ceuc2sjis,  NULL,            _Xsj3ceuc2jis,   _Xsj3ceuc2jis,
83     _Xsj3cjis2sjis,  _Xsj3cjis2euc,   NULL,            NULL,
84     _Xsj3cjis2sjis,  _Xsj3cjis2euc,   NULL,            NULL
85 };
86 
87 /*
88  * Xsj3cSetInLang()
89  *  Set input LANG
90  */
91 void
Xsj3cSetInLang(lang)92 Xsj3cSetInLang(lang)
93     int     lang;
94 {
95     in_lang = lang;
96 }
97 
98 /*
99  * Xsj3cSetOutLang()
100  *  Set output LANG
101  */
102 void
Xsj3cSetOutLang(lang)103 Xsj3cSetOutLang(lang)
104     int     lang;
105 {
106     out_lang = lang;
107 }
108 
109 /*
110  * Xsj3cSetKanaMod()
111  *  Set output LANG
112  */
113 void
Xsj3cSetKanaMod(mod)114 Xsj3cSetKanaMod(mod)
115     unsigned long   mod;
116 {
117     KanaMask = mod;
118 }
119 
120 /*
121  * Xsj3cWarning()
122  *  Print warning messages. (limit of 10 args)
123  */
124 /*VARARGS1*/
125 void
Xsj3cWarning(message,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9)126 Xsj3cWarning(message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9)
127     char   *message;
128     char   *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
129 {
130     (void)fprintf(stderr, "Xsj3cWarning: ");
131     if (message && *message) {
132        (void)fprintf(stderr, message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
133        (void)fprintf(stderr, "\n");
134     }
135     return;
136 }
137 
138 /*
139  * Xsj3cError()
140  *  Print error messages and exit. (limit of 10 args)
141  */
142 /*VARARGS1*/
143 void
Xsj3cError(message,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9)144 Xsj3cError(message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9)
145     char   *message;
146     char   *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
147 {
148     (void)fprintf(stderr, "Xsj3cError: ");
149     if (message && *message) {
150        (void)fprintf(stderr, message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
151        (void)fprintf(stderr, "\n");
152     }
153     exit(1);
154 }
155 
156 /*
157  * _Xsj3cwPStowOUT()
158  *  Convert string(unsigned short) code from process code to out_lang.
159  */
160 int
_Xsj3cwPStowOUT(buf,p,q)161 _Xsj3cwPStowOUT(buf, p, q)
162     Xsj3cBuf                buf;
163     register wchar         *p, *q;
164 {
165     register int            i = 0;
166     register wchar          (*conv)();
167 
168     if (p == NULL)
169         return i;
170     if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
171         while (*q != '\0') {
172             i++;
173             if (iskan1(*q >> 8, serverIF[buf->server].lang)
174                     && iskan2(0xff & *q, serverIF[buf->server].lang)) {
175                 *p++ = conv(*q++);
176                 continue;
177             } else if (iseuckana(*q >> 8)) {
178                 *p++ = 0xff & *q++;
179                 continue;
180             }
181             *p++ = *q++;
182         }
183     } else {
184         while (*p++ = *q++) i++;
185         return i;
186     }
187     *p = '\0';
188     return i;
189 }
190 
191 /*
192  * _Xsj3cwOUTtowPS()
193  *  Convert string(unsigned short) code from out_lang to process code.
194  */
195 int
_Xsj3cwOUTtowPS(buf,p,q)196 _Xsj3cwOUTtowPS(buf, p, q)
197     Xsj3cBuf                buf;
198     register wchar         *p, *q;
199 {
200     register int            i = 0;
201     register wchar          (*conv)();
202 
203     if (p == NULL)
204         return i;
205     if (conv = CodeConvFunc[out_lang][serverIF[buf->server].lang]) {
206         while (*q != '\0') {
207             i++;
208             if (*q & 0xff00) {
209                 *p++ = conv(*q++);
210                 continue;
211             }
212             *p++ = *q++;
213         }
214     } else {
215         while (*p++ = *q++) i++;
216         return i;
217     }
218     *p = '\0';
219     return i;
220 }
221 
222 /*
223  * _Xsj3cCmp()
224  *  Compare 2 words in lower and if they are matched, return True(1).
225  * Unless they are matched, return False(0).
226  */
227 int
_Xsj3cCmp(s1,s2)228 _Xsj3cCmp(s1, s2)
229     register char  *s1, *s2;
230 {
231     register char   c1, c2;
232 
233     while (*s1 != '\0') {
234         c1 = *s1++;
235         c2 = *s2++;
236         if (tolower(c1) != tolower(c2))
237             return 0;
238     }
239     if (s2 && *s2 != '\0')
240         return 0;
241     return 1;
242 }
243 
244 /*
245  * _Xsj3cmPStowPS()
246  *  Multi bytes character(2nd arg.) to wide character(1st arg.)
247  * conversion routine. (Only for Shift-JIS code)
248  */
249 int
_Xsj3cmPStowPS(buf,w,m)250 _Xsj3cmPStowPS(buf, w, m)
251     Xsj3cBuf                    buf;
252     register wchar             *w;
253     register unsigned char     *m;
254 {
255     register unsigned char      c;
256     register int                i = 0;
257 
258     while ((c = *m++) != '\0') {
259         if (iskan1(c, serverIF[buf->server].lang)
260                 && iskan2(*m, serverIF[buf->server].lang)) {
261             *w++ = (c << 8) + *m++;
262         } else {
263             *w++ = 0xff & c;
264         }
265         i++;
266     }
267     *w = '\0';
268     return i;
269 }
270 
271 /*
272  * _Xsj3cmPStowOUT()
273  *  Multi bytes character(2nd arg.) to wide character(1st arg.)
274  * conversion routine.
275  */
276 int
_Xsj3cmPStowOUT(buf,w,m)277 _Xsj3cmPStowOUT(buf, w, m)
278     Xsj3cBuf                    buf;
279     register wchar             *w;
280     register unsigned char     *m;
281 {
282     register unsigned char      c;
283     register int                i = 0;
284     register wchar              (*conv)();
285 
286     if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
287         while ((c = *m++) != '\0') {
288             if (iskan1(c, serverIF[buf->server].lang)
289                     && iskan2(*m, serverIF[buf->server].lang)) {
290                 *w++ = conv((c << 8) + *m++);
291             } else {
292                 *w++ = 0xff & c;
293             }
294             i++;
295         }
296     } else {
297         while ((c = *m++) != '\0') {
298             if (iskan1(c, serverIF[buf->server].lang)
299                     && iskan2(*m, serverIF[buf->server].lang)) {
300                 *w++ = (c << 8) + *m++;
301             } else {
302                 *w++ = 0xff & c;
303             }
304             i++;
305         }
306     }
307     *w = '\0';
308     return i;
309 }
310 
311 /*
312  * _Xsj3cmPStowPSn()
313  *  Multi bytes character(2nd arg.) to wide character(1st arg.)
314  * conversion routine. (Maximum n(3rd arg.) bytes)
315  */
316 int
_Xsj3cmPStowPSn(buf,w,m,n)317 _Xsj3cmPStowPSn(buf, w, m, n)
318     Xsj3cBuf                    buf;
319     register wchar             *w;
320     register unsigned char     *m;
321     register int                n;
322 {
323     register unsigned char      c;
324     register int                i = 0;
325 
326     while ((c = *m++) != '\0' && n--) {
327         if (iskan1(c, serverIF[buf->server].lang)
328                 && iskan2(*m, serverIF[buf->server].lang)) {
329             *w++ = (c << 8) + *m++;
330             n--;
331         } else {
332             *w++ = 0xff & c;
333         }
334         i++;
335     }
336     *w = '\0';
337     return i;
338 }
339 
340 /*
341  * _Xsj3cmPStowOUTn()
342  *  Multi bytes character(2nd arg.) to wide character(1st arg.)
343  * conversion routine. (Maximum n(3rd arg.) bytes)
344  */
345 int
_Xsj3cmPStowOUTn(buf,w,m,n)346 _Xsj3cmPStowOUTn(buf, w, m, n)
347     Xsj3cBuf                    buf;
348     register wchar             *w;
349     register unsigned char     *m;
350     register int                n;
351 {
352     register unsigned char      c;
353     register int                i = 0;
354     register wchar              (*conv)();
355 
356     if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
357         while ((c = *m++) != '\0' && n--) {
358             if (iskan1(c, serverIF[buf->server].lang)
359                     && iskan2(*m, serverIF[buf->server].lang)) {
360                 *w++ = conv((c << 8) + *m++);
361                 n--;
362             } else {
363                 *w++ = 0xff & c;
364             }
365             i++;
366         }
367     } else {
368         while ((c = *m++) != '\0' && n--) {
369             if (iskan1(c, serverIF[buf->server].lang)
370                     && iskan2(*m, serverIF[buf->server].lang)) {
371                 *w++ = (c << 8) + *m++;
372                 n--;
373             } else {
374                 *w++ = 0xff & c;
375             }
376             i++;
377         }
378     }
379     *w = '\0';
380     return i;
381 }
382 
383 /*
384  * _Xsj3cwPStomPS()
385  *  Convert wide character(2nd arg.) to multi bytes characters(1st arg.).
386  * (Only for Shift-JIS code)
387  */
388 void
_Xsj3cwPStomPS(buf,m,w)389 _Xsj3cwPStomPS(buf, m, w)
390     Xsj3cBuf                    buf;
391     register unsigned char     *m;
392     register wchar             *w;
393 {
394     register unsigned char      c1,   c2;
395 
396     while (*w != '\0') {
397         c1 = *w >> 8;
398         c2 = *w & 0xff;
399         if (iskan1(c1, serverIF[buf->server].lang)
400                     && iskan2(c2, serverIF[buf->server].lang)) {
401             *m++ = c1;
402             *m++ = c2;
403         } else {
404             *m++ = c2;
405         }
406         w++;
407     }
408     *m = '\0';
409 }
410 
411 /*
412  * _Xsj3cwOUTtomPS()
413  *  Convert wide character(2nd arg.) to multi bytes characters(1st arg.).
414  */
415 void
_Xsj3cwOUTtomPS(buf,m,w)416 _Xsj3cwOUTtomPS(buf, m, w)
417     Xsj3cBuf                    buf;
418     register unsigned char     *m;
419     register wchar             *w;
420 {
421     register wchar              (*conv)();
422     register wchar              s;
423 
424     if (conv = CodeConvFunc[out_lang][serverIF[buf->server].lang]) {
425         while (*w != '\0') {
426             if (*w & 0xff00) {
427                 s = conv(*w);
428                 *m++ = s >> 8;
429                 *m++ = s & 0xff;
430             } else {
431                 *m++ = (*w & 0xff);
432             }
433             w++;
434         }
435     } else {
436         while (*w != '\0') {
437             if (*w & 0xff00) {
438                 *m++ = *w >> 8;
439                 *m++ = *w & 0xff;
440             } else {
441                 *m++ = *w & 0xff;
442             }
443             w++;
444         }
445     }
446     *m = '\0';
447 }
448 
449 /*
450  * _Xsj3cWcpy()
451  *  Copy wide characters(2nd arg.) to wide characters(1st arg.)
452  */
453 int
_Xsj3cWcpy(w1,w2)454 _Xsj3cWcpy(w1, w2)
455     register wchar             *w1,    *w2;
456 {
457     register int                i = 0;
458 
459     while (*w1++ = *w2++) i++;
460     return i;
461 }
462 
463 /*
464  * _Xsj3cWcat()
465  *  Appends a copy of  wide character(2nd arg.) to
466  * the end of wide character(1st arg.).
467  */
468 void
_Xsj3cWcat(w1,w2)469 _Xsj3cWcat(w1, w2)
470     register wchar             *w1,    *w2;
471 {
472     while (*w1++);
473     w1--;
474     while (*w1++ = *w2++);
475 }
476 
477 /*
478  * _Xsj3cWlen()
479  *  Returns the number of characters in 1st arg.
480  */
481 int
_Xsj3cWlen(w)482 _Xsj3cWlen(w)
483     register wchar             *w;
484 {
485     register int                i = 0;
486 
487     while (*w++)
488         i++;
489     return i;
490 }
491 
492 /*
493  * _Xsj3cItoa()
494  *  Converts digit number to string type and returns it.
495  */
496 char *
_Xsj3cItoa(num)497 _Xsj3cItoa(num)
498     register int                num;
499 {
500     register int                i,  bnum;
501     static char                 ch[24];
502 
503     i = 20;
504     ch[i]= '\0';
505     while (num > 9) {
506         bnum = num;
507         num /= 10;
508         ch[--i] = bnum - num * 10 + '0';
509     }
510     ch[--i] = num + '0';
511     return (&ch[i]);
512 }
513 
514 /*
515  * _Xsj3cXtoa()
516  *  Converts hex number to string type and returns it.
517  */
518 char *
_Xsj3cXtoa(num)519 _Xsj3cXtoa(num)
520     register int                num;
521 {
522     register int                i,  bnum,   anum;
523     static char                 ch[20];
524 
525     i = 18;
526     ch[i]= '\0';
527     while (num) {
528         bnum = num;
529         num >>= 4;
530         if ((anum = (bnum - (num << 4))) > 9)
531             ch[--i] = anum + 'W';
532         else
533             ch[--i] = anum + '0';
534     }
535     ch[--i] = 'x';
536     ch[--i] = '0';
537     return (&ch[i]);
538 }
539 
540 /*
541  * _Xsj3cInsertChar()
542  *  Convert multi bytes characters(2nd arg.) to wide characters and
543  * insert them (n characters) to yomi buffer after current position.
544  * (Only for Shift-JIS code)
545  */
546 void
_Xsj3cInsertChar(buf,seg,m,n)547 _Xsj3cInsertChar(buf, seg, m, n)
548     Xsj3cBuf                    buf;
549     register Xsj3cSeg           seg;
550     register unsigned char     *m;
551     register int                n;
552 {
553     register unsigned char      c;
554     register int                i = seg->num;
555 
556     while (i >= seg->cur) {
557         seg->yomi[i + n] = seg->yomi[i];
558         i--;
559     }
560 
561     i = n;
562     while ((c = *m++) != '\0'&& i--) {
563         if (iskan1(c, serverIF[buf->server].lang)
564                 && iskan2(*m, serverIF[buf->server].lang)) {
565             seg->yomi[seg->cur++] = (c << 8) + *m++;
566         } else {
567             seg->yomi[seg->cur++] = 0xff & c;
568         }
569     }
570     seg->num += n;
571 }
572 
573 /*
574  * _Xsj3cInsertWchar()
575  * insert wide characters to yomi buffer after current position.
576  * (Only for Shift-JIS code)
577  */
578 void
_Xsj3cInsertWchar(seg,w,n)579 _Xsj3cInsertWchar(seg, w, n)
580     register Xsj3cSeg           seg;
581     register wchar             *w;
582     register int                n;
583 {
584     register int                i = seg->num;
585 
586     while (i >= seg->cur) {
587         seg->yomi[i + n] = seg->yomi[i];
588         i--;
589     }
590 
591     i = n;
592     while (*w != '\0' && i--) {
593         seg->yomi[seg->cur++] = *w++;
594     }
595     seg->num += n;
596 }
597 
598 /*
599  * _Xsj3cExtractChar()
600  *  Extract n characters before current postsion from yomi buffer
601  * and convert them to multi bytes character(1st arg.).
602  * (Only for Shift-JIS code)
603  */
604 void
_Xsj3cExtractChar(buf,seg,m,n)605 _Xsj3cExtractChar(buf, seg, m, n)
606     Xsj3cBuf                    buf;
607     register Xsj3cSeg           seg;
608     register unsigned char     *m;
609     register int                n;
610 {
611     register int                i = seg->cur - n,    j = n;
612     register unsigned char      c1,   c2;
613 
614     while ((seg->yomi[i]) != '\0' && j--) {
615         c1 = seg->yomi[i] >> 8;
616         c2 = seg->yomi[i] & 0xff;
617         if (iskan1(c1, serverIF[buf->server].lang)
618                 && iskan2(c2, serverIF[buf->server].lang)) {
619             *m++ = c1;
620             *m++ = c2;
621         } else {
622             *m++ = c2;
623         }
624         i++;
625     }
626     *m = '\0';
627     seg->cur -= n;
628     j = seg->cur;
629     while (i < seg->num) {
630         seg->yomi[j++] = seg->yomi[i++];
631     }
632     seg->yomi[j] = '\0';
633     seg->num -= n;
634 }
635 
636 /*
637  * _Xsj3cStoreYomi()
638  *  Convert code of internal yomi buffer from Shift-JIS to EUC
639  * and put it to display yomi buffer.
640  */
641 void
_Xsj3cStoreYomi(buf,seg,pos)642 _Xsj3cStoreYomi(buf, seg, pos)
643     Xsj3cBuf                    buf;
644     register Xsj3cSeg           seg;
645     register int                pos;
646 {
647     register int                i;
648     register wchar              (*conv)();
649 
650     if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
651         for (i = pos; i < seg->num; i++) {
652             if (seg->yomi[i] & 0xff00)
653                 seg->disp[i] = conv(seg->yomi[i]);
654             else
655                 seg->disp[i] = seg->yomi[i];
656         }
657     } else {
658         for (i = pos; i < seg->num; i++)
659             seg->disp[i] = seg->yomi[i];
660     }
661     seg->disp[i] = '\0';
662     seg->dnum = seg->num;
663 }
664 
665 /*
666  * _Xsj3cStoreKanji()
667  *  Store converted strings to converted display buffers.
668  * (src-buffer and dest-buffer)
669  */
670 int
_Xsj3cStoreKanji(buf,bun,cur,num,change)671 _Xsj3cStoreKanji(buf, bun, cur, num, change)
672     Xsj3cBuf                buf;
673     SJ3_BUNSETU            *bun;
674     int                     cur,    num,    change;
675 {
676     register int            i,  j;
677 
678     if (num > 1) {
679         for (i = buf->segnum - 1; i > cur; i--) {
680             j = i + num - 1;
681             buf->input[j] = buf->input[i];
682         }
683         for (i = cur + 1; i < cur + num; i++)
684             buf->input[i] = NULL;
685     }
686     for (i = cur; i < cur + num; i++, bun++) {
687         if (!buf->input[i])
688             buf->input[i] = (Xsj3cSeg)Xsj3cCreateSegment(buf);
689         else
690             Xsj3cResizeSegment(buf->input[i], KANABUFSIZ);
691         buf->input[i]->num = _Xsj3cmPStowPSn(buf, buf->input[i]->yomi,
692                 bun->srcstr, bun->srclen);
693         if (bun->deststr && bun->destlen) {
694             buf->input[i]->dnum = _Xsj3cmPStowOUTn(buf, buf->input[i]->disp,
695                     bun->deststr, bun->destlen);
696         } else {
697             _Xsj3cStoreYomi(buf, buf->input[i], 0);
698         }
699         buf->input[i]->status = SEG_CONVED;
700         buf->input[i]->cur = 0;
701         buf->input[i]->change = change;
702         buf->input[i]->edit = SEG_NOEDIT;
703         buf->input[i]->dcid = bun->dcid;
704         buf->input[i]->cursegmode = _Xsj3cCheckMode(buf, buf->input[i]);
705     }
706     if (buf->gakusyuu && buf->convmode == InputModeMask) {
707         serverIF[buf->server].func[FUNC_LOCK]();
708         locked[buf->server]++;
709     } else if (!buf->gakusyuu) {
710         for (i = cur; i < num; i++)
711             bzero(&(buf->input[i]->dcid), sizeof(buf->input[i]->dcid));
712     }
713 }
714 
715 /*
716  * _Xsj3cCheckMode()
717  *  Check character mode of the yomi buffer of segment.
718  */
719 Xsj3csMode
_Xsj3cCheckMode(buf,seg)720 _Xsj3cCheckMode(buf, seg)
721     Xsj3cBuf                    buf;
722     register Xsj3cSeg           seg;
723 {
724     register unsigned char      c1, c2;
725 
726     c1 = seg->yomi[0] >> 8;
727     c2 = seg->yomi[0] & 0xff;
728     if (c2 != '\0') {
729         if (iskan1(c1, serverIF[buf->server].lang)
730                 && iskan2(c2, serverIF[buf->server].lang)) {
731             if (iskata(seg->yomi[0], serverIF[buf->server].lang))
732                 return (MODE_ZKATA);
733             else if (iszalpha(seg->yomi[0], serverIF[buf->server].lang))
734                 return (MODE_ZALPHA);
735             else
736                 return (MODE_HIRA);
737         } else {
738             if (iskana(c2))
739                 return (MODE_HKATA);
740             else
741                 return (MODE_HALPHA);
742         }
743     } else {
744         return (MODE_HIRA);
745     }
746 }
747 
748 /*
749  * _Xsj3cFlushDcid()
750  *  Flush dictionary-id.
751  */
752 void
_Xsj3cFlushDcid(buf)753 _Xsj3cFlushDcid(buf)
754     Xsj3cBuf        buf;
755 {
756     register int    i;
757     unsigned char   mbs[2][KANJIBUFSIZ];
758 
759     if (buf->gakusyuu) {
760         for (i = 0; i < buf->segnum; i++) {
761             if (buf->input[i]->change) {
762                 if (i < buf->segnum - 1) {
763                     _Xsj3cwPStomPS(buf, mbs[0], buf->input[i]->yomi);
764                     _Xsj3cwPStomPS(buf, mbs[1], buf->input[i + 1]->yomi);
765                     if ((serverIF[buf->server].func[FUNC_STUDY2]
766             (mbs[0], mbs[1], &buf->input[i + 1]->dcid)) < 0) {
767                         Xsj3cWarning("sj3serv is down. reconnect please");
768                     }
769                 }
770                 if (i) {
771                     if (i == buf->segnum - 1)
772                         _Xsj3cwPStomPS(buf, mbs[0], buf->input[i]->yomi);
773                     _Xsj3cwPStomPS(buf, mbs[1], buf->input[i - 1]->yomi);
774                     if ((serverIF[buf->server].func[FUNC_STUDY2]
775             (mbs[1], mbs[0], &buf->input[i]->dcid)) < 0) {
776                         Xsj3cWarning("sj3serv is down. reconnect please");
777                     }
778                 } else if (buf->segnum == 1) {
779                     _Xsj3cwPStomPS(buf, mbs[0], buf->input[0]->yomi);
780                     if ((serverIF[buf->server].func[FUNC_STUDY2]
781             (mbs[0], mbs[0], &buf->input[0]->dcid)) < 0) {
782                         Xsj3cWarning("sj3serv is down. reconnect please");
783                     }
784                 }
785                 buf->input[i]->change = OFF;
786             }
787         }
788         buf->convedsegnum = 0;
789         if (locked[buf->server] > 0) {
790             if (!(--locked[buf->server]))
791             serverIF[buf->server].func[FUNC_UNLOCK]();
792         }
793     }
794 }
795 
796 /*
797  * _Xsj3cClearDcid()
798  *  Clear dictionary-id.
799  */
800 void
_Xsj3cClearDcid(buf)801 _Xsj3cClearDcid(buf)
802     Xsj3cBuf        buf;
803 {
804     register int    i;
805 
806     for (i = 0; i < buf->segnum; i++) {
807         buf->input[i]->change = OFF;
808         bzero(&(buf->input[i]->dcid), sizeof(buf->input[i]->dcid));
809     }
810     if (locked[buf->server] > 0) {
811         if (!(--locked[buf->server]))
812         serverIF[buf->server].func[FUNC_UNLOCK]();
813     }
814 }
815