1 /*
2 * Copyright (c) 1991-1994 Sony Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 * IN NO EVENT SHALL SONY CORPORATION BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Except as contained in this notice, the name of Sony Corporation
24 * shall not be used in advertising or otherwise to promote the sale, use
25 * or other dealings in this Software without prior written authorization
26 * from Sony Corporation.
27 *
28 */
29
30 /*
31 * $SonyRCSfile: sj.c,v $
32 * $SonyRevision: 1.2 $
33 * $SonyDate: 1994/12/09 11:27:09 $
34 */
35
36
37
38 #define SJ3LIB_INTERNAL
39
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43 #include <locale.h>
44 #include <pwd.h>
45 #include <setjmp.h>
46 #include <sys/types.h>
47 #include <sys/file.h>
48 #include <ctype.h>
49 #include <unistd.h>
50 #include "sj_const.h"
51 #include "Const.h"
52 #include "sj3err.h"
53 #include "sj3lowlib.h"
54 #include "sj3lib.h"
55 #include "sj_hinsi.h"
56
57 #ifdef __sony_news
58 extern int _sys_code;
59 #else
60 #define SYS_SJIS 0
61 #define SYS_EUC 1
62 #define SYS_NOTDEF -1
63 static int _sys_code = SYS_NOTDEF;
64 #endif /* __sony_news */
65
66 #ifndef lint
67 static char rcsid_sony[] = "$Header: /export/work/contrib/sj3/sj3lib/RCS/sj.c,v 1.14 1994/06/03 07:42:13 notanaka Exp $ SONY;";
68 #endif
69
70 char *sj3_user_dir = "user";
71 static char *path_delimiter = "/";
72 static SJ3_CLIENT_ENV client = { -1, 0 };
73 static long mdicid = 0;
74 static long udicid = 0;
75 static int defuse = 0;
76 static long *dicid_list = NULL;
77 static int dicid_num = 0;
78
79 static u_char buf1[YomiBufSize];
80 static u_char buf2[YomiBufSize];
81 static u_char kbuf[KanjiBufSize];
82
83 #ifndef __sony_news
84 static int
set_sys_code()85 set_sys_code()
86 {
87 char *loc;
88
89 loc = setlocale(LC_CTYPE, NULL);
90 if (strcmp(loc, "ja_JP.SJIS") == 0)
91 return SYS_SJIS;
92
93 return SYS_EUC;
94 }
95 #endif
96
97
make_dirs(path)98 static make_dirs(path)
99 char *path;
100 {
101 char tmp[PathNameLen];
102 char *p;
103 int i;
104
105 for (p = path ; *p ; p++) {
106 if (*p != *path_delimiter) continue;
107
108 strncpy(tmp, path, (i = p - path));
109 tmp[i] = '\0';
110 if (sj3_access(&client, tmp, F_OK) != ERROR) continue;
111 if (sj3_error_number == SJ3_ServerDown) return ERROR;
112
113 if (sj3_make_directory(&client, tmp) == ERROR) return ERROR;
114 }
115 return 0;
116 }
117
118
119 int
sj3_open(char * host,char * user)120 sj3_open(char *host, char *user)
121 {
122 char tmp[PathNameLen];
123 char userdir[PathNameLen];
124 char userdict[PathNameLen];
125 char userstudy[PathNameLen];
126 char *p;
127 int err = SJ3_NORMAL_END;
128
129 if (client.fd != -1) return SJ3_ALREADY_CONNECTED;
130
131 snprintf(tmp, sizeof(tmp), "%d.sj3lib", getpid());
132 if (sj3_make_connection(&client, host, user, tmp) == ERROR) {
133 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
134 client.fd = -1; return SJ3_CONNECT_ERROR;
135 }
136
137 if (client.stdy_size > SJ3_WORD_ID_SIZE) {
138 sj3_erase_connection(&client);
139 return SJ3_CONNECT_ERROR;
140 }
141
142 mdicid = sj3_open_dictionary(&client, MainDictionary, NULL);
143 if (mdicid == 0) {
144 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
145 err |= SJ3_CANNOT_OPEN_MDICT;
146 }
147
148 if (sj3_user_dir[strlen(sj3_user_dir) - 1] != *path_delimiter)
149 snprintf(userdir, sizeof(userdir), "%s%s%s%s", sj3_user_dir, path_delimiter, user, path_delimiter);
150 else
151 snprintf(userdir, sizeof(userdir), "%s%s%s", sj3_user_dir, user, path_delimiter);
152
153 if (make_dirs(userdir) == ERROR) {
154 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
155 return (err | SJ3_CANNOT_MAKE_UDIR);
156 }
157
158 snprintf(userdict, sizeof(userdict), "%s%s", userdir, UserDictionary);
159 if (sj3_access(&client, userdict, F_OK) == ERROR) {
160 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
161 if (sj3_make_dict_file(&client, userdict, DefIdxLen,
162 DefSegLen, DefSegNum) == ERROR) {
163 if (sj3_error_number == SJ3_ServerDown)
164 goto server_dead;
165 err |= SJ3_CANNOT_MAKE_UDICT;
166 }
167 }
168 udicid = sj3_open_dictionary(&client, userdict, "");
169 if (udicid == 0) {
170 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
171 err |= SJ3_CANNOT_OPEN_UDICT;
172 }
173
174 snprintf(userstudy, sizeof(userdict), "%s%s", userdir, StudyFile);
175 if (sj3_access(&client, userstudy, F_OK) == ERROR) {
176 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
177 if (sj3_make_study_file(&client, userstudy, DefStyNum, DefClStep,
178 DefClLen) == ERROR) {
179 if (sj3_error_number == SJ3_ServerDown)
180 goto server_dead;
181 err |= SJ3_CANNOT_MAKE_STUDY;
182 }
183 }
184 if (sj3_open_study_file(&client, userstudy, "") == ERROR) {
185 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
186 err |= SJ3_CANNOT_OPEN_STUDY;
187 }
188
189 return err;
190
191 server_dead:
192 mdicid = udicid = 0;
193 return SJ3_SERVER_DEAD;
194 }
195
196 int
sj3_open_with_list(char * host,char * user,int dicts_num,char ** dicts,int * error_num,int ** error_index)197 sj3_open_with_list(char *host, char *user, int dicts_num, char **dicts, int *error_num, int **error_index)
198 {
199 char tmp[PathNameLen];
200 char userdir[PathNameLen];
201 char userdict[PathNameLen];
202 char userstudy[PathNameLen];
203 char *p;
204 int err = SJ3_NORMAL_END;
205 int i, err_id_num = 0;
206 long *dict_idx;
207
208 if (client.fd != -1) return SJ3_ALREADY_CONNECTED;
209
210 snprintf(tmp, sizeof(tmp), "%d.sj3lib", getpid());
211 if (sj3_make_connection(&client, host, user, tmp) == ERROR) {
212 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
213 client.fd = -1; return SJ3_CONNECT_ERROR;
214 }
215
216 if (client.stdy_size > SJ3_WORD_ID_SIZE) {
217 sj3_erase_connection(&client);
218 return SJ3_CONNECT_ERROR;
219 }
220
221 if ((dicts_num > 0) && dicts) {
222 if (!(dict_idx = (long *)malloc(sizeof(long) * dicts_num * 2))) {
223 return SJ3_CONNECT_ERROR;
224 }
225 memset(dict_idx, 0, sizeof(long) * dicts_num * 2);
226 dicid_num = dicts_num;
227 dicid_list = dict_idx;
228 err_id_num = 0;
229 for (i = 0; i < dicts_num; i++) {
230 dict_idx[i] = sj3_open_dictionary(&client, dicts[i], NULL);
231 if (dict_idx[i] == 0) {
232 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
233 dict_idx[dicts_num + err_id_num] = i;
234 err_id_num++;
235 } else if (mdicid == 0) {
236 mdicid = dict_idx[i];
237 }
238 }
239
240 if (err_id_num == dicts_num) {
241 err |= SJ3_CANNOT_OPEN_MDICT;
242 mdicid = 0;
243 }
244 if (error_num) *error_num = err_id_num;
245 if (error_index) *error_index = (int *) &(dict_idx[dicts_num]);
246 }
247
248 if (sj3_user_dir[strlen(sj3_user_dir) - 1] != *path_delimiter)
249 snprintf(userdir, sizeof(userdir), "%s%s%s%s", sj3_user_dir, path_delimiter, user, path_delimiter);
250 else
251 snprintf(userdir, sizeof(userdir), "%s%s%s", sj3_user_dir, user, path_delimiter);
252 if (make_dirs(sj3_user_dir) == ERROR) {
253 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
254 return (err | SJ3_CANNOT_MAKE_UDIR);
255 }
256
257 snprintf(userdict, sizeof(userdict), "%s%s", userdir, UserDictionary);
258 if (sj3_access(&client, userdict, F_OK) == ERROR) {
259 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
260 if (sj3_make_dict_file(&client, userdict, DefIdxLen,
261 DefSegLen, DefSegNum) == ERROR) {
262 if (sj3_error_number == SJ3_ServerDown)
263 goto server_dead;
264 err |= SJ3_CANNOT_MAKE_UDICT;
265 }
266 }
267
268 udicid = sj3_open_dictionary(&client, userdict, "");
269 if (udicid == 0) {
270 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
271 err |= SJ3_CANNOT_OPEN_UDICT;
272 }
273
274 snprintf(userstudy, sizeof(userdict), "%s%s", userdir, StudyFile);
275 if (sj3_access(&client, userstudy, F_OK) == ERROR) {
276 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
277 if (sj3_make_study_file(&client, userstudy, DefStyNum, DefClStep,
278 DefClLen) == ERROR) {
279 if (sj3_error_number == SJ3_ServerDown)
280 goto server_dead;
281 err |= SJ3_CANNOT_MAKE_STUDY;
282 }
283 }
284 if (sj3_open_study_file(&client, userstudy, "") == ERROR) {
285 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
286 err |= SJ3_CANNOT_OPEN_STUDY;
287 }
288
289 return err;
290
291 server_dead:
292 if (dict_idx) {
293 free(dict_idx);
294 dict_idx = NULL;
295 if (error_num) *error_num = 0;
296 if (error_index) *error_index = NULL;
297 }
298 mdicid = udicid = 0;
299 return SJ3_SERVER_DEAD;
300 }
301 int
sj3_close()302 sj3_close()
303 {
304 int err = SJ3_NORMAL_END;
305 int i;
306
307 if (client.fd == -1) return SJ3_NOT_CONNECTED;
308
309 if (mdicid == 0)
310 err |= SJ3_NOT_OPENED_MDICT;
311 else if (dicid_list) {
312 for (i = 0; i < dicid_num; i++) {
313 if (sj3_close_dictionary(&client, dicid_list[i]) == ERROR) {
314 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
315 err |= SJ3_CLOSE_MDICT_ERROR;
316 }
317 }
318 free(dicid_list);
319 dicid_list = NULL;
320 dicid_num = 0;
321 } else if (sj3_close_dictionary(&client, mdicid) == ERROR) {
322 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
323 err |= SJ3_CLOSE_MDICT_ERROR;
324 }
325 mdicid = 0;
326
327 if (udicid == 0)
328 err |= SJ3_NOT_OPENED_UDICT;
329 else if (sj3_close_dictionary(&client, udicid) == ERROR) {
330 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
331 err |= SJ3_CLOSE_UDICT_ERROR;
332 }
333 udicid = 0;
334
335 if (sj3_close_study_file(&client) == ERROR) {
336 switch (sj3_error_number) {
337 case SJ3_ServerDown:
338 goto server_dead;
339
340 case SJ3_StdyFileNotOpened:
341 err |= SJ3_NOT_OPENED_STUDY; break;
342
343 default:
344 err |= SJ3_CLOSE_STUDY_ERROR; break;
345 }
346 }
347
348 if (sj3_erase_connection(&client)) {
349 if (sj3_error_number == SJ3_ServerDown) goto server_dead;
350 err |= SJ3_DISCONNECT_ERROR;
351 }
352
353 return err;
354
355 server_dead:
356 if (dicid_list) {
357 free(dicid_list);
358 dicid_list = NULL;
359 }
360 dicid_num = 0;
361 mdicid = udicid = 0;
362 return SJ3_SERVER_DEAD;
363 }
364
365
366 int
sj3_getkan(u_char * yomi,SJ3_BUNSETU * bun,u_char * knj,int knjsiz)367 sj3_getkan(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz)
368 {
369 u_char *src;
370 int buncnt = 0;
371 int len;
372 int stysiz = client.stdy_size;
373
374 if ((len = strlen(yomi)) > SJ3_IKKATU_YOMI) return 0;
375
376 while (*yomi) {
377 len = sj3_ikkatu_henkan(&client, yomi, knj, knjsiz, MBCODE_SJIS);
378 if (len == ERROR) {
379 if (client.fd < 0) {
380 mdicid = udicid = 0;
381 return -1;
382 }
383
384 return 0;
385 }
386 else if (len == 0)
387 break;
388
389 src = knj;
390 while (*src) {
391 bun -> srclen = *src++;
392 memcpy(&(bun -> dcid), src, stysiz);
393 src += stysiz;
394 bun -> destlen = strlen(src);
395 bun -> srcstr = yomi;
396 bun -> deststr = knj;
397 while (*src) *knj++ = *src++;
398 knjsiz -= bun -> destlen;
399 src++;
400 yomi += bun -> srclen;
401 bun++;
402 buncnt++;
403 }
404 *knj = 0;
405 }
406
407 if (*yomi) {
408 bun -> srclen = strlen(yomi);
409 bun -> srcstr = yomi;
410 bun -> destlen = 0;
411 bun -> deststr = NULL;
412 memset(&(bun -> dcid), '\0', sizeof(bun -> dcid));
413 buncnt++;
414 }
415
416 return buncnt;
417 }
418 int
sj3_getkan_euc(u_char * yomi,SJ3_BUNSETU * bun,u_char * knj,int knjsiz)419 sj3_getkan_euc(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz)
420 {
421 u_char *src, *yp, *kp, *khp;
422 int buncnt = 0, i;
423 int len, flag, mflag = 0;
424 int stysiz = client.stdy_size;
425 int sentou, saigo;
426 int knjorg = knjsiz;
427 SJ3_BUNSETU *hbun = bun;
428
429 if ((len = strlen(yomi)) > SJ3_IKKATU_YOMI) return 0;
430 if (client.svr_version == 1) {
431 defuse = 0;
432 len = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse);
433 if ((len < 0) || defuse) return 0;
434 yp = buf1;
435 if (knjsiz > sizeof(kbuf)) {
436 mflag = 1;
437 kp = khp = (u_char *) malloc(knjsiz);
438 } else {
439 kp = khp = kbuf;
440 }
441 flag = MBCODE_SJIS;
442 } else {
443 yp = yomi;
444 kp = knj;
445 flag = MBCODE_EUC;
446 }
447
448 while (*yp) {
449 len = sj3_ikkatu_henkan(&client, yp, kp, knjsiz, flag);
450 if (len == ERROR) {
451 if (client.fd < 0) {
452 mdicid = udicid = 0;
453 return -1;
454 }
455
456 return 0;
457 }
458 else if (len == 0)
459 break;
460
461 src = kp;
462 while (*src) {
463 bun -> srclen = *src++;
464 memcpy(&(bun -> dcid), src, stysiz);
465 src += stysiz;
466 bun -> destlen = strlen(src);
467 bun -> srcstr = yp;
468 bun -> deststr = kp;
469 while (*src) *kp++ = *src++;
470 knjsiz -= bun -> destlen;
471 src++;
472 yp += bun -> srclen;
473 bun++;
474 buncnt++;
475 }
476 *kp = 0;
477 }
478
479 if (*yp) {
480 bun -> srclen = strlen(yp);
481 bun -> srcstr = yp;
482 bun -> destlen = 0;
483 bun -> deststr = NULL;
484 memset(&(bun -> dcid), '\0', sizeof(bun -> dcid));
485 buncnt++;
486 }
487
488 if (client.svr_version == 1) {
489 kp = khp;
490 yp = buf1;
491 bun = hbun;
492 defuse = 0;
493 len = sj3_str_sjistoeuc(knj, knjorg, kp, client.default_char, &defuse);
494 if ((len < 0) || defuse) return 0;
495 for(i = 0; i < buncnt; i++) {
496 sentou = sj3_sjistoeuclen(yp, bun[i].srcstr - yp);
497 saigo = sj3_sjistoeuclen(bun[i].srcstr, bun[i].srclen);
498 bun[i].srclen = saigo;
499 bun[i].srcstr = yomi + sentou;
500 sentou = sj3_sjistoeuclen(kp, bun[i].deststr - kp);
501 saigo = sj3_sjistoeuclen(bun[i].deststr, bun[i].destlen);
502 bun[i].destlen = saigo;
503 bun[i].deststr = knj + sentou;
504 }
505 if (mflag) {
506 free(khp);
507 mflag = 0;
508 }
509 }
510
511 return buncnt;
512 }
513
514 int
sj3_getkan_mb(u_char * yomi,SJ3_BUNSETU * bun,u_char * knj,int knjsiz)515 sj3_getkan_mb(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz)
516 {
517 #ifndef __sony_news
518 if (_sys_code == SYS_NOTDEF)
519 _sys_code = set_sys_code();
520 #endif
521 if (_sys_code == SYS_EUC)
522 return sj3_getkan_euc(yomi, bun, knj, knjsiz);
523 else
524 return sj3_getkan(yomi, bun, knj, knjsiz);
525 }
526
527
528
sj3_douoncnt(u_char * yomi)529 sj3_douoncnt(u_char *yomi)
530 {
531 int i;
532
533 if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0;
534
535 i = sj3_bunsetu_kouhosuu(&client, yomi, i, MBCODE_SJIS);
536 if (i == ERROR) {
537 if (client.fd < 0) {
538 mdicid = udicid = 0;
539 return -1;
540 }
541
542 return 0;
543 }
544
545 return i;
546 }
547 int
sj3_douoncnt_euc(u_char * yomi)548 sj3_douoncnt_euc(u_char *yomi)
549 {
550 int i, l, flag;
551 u_char *yp;
552
553 if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0;
554
555 if (client.svr_version == 1) {
556 defuse = 0;
557 l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse);
558 if ((l < 0) || defuse) return 0;
559 yp = buf1;
560 flag = MBCODE_SJIS;
561 } else {
562 yp = yomi;
563 flag = MBCODE_EUC;
564 }
565 i = sj3_bunsetu_kouhosuu(&client, yp, i, flag);
566 if (i == ERROR) {
567 if (client.fd < 0) {
568 mdicid = udicid = 0;
569 return -1;
570 }
571
572 return 0;
573 }
574
575 return i;
576 }
577
578 int
sj3_douoncnt_mb(u_char * yomi)579 sj3_douoncnt_mb(u_char *yomi)
580 {
581 #ifndef __sony_news
582 if (_sys_code == SYS_NOTDEF)
583 _sys_code = set_sys_code();
584 #endif
585 if (_sys_code == SYS_EUC)
586 return sj3_douoncnt_euc(yomi);
587 else
588 return sj3_douoncnt(yomi);
589 }
590
591
592
593 int
sj3_getdouon(u_char * yomi,SJ3_DOUON * dou)594 sj3_getdouon(u_char *yomi, SJ3_DOUON *dou)
595 {
596 int i;
597
598 if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0;
599
600 i = sj3_bunsetu_zenkouho(&client, yomi, i, dou, MBCODE_SJIS);
601 if (i == ERROR) {
602 if (client.fd < 0) {
603 mdicid = udicid = 0;
604 return -1;
605 }
606 return 0;
607 }
608
609 return i;
610 }
611 int
sj3_getdouon_euc(u_char * yomi,SJ3_DOUON * dou)612 sj3_getdouon_euc(u_char *yomi, SJ3_DOUON *dou)
613 {
614 int i, j, l;
615
616 if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0;
617
618 if (client.svr_version == 1) {
619 defuse = 0;
620 l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse);
621 if ((l < 0) || defuse) return 0;
622 i = sj3_bunsetu_zenkouho(&client, buf1, i, dou, MBCODE_SJIS);
623 if (i == ERROR) {
624 if (client.fd < 0) {
625 mdicid = udicid = 0;
626 return -1;
627 }
628 return 0;
629 }
630 for (j = 0; j < i; j++) {
631 defuse = 0;
632 l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf),
633 dou[j].ddata, client.default_char, &defuse);
634 if ((l < 0) || defuse) return 0;
635 (void)memcpy(dou[j].ddata, kbuf, l+1);
636 dou[j].dlen = l;
637 }
638 } else {
639 i = sj3_bunsetu_zenkouho(&client, yomi, i, dou, MBCODE_EUC);
640 if (i == ERROR) {
641 if (client.fd < 0) {
642 mdicid = udicid = 0;
643 return -1;
644 }
645 return 0;
646 }
647 }
648 return i;
649 }
650 int
sj3_getdouon_mb(u_char * yomi,SJ3_DOUON * dou)651 sj3_getdouon_mb(u_char *yomi, SJ3_DOUON *dou)
652 {
653 #ifndef __sony_news
654 if (_sys_code == SYS_NOTDEF)
655 _sys_code = set_sys_code();
656 #endif
657 if (_sys_code == SYS_EUC)
658 return sj3_getdouon_euc(yomi, dou);
659 else
660 return sj3_getdouon(yomi, dou);
661 }
662
663 int
sj3_gakusyuu(SJ3_STUDYREC * dcid)664 sj3_gakusyuu(SJ3_STUDYREC *dcid)
665 {
666 if (sj3_tango_gakusyuu(&client, dcid) == ERROR) {
667 if (client.fd < 0) {
668 mdicid = udicid = 0;
669 return -1;
670 }
671 return 1;
672 }
673 return 0;
674 }
675
676 int
sj3_gakusyuu2(u_char * yomi1,u_char * yomi2,SJ3_STUDYREC * dcid)677 sj3_gakusyuu2(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid)
678 {
679 if (sj3_bunsetu_gakusyuu(&client, yomi1, yomi2, dcid, MBCODE_SJIS) == ERROR) {
680 if (client.fd < 0) {
681 mdicid = udicid = 0;
682 return -1;
683 }
684 return 1;
685 }
686 return 0;
687 }
688 int
sj3_gakusyuu2_euc(u_char * yomi1,u_char * yomi2,SJ3_STUDYREC * dcid)689 sj3_gakusyuu2_euc(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid)
690 {
691 int l, flag;
692 u_char *y1p, *y2p;
693
694 if (client.svr_version == 1) {
695 defuse = 0;
696 l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi1, client.default_char, &defuse);
697 if ((l < 0) || defuse) return 1;
698 defuse = 0;
699 l = sj3_str_euctosjis(buf2, sizeof(buf2), yomi2, client.default_char, &defuse);
700 if ((l < 0) || defuse) return 1;
701 y1p = buf1;
702 y2p = buf2;
703 flag = MBCODE_SJIS;
704 } else {
705 y1p = yomi1;
706 y2p = yomi2;
707 flag = MBCODE_EUC;
708 }
709 if (sj3_bunsetu_gakusyuu(&client, y1p, y2p, dcid, flag) == ERROR) {
710 if (client.fd < 0) {
711 mdicid = udicid = 0;
712 return -1;
713 }
714 return 1;
715 }
716 return 0;
717 }
718 int
sj3_gakusyuu2_mb(u_char * yomi1,u_char * yomi2,SJ3_STUDYREC * dcid)719 sj3_gakusyuu2_mb(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid)
720 {
721 #ifndef __sony_news
722 if (_sys_code == SYS_NOTDEF)
723 _sys_code = set_sys_code();
724 #endif
725 if (_sys_code == SYS_EUC)
726 return sj3_gakusyuu2_euc(yomi1, yomi2, dcid);
727 else
728 return sj3_gakusyuu2(yomi1, yomi2, dcid);
729 }
730
731 int
sj3_touroku(u_char * yomi,u_char * kanji,int code)732 sj3_touroku(u_char *yomi, u_char *kanji, int code)
733 {
734 if (sj3_tango_touroku(&client, udicid, yomi, kanji, code, MBCODE_SJIS)) {
735 if (client.fd < 0) {
736 mdicid = udicid = 0;
737 return -1;
738 }
739 switch (sj3_error_number) {
740 case SJ3_NoSuchDict:
741 case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR;
742 case SJ3_DictLocked: return SJ3_DICT_LOCKED;
743 case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR;
744 case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR;
745 case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE;
746 case SJ3_AlreadyExistWord: return SJ3_WORD_EXIST;
747 case SJ3_NoMoreDouonWord: return SJ3_DOUON_FULL;
748 case SJ3_NoMoreUserDict: return SJ3_DICT_FULL;
749 case SJ3_NoMoreIndexBlock: return SJ3_INDEX_FULL;
750 default: return SJ3_TOUROKU_FAILED;
751 }
752 }
753
754 return 0;
755 }
756 int
sj3_touroku_euc(u_char * yomi,u_char * kanji,int code)757 sj3_touroku_euc(u_char *yomi, u_char *kanji, int code)
758 {
759 int l, flag;
760 u_char *yp;
761 u_char *kp;
762 if (client.svr_version == 1) {
763 defuse = 0;
764 l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse);
765 if ((l < 0) || defuse) return SJ3_BAD_YOMI_STR;
766 defuse = 0;
767 l = sj3_str_euctosjis(kbuf, sizeof(kbuf), kanji, client.default_char, &defuse);
768 if ((l < 0) || defuse) return SJ3_BAD_KANJI_STR;
769 yp = buf1;
770 kp = kbuf;
771 flag = MBCODE_SJIS;
772 } else {
773 yp = yomi;
774 kp = kanji;
775 flag = MBCODE_EUC;
776 }
777 if (sj3_tango_touroku(&client, udicid, yp, kp, code, flag)) {
778 if (client.fd < 0) {
779 mdicid = udicid = 0;
780 return -1;
781 }
782 switch (sj3_error_number) {
783 case SJ3_NoSuchDict:
784 case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR;
785 case SJ3_DictLocked: return SJ3_DICT_LOCKED;
786 case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR;
787 case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR;
788 case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE;
789 case SJ3_AlreadyExistWord: return SJ3_WORD_EXIST;
790 case SJ3_NoMoreDouonWord: return SJ3_DOUON_FULL;
791 case SJ3_NoMoreUserDict: return SJ3_DICT_FULL;
792 case SJ3_NoMoreIndexBlock: return SJ3_INDEX_FULL;
793 default: return SJ3_TOUROKU_FAILED;
794 }
795 }
796
797 return 0;
798 }
799 int
sj3_touroku_mb(u_char * yomi,u_char * kanji,int code)800 sj3_touroku_mb(u_char *yomi, u_char *kanji, int code)
801 {
802 #ifndef __sony_news
803 if (_sys_code == SYS_NOTDEF)
804 _sys_code = set_sys_code();
805 #endif
806 if (_sys_code == SYS_EUC)
807 return sj3_touroku_euc(yomi, kanji, code);
808 else
809 return sj3_touroku(yomi, kanji, code);
810 }
811
812 int
sj3_syoukyo(u_char * yomi,u_char * kanji,int code)813 sj3_syoukyo(u_char *yomi, u_char *kanji, int code)
814 {
815 if (sj3_tango_sakujo(&client, udicid, yomi, kanji, code, MBCODE_SJIS)) {
816 if (client.fd < 0) {
817 mdicid = udicid = 0;
818 return -1;
819 }
820 switch (sj3_error_number) {
821 case SJ3_NoSuchDict:
822 case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR;
823 case SJ3_DictLocked: return SJ3_DICT_LOCKED;
824 case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR;
825 case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR;
826 case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE;
827 case SJ3_NoSuchWord: return SJ3_WORD_NOT_EXIST;
828 default: return SJ3_SYOUKYO_FAILED;
829 }
830 }
831 return 0;
832 }
833 int
sj3_syoukyo_euc(u_char * yomi,u_char * kanji,int code)834 sj3_syoukyo_euc(u_char *yomi, u_char *kanji, int code)
835 {
836 int l, flag;
837 u_char *yp;
838 u_char *kp;
839 if (client.svr_version == 1) {
840 defuse = 0;
841 l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse);
842 if ((l < 0) || defuse) return SJ3_BAD_YOMI_STR;
843 defuse = 0;
844 l = sj3_str_euctosjis(kbuf, sizeof(kbuf), kanji, client.default_char, &defuse);
845 if ((l < 0) || defuse) return SJ3_BAD_KANJI_STR;
846 yp = buf1;
847 kp = kbuf;
848 flag = MBCODE_SJIS;
849 } else {
850 yp = yomi;
851 kp = kanji;
852 flag = MBCODE_EUC;
853 }
854 if (sj3_tango_sakujo(&client, udicid, yp, kp, code, flag)) {
855 if (client.fd < 0) {
856 mdicid = udicid = 0;
857 return -1;
858 }
859 switch (sj3_error_number) {
860 case SJ3_NoSuchDict:
861 case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR;
862 case SJ3_DictLocked: return SJ3_DICT_LOCKED;
863 case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR;
864 case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR;
865 case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE;
866 case SJ3_NoSuchWord: return SJ3_WORD_NOT_EXIST;
867 default: return SJ3_SYOUKYO_FAILED;
868 }
869 }
870 return 0;
871 }
872 int
sj3_syoukyo_mb(u_char * yomi,u_char * kanji,int code)873 sj3_syoukyo_mb(u_char *yomi, u_char *kanji, int code)
874 {
875 #ifndef __sony_news
876 if (_sys_code == SYS_NOTDEF)
877 _sys_code = set_sys_code();
878 #endif
879 if (_sys_code == SYS_EUC)
880 return sj3_syoukyo_euc(yomi, kanji, code);
881 else
882 return sj3_syoukyo(yomi, kanji, code);
883 }
884
885 int
sj3_getdict(u_char * buf)886 sj3_getdict(u_char *buf)
887 {
888 if (sj3_tango_syutoku(&client, udicid, buf, MBCODE_SJIS)) {
889 if (client.fd < 0) {
890 mdicid = udicid = 0;
891 return -1;
892 }
893 return 1;
894 }
895 return 0;
896 }
897 int
sj3_getdict_euc(u_char * buf)898 sj3_getdict_euc(u_char *buf)
899 {
900 int l, ll, slen;
901
902 if (client.svr_version == 1) {
903 if (sj3_tango_syutoku(&client, udicid, buf, MBCODE_SJIS)) {
904 if (client.fd < 0) {
905 mdicid = udicid = 0;
906 return -1;
907 }
908 return 1;
909 }
910 defuse = 0;
911 slen = strlen(buf) + 1;
912 l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf, client.default_char, &defuse);
913 if ((l < 0) || defuse) return 1;
914 l++;
915 ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l, &(buf[slen]),
916 client.default_char, &defuse);
917 if ((ll < 0) || defuse) return 1;
918 ll++;
919 slen += strlen(&(buf[slen])) + 1;
920 l = l + ll;
921 memcpy(&(kbuf[l]), &(buf[slen]), 4);
922 l += 4;
923 memcpy(buf, kbuf, l);
924 } else {
925 if (sj3_tango_syutoku(&client, udicid, buf, MBCODE_EUC)) {
926 if (client.fd < 0) {
927 mdicid = udicid = 0;
928 return -1;
929 }
930 return 1;
931 }
932 }
933 return 0;
934 }
935 int
sj3_getdict_mb(u_char * buf)936 sj3_getdict_mb(u_char *buf)
937 {
938 #ifndef __sony_news
939 if (_sys_code == SYS_NOTDEF)
940 _sys_code = set_sys_code();
941 #endif
942 if (_sys_code == SYS_EUC)
943 return sj3_getdict_euc(buf);
944 else
945 return sj3_getdict(buf);
946 }
947
948 int
sj3_nextdict(u_char * buf)949 sj3_nextdict(u_char *buf)
950 {
951 if (sj3_tango_jikouho(&client, udicid, buf, MBCODE_SJIS)) {
952 if (client.fd < 0) {
953 mdicid = udicid = 0;
954 return -1;
955 }
956 return 1;
957 }
958 return 0;
959 }
960 int
sj3_nextdict_euc(u_char * buf)961 sj3_nextdict_euc(u_char *buf)
962 {
963 int l, ll, slen;
964
965 if (client.svr_version == 1) {
966 if (sj3_tango_jikouho(&client, udicid, buf, MBCODE_SJIS)) {
967 if (client.fd < 0) {
968 mdicid = udicid = 0;
969 return -1;
970 }
971 return 1;
972 }
973 defuse = 0;
974 slen = strlen(buf) + 1;
975 l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf, client.default_char, &defuse);
976 if ((l < 0) || defuse) return 1;
977 l++;
978 ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l, &(buf[slen]),
979 client.default_char, &defuse);
980 if ((ll < 0) || defuse) return 1;
981 ll++;
982 slen += strlen(&(buf[slen])) + 1;
983 l = l + ll;
984 memcpy(&(kbuf[l]), &(buf[slen]), 4);
985 l += 4;
986 memcpy(buf, kbuf, l);
987 } else {
988 if (sj3_tango_jikouho(&client, udicid, buf, MBCODE_EUC)) {
989 if (client.fd < 0) {
990 mdicid = udicid = 0;
991 return -1;
992 }
993 return 1;
994 }
995 }
996 return 0;
997 }
998 int
sj3_nextdict_mb(u_char * buf)999 sj3_nextdict_mb(u_char *buf)
1000 {
1001 #ifndef __sony_news
1002 if (_sys_code == SYS_NOTDEF)
1003 _sys_code = set_sys_code();
1004 #endif
1005 if (_sys_code == SYS_EUC)
1006 return sj3_nextdict_euc(buf);
1007 else
1008 return sj3_nextdict(buf);
1009 }
1010
1011 int
sj3_prevdict(u_char * buf)1012 sj3_prevdict(u_char *buf)
1013 {
1014 if (sj3_tango_maekouho(&client, udicid, buf, MBCODE_SJIS)) {
1015 if (client.fd < 0) {
1016 mdicid = udicid = 0;
1017 return -1;
1018 }
1019 return 1;
1020 }
1021 return 0;
1022 }
1023 int
sj3_prevdict_euc(u_char * buf)1024 sj3_prevdict_euc(u_char *buf)
1025 {
1026 int l, ll, slen;
1027
1028 if (client.svr_version == 1) {
1029 if (sj3_tango_maekouho(&client, udicid, buf, MBCODE_SJIS)) {
1030 if (client.fd < 0) {
1031 mdicid = udicid = 0;
1032 return -1;
1033 }
1034 return 1;
1035 }
1036 defuse = 0;
1037 slen = strlen(buf) + 1;
1038 l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf, client.default_char, &defuse);
1039 if ((l < 0) || defuse) return 1;
1040 l++;
1041 ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l, &(buf[slen]),
1042 client.default_char, &defuse);
1043 if ((ll < 0) || defuse) return 1;
1044 ll++;
1045 slen += strlen(&(buf[slen])) + 1;
1046 l = l + ll;
1047 memcpy(&(kbuf[l]), &(buf[slen]), 4);
1048 l += 4;
1049 memcpy(buf, kbuf, l);
1050 } else {
1051 if (sj3_tango_maekouho(&client, udicid, buf, MBCODE_EUC)) {
1052 if (client.fd < 0) {
1053 mdicid = udicid = 0;
1054 return -1;
1055 }
1056 return 1;
1057 }
1058 }
1059 return 0;
1060 }
1061 int
sj3_prevdict_mb(u_char * buf)1062 sj3_prevdict_mb(u_char *buf)
1063 {
1064 #ifndef __sony_news
1065 if (_sys_code == SYS_NOTDEF)
1066 _sys_code = set_sys_code();
1067 #endif
1068 if (_sys_code == SYS_EUC)
1069 return sj3_prevdict_euc(buf);
1070 else
1071 return sj3_prevdict(buf);
1072 }
1073
1074 int
sj3_lockserv()1075 sj3_lockserv()
1076 {
1077 if (sj3_lock_server(&client) == ERROR) {
1078 if (client.fd < 0) {
1079 mdicid = udicid = 0;
1080 return -1;
1081 }
1082 return 1;
1083 }
1084 return 0;
1085 }
1086 int
sj3_unlockserv()1087 sj3_unlockserv()
1088 {
1089 if (sj3_unlock_server(&client)) {
1090 if (client.fd < 0) {
1091 mdicid = udicid = 0;
1092 return -1;
1093 }
1094 return 1;
1095 }
1096 return 0;
1097 }
1098