Mercurial > kinput2.yaz
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 } |