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