comparison lib/Xsj3clib/util.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: 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
92 Xsj3cSetInLang(lang)
93 int lang;
94 {
95 in_lang = lang;
96 }
97
98 /*
99 * Xsj3cSetOutLang()
100 * Set output LANG
101 */
102 void
103 Xsj3cSetOutLang(lang)
104 int lang;
105 {
106 out_lang = lang;
107 }
108
109 /*
110 * Xsj3cSetKanaMod()
111 * Set output LANG
112 */
113 void
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 *
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 *
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
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
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
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
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
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
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
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
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 }