1 /*
2 * $Id: js.c,v 2.69.2.4 2000/08/04 05:37:22 kaneda Exp $
3 */
4
5 /*
6 WNN6 CLIENT LIBRARY--SOFTWARE LICENSE TERMS AND CONDITIONS
7
8
9 Wnn6 Client Library :
10 (C) Copyright OMRON Corporation. 1995,1998,2000 all rights reserved.
11 (C) Copyright OMRON Software Co., Ltd. 1995,1998,2000 all rights reserved.
12
13 Wnn Software :
14 (C) Copyright Kyoto University Research Institute for Mathematical Sciences
15 1987, 1988, 1989, 1990, 1991, 1992, 1993
16 (C) Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1993
17 (C) Copyright ASCTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992, 1993
18
19 Preamble
20
21 These Wnn6 Client Library--Software License Terms and Conditions
22 (the "License Agreement") shall state the conditions under which you are
23 permitted to copy, distribute or modify the software which can be used
24 to create Wnn6 Client Library (the "Wnn6 Client Library"). The License
25 Agreement can be freely copied and distributed verbatim, however, you
26 shall NOT add, delete or change anything on the License Agreement.
27
28 OMRON Corporation and OMRON Software Co., Ltd. (collectively referred to
29 as "OMRON") jointly developed the Wnn6 Software (development code name
30 is FI-Wnn), based on the Wnn Software. Starting from November, 1st, 1998,
31 OMRON publishes the source code of the Wnn6 Client Library, and OMRON
32 permits anyone to copy, distribute or change the Wnn6 Client Library under
33 the License Agreement.
34
35 Wnn6 Client Library is based on the original version of Wnn developed by
36 Kyoto University Research Institute for Mathematical Sciences (KURIMS),
37 OMRON Corporation and ASTEC Inc.
38
39 Article 1. Definition.
40
41 "Source Code" means the embodiment of the computer code, readable and
42 understandable by a programmer of ordinary skills. It includes related
43 source code level system documentation, comments and procedural code.
44
45 "Object File" means a file, in substantially binary form, which is directly
46 executable by a computer after linking applicable files.
47
48 "Library" means a file, composed of several Object Files, which is directly
49 executable by a computer after linking applicable files.
50
51 "Software" means a set of Source Code including information on its use.
52
53 "Wnn6 Client Library" the computer program, originally supplied by OMRON,
54 which can be used to create Wnn6 Client Library.
55
56 "Executable Module" means a file, created after linking Object Files or
57 Library, which is directly executable by a computer.
58
59 "User" means anyone who uses the Wnn6 Client Library under the License
60 Agreement.
61
62 Article 2. Copyright
63
64 2.1 OMRON Corporation and OMRON Software Co., Ltd. jointly own the Wnn6
65 Client Library, including, without limitation, its copyright.
66
67 2.2 Following words followed by the above copyright notices appear
68 in all supporting documentation of software based on Wnn6 Client Library:
69
70 This software is based on the original version of Wnn6 Client Library
71 developed by OMRON Corporation and OMRON Software Co., Ltd. and also based on
72 the original version of Wnn developed by Kyoto University Research Institute
73 for Mathematical Sciences (KURIMS), OMRON Corporation and ASTEC Inc.
74
75 Article 3. Grant
76
77 3.1 A User is permitted to make and distribute verbatim copies of
78 the Wnn6 Client Library, including verbatim of copies of the License
79 Agreement, under the License Agreement.
80
81 3.2 A User is permitted to modify the Wnn6 Client Library to create
82 Software ("Modified Software") under the License Agreement. A User
83 is also permitted to make or distribute copies of Modified Software,
84 including verbatim copies of the License Agreement with the following
85 information. Upon modifying the Wnn6 Client Library, a User MUST insert
86 comments--stating the name of the User, the reason for the modifications,
87 the date of the modifications, additional terms and conditions on the
88 part of the modifications if there is any, and potential risks of using
89 the Modified Software if they are known--right after the end of the
90 License Agreement (or the last comment, if comments are inserted already).
91
92 3.3 A User is permitted to create Library or Executable Modules by
93 modifying the Wnn6 Client Library in whole or in part under the License
94 Agreement. A User is also permitted to make or distribute copies of
95 Library or Executable Modules with verbatim copies of the License
96 Agreement under the License Agreement. Upon modifying the Wnn6 Client
97 Library for creating Library or Executable Modules, except for porting
98 a computer, a User MUST add a text file to a package of the Wnn6 Client
99 Library, providing information on the name of the User, the reason for
100 the modifications, the date of the modifications, additional terms and
101 conditions on the part of the modifications if there is any, and potential
102 risks associated with using the modified Wnn6 Client Library, Library or
103 Executable Modules if they are known.
104
105 3.4 A User is permitted to incorporate the Wnn6 Client Library in whole
106 or in part into another Software, although its license terms and
107 conditions may be different from the License Agreement, if such
108 incorporation or use associated with the incorporation does NOT violate
109 the License Agreement.
110
111 Article 4. Warranty
112
113 THE WNN6 CLIENT LIBRARY IS PROVIDED BY OMRON ON AN "AS IS" BAISIS.
114 OMRON EXPRESSLY DISLCIAMS ANY AND ALL WRRANTIES, EXPRESS OR IMPLIED,
115 INCLUDING, WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY AND FITNESS
116 FOR A PARTICULAR PURPOSE, IN CONNECTION WITH THE WNN6 CLIENT LIBRARY
117 OR THE USE OR OTHER DEALING IN THE WNN6 CLIENT LIBRARY. IN NO EVENT
118 SHALL OMRON BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, PUNITIVE
119 OR CONSEQUENTIAL DAMAGES OF ANY KIND WHATSOEVER IN CONNECTION WITH THE
120 WNN6 CLIENT LIBRARY OR THE USE OR OTHER DEALING IN THE WNN6 CLIENT
121 LIBRARY.
122
123 ***************************************************************************
124 Wnn6 Client Library :
125 (C) Copyright OMRON Corporation. 1995,1998,2000 all rights reserved.
126 (C) Copyright OMRON Software Co., Ltd. 1995,1998,2000 all rights reserved.
127
128 Wnn Software :
129 (C) Copyright Kyoto University Research Institute for Mathematical Sciences
130 1987, 1988, 1989, 1990, 1991, 1992, 1993
131 (C) Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1993
132 (C) Copyright ASCTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992, 1993
133 ***************************************************************************
134
135 Comments on Modifications:
136 */
137
138 /* Version 4
139 */
140 /*
141 Nihongo Henkan Library
142 */
143 /*
144 entry functions
145
146 js_open_lang js_close
147 js_change_current_jserver
148 js_connect_lang js_disconnect
149 js_isconnect
150
151 js_param_get js_param_set
152
153 js_access js_mkdir
154
155 js_get_lang js_set_lang
156
157
158 extern Variables
159 int wnn_errorno;
160 */
161
162
163 #if defined(__DragonFly__)
164 #include <stdlib.h>
165 #include <string.h>
166 #include <unistd.h>
167 #include <arpa/inet.h>
168 #else
169 extern char *malloc();
170 #endif
171
172 #include <stdio.h>
173 #include <ctype.h>
174 #ifdef UX386
175 #include <X11/Xos.h>
176 #else
177 #include <fcntl.h>
178 #endif
179 #include <pwd.h>
180 #ifndef UX386
181 #include <sys/types.h>
182 #endif
183 #include <sys/stat.h>
184 #include <errno.h>
185 extern int errno;
186 #include <signal.h>
187 #include "jd_sock.h"
188 #include "commonhd.h"
189 #include "demcom.h"
190 #include "config.h"
191
192 #include "wnnerror.h"
193 #include "jslib.h"
194 #include "jllib.h"
195 #include "mt_jlib.h"
196 #include "jh.h"
197
198 #include "msg.h"
199 #include "serverdefs.h"
200
201 #ifdef SYSVR2
202 #define bzero(adr,n) memset((adr),0,(n))
203 #endif
204
205 #define JS /* For include ../etc/bdic.c */
206 #include "../etc/bdic.c"
207 /*
208 * Hideyuki Kishiba (Jul. 11, 1994)
209 * New bdic function for FI-Wnn
210 */
211 #include "../etc/fi_bdic.c"
212 #include "../etc/pwd.c"
213
214 #if !defined(__DragonFly__)
215 char *malloc();
216 #endif
217
218 typedef struct _host_address {
219 int address_len;
220 char *address;
221 } host_address;
222
223 int wnn_errorno =0;
224
225 struct msg_cat *wnn_msg_cat = NULL;
226
227 /* j Lib. */
228
229 static int current_sd; /** �����å�fd **/
230 static WNN_JSERVER_ID_INT *current_js = NULL;
231
232 /* Packet Buffers */
233 static unsigned char snd_buf[S_BUF_SIZ]; /** ���� **/
234 static int sbp=0; /** �����Хåե����ݥ��� **/
235 static int rbc= -1; /** �����Хåե����ݥ��� **/
236
237 #if defined(EAGAIN)
238 # if defined(EWOULDBLOCK)
239 # define ERRNO_CHECK(no) ((no) == EAGAIN || (no) == EWOULDBLOCK)
240 # else /* defined(EWOULDBLOCK) */
241 # define ERRNO_CHECK(no) ((no) == EAGAIN)
242 # endif /* defined(EWOULDBLOCK) */
243 #else /* defined(EAGAIN) */
244 # if defined(EWOULDBLOCK)
245 # define ERRNO_CHECK(no) ((no) == EWOULDBLOCK)
246 # else /* defined(EWOULDBLOCK) */
247 # define ERRNO_CHECK(no) (0)
248 # endif /* defined(EWOULDBLOCK) */
249 #endif /* defined(EAGAIN) */
250
251 static int _get_server_name(
252 char *server,
253 char *pserver,
254 int pserver_size,
255 int *portNO
256 );
257 static int writen();
258
259
260 /********* V4 *****************/
261 /***
262 jserver_dead Macro
263 ***/
264
265 static jmp_buf current_jserver_dead;
266
267 #define handler_of_jserver_dead(current_js) \
268 { \
269 if (current_js) { \
270 if(current_js->js_dead){ \
271 js_wnn_errorno_set=WNN_JSERVER_DEAD; \
272 } else \
273 if(setjmp(js_current_jserver_dead)){ \
274 if (!js_wnn_errorno_eql) js_wnn_errorno_set=WNN_JSERVER_DEAD; \
275 } else \
276 js_wnn_errorno_set = 0; /* here initialize wnn_errorno; */ \
277 } \
278 }
279
280 #define handler_of_jserver_dead_env(env) \
281 { \
282 if (env->js_id) { \
283 if(env->js_id->js_dead){ \
284 env_wnn_errorno_set=WNN_JSERVER_DEAD; \
285 } else \
286 if(setjmp(env_current_jserver_dead)){ \
287 if (!env_wnn_errorno_eql) env_wnn_errorno_set=WNN_JSERVER_DEAD; \
288 } else \
289 env_wnn_errorno_set = 0; /* here initialize wnn_errorno; */ \
290 } \
291 }
292
293
294 static void
set_current_js(server)295 set_current_js(server)
296 register WNN_JSERVER_ID *server;
297 {
298 current_js = (WNN_JSERVER_ID_INT *)server;
299 current_sd = current_js->orig.sd;
300 }
301
302 #undef ARGS
303 #define ARGS char
304 #define js_wnn_errorno_set wnn_errorno
305 #define js_wnn_errorno_eql wnn_errorno
306 #define env_wnn_errorno_set wnn_errorno
307 #define env_wnn_errorno_eql wnn_errorno
308 #define js_current_jserver_dead current_jserver_dead
309 #define env_current_jserver_dead current_jserver_dead
310
311 /** �ǡ���������Τ���θ���� **/
312 static void
demon_dead(server)313 demon_dead(server)
314 ARGS *server;
315 {
316 current_js->orig.js_dead= -1;
317 js_wnn_errorno_set = WNN_JSERVER_DEAD;
318 shutdown(current_sd, 2);
319 close(current_sd);
320 #if DEBUG
321 fprintf(stderr,"jslib:JSERVER %s is Dead\n",current_js->orig.js_name);
322 #endif
323 if(current_js->orig.js_dead_env_flg){
324 longjmp(current_js->orig.js_dead_env,666);
325 }
326 longjmp(js_current_jserver_dead,666);
327 /* never reach */
328 }
329
330
331 /**
332 �����åȤ��ץ�current_sd�˥����å�fd���֤�
333 (cd�Ȥ����Τϥ��ߥ�˥��������ǥХ�����̾��)
334 **/
335 static int
cd_open(lang)336 cd_open(lang)
337 register char *lang;
338 {
339 #ifdef AF_UNIX
340 int sd;
341 struct sockaddr_un saddr; /** �����å� **/
342 char *sock_name = NULL;
343 saddr.sun_family = AF_UNIX;
344
345 /* find socket name from table by lang */
346 if (lang && *lang) {
347 if ((sock_name = wnn_get_unixdomain_of_serverdefs(lang)) == NULL) {
348 sock_name = UNIX_SOCKET_NAME;
349 }
350 } else {
351 sock_name = UNIX_SOCKET_NAME; /* Jserver */
352 }
353 strncpy(saddr.sun_path, sock_name, sizeof(saddr.sun_path) - 1);
354 saddr.sun_path[sizeof(saddr.sun_path) - 1] = '\0';
355
356 if ((sd = socket(AF_UNIX,SOCK_STREAM, 0)) == ERROR) {
357 #if DEBUG
358 xerror("jslib:Can't create socket.\n");
359 #endif
360 return -1;
361 }
362
363 #if !defined(SUN_LEN)
364 # define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
365 #endif
366 if (connect(sd,(struct sockaddr *)&saddr, SUN_LEN(&saddr)) == ERROR) {
367 #if DEBUG
368 xerror("jslib:Can't connect socket.\n");
369 #endif
370 close(sd);
371 return -1;
372 }
373 return sd;
374 #else
375 return -1;
376 #endif
377 }
378
379 static intfntype
connect_timeout()380 connect_timeout()
381 {
382 SIGNAL_RETURN;
383 }
384
385 static int
cd_open_in_core(sa,tmout)386 cd_open_in_core(sa, tmout)
387 register struct sockaddr_in *sa;
388 register int tmout;
389 {
390 int sd;
391 int ret;
392 int old_alarm = 0;
393 intfntype (*save_alarm_proc)() = NULL;
394
395 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == ERROR){
396 #if DEBUG
397 xerror("jslib:Can't create Inet socket.\n");
398 #endif
399 return -1 ;
400 }
401
402 if (tmout > 0) {
403 save_alarm_proc = signal(SIGALRM, connect_timeout);
404 old_alarm = alarm(tmout);
405 }
406 ret = connect(sd, (struct sockaddr *)sa, sizeof(struct sockaddr_in));
407 if (tmout > 0) {
408 alarm(old_alarm);
409 if (save_alarm_proc)
410 signal(SIGALRM, save_alarm_proc);
411 else
412 signal(SIGALRM, SIG_IGN);
413 }
414 if (ret == ERROR) {
415 #if DEBUG
416 xerror("jslib:Can't connect Inet socket.\n");
417 #endif
418 close(sd);
419 return -1 ;
420 }
421 return sd;
422 }
423
424 static int
cd_open_in_by_addr(addr,addrlen,port,tmout)425 cd_open_in_by_addr(addr, addrlen, port, tmout)
426 char *addr;
427 int addrlen, port, tmout;
428 {
429 struct sockaddr_in saddr_in;
430
431 bzero((char *)&saddr_in,sizeof(saddr_in));
432 bcopy(addr,(char *)&saddr_in.sin_addr, addrlen);
433 saddr_in.sin_family = AF_INET;
434 saddr_in.sin_port = port;
435 return(cd_open_in_core(&saddr_in, tmout));
436 }
437
438 typedef struct _my_serv_struct {
439 char *name;
440 int port;
441 struct _my_serv_struct *next;
442 } my_serv_struct;
443
my_getservbyname(name)444 static int my_getservbyname(name)
445 register char *name;
446 {
447 static my_serv_struct *tbl = NULL;
448 register my_serv_struct *p;
449 struct servent *sp = NULL;
450 register int len;
451
452 for (p = tbl; p; p = p->next) {
453 if (p->name && !strcmp(p->name, name)) return(p->port);
454 }
455 if (!(sp = getservbyname(name,"tcp"))) return(-1);
456 len = strlen(name);
457 if (!(p = (my_serv_struct *)malloc(sizeof(my_serv_struct) + len + 1)))
458 return(-1);
459 p->name = ((char *)p) + sizeof(my_serv_struct);
460 strcpy(p->name, name);
461 p->port = ntohs(sp->s_port);
462 p->next = tbl;
463 tbl = p;
464 return(p->port);
465 }
466
467 static int
cd_open_in(server,lang,tmout)468 cd_open_in(server, lang, tmout)
469 register char *server;
470 register char *lang;
471 register int tmout;
472 {
473 struct sockaddr_in saddr_in; /** �����å� **/
474 register struct hostent *hp;
475 int serverNO, port_num;
476 char pserver[64];
477 char sserver[64];
478 char *serv_name = NULL;
479 unsigned long ia;
480 char *inet_ntoa();
481
482 serverNO = _get_server_name(server, pserver, sizeof(pserver), &port_num);
483
484 if (port_num > 0) {
485 /* absolute port number is specified */
486 serverNO += port_num;
487 } else {
488 /* find service name from table by lang */
489 if (lang && *lang) {
490 if ((serv_name = wnn_get_service_of_serverdefs(lang)) == NULL) {
491 strncpy(sserver, SERVERNAME, sizeof(sserver) - 1);
492 } else {
493 strncpy(sserver, serv_name, sizeof(sserver) - 1);
494 }
495 } else {
496 strncpy(sserver, SERVERNAME, sizeof(sserver) - 1);
497 }
498 sserver[sizeof(sserver) - 1] = 0;
499
500 if ((port_num = my_getservbyname(sserver)) != -1) {
501 serverNO += port_num;
502 } else {
503 if (lang && *lang &&
504 (port_num = wnn_get_port_num_of_serverdefs(lang)) != -1) {
505 serverNO += port_num;
506 } else {
507 serverNO += WNN_PORT_IN;
508 }
509 }
510 }
511 bzero((char *)&saddr_in,sizeof(saddr_in));
512
513 if (isascii(pserver[0]) && isdigit(pserver[0])) {
514 ia = inet_addr(pserver);
515 saddr_in.sin_addr.s_addr = ia;
516 } else if ((hp = gethostbyname(pserver))) {
517 bcopy(hp->h_addr,(char *)&saddr_in.sin_addr, hp->h_length);
518 } else {
519 return(-1);
520 }
521 saddr_in.sin_family = AF_INET;
522 saddr_in.sin_port = htons(serverNO);
523 return(cd_open_in_core(&saddr_in, tmout));
524 }
525
526 /* get server name and return serverNo */
527 /* and return absolute port number 1993/12/07 S.Kuwari */
528 static int
_get_server_name(server,pserver,pserver_size,portNO)529 _get_server_name(server, pserver, pserver_size, portNO)
530 char *server;
531 char *pserver;
532 int pserver_size;
533 int *portNO;
534 {
535 register char *p;
536 register int port = 0, offset = 0;
537
538 strncpy(pserver, server, pserver_size - 1);
539 pserver[pserver_size - 1] = '\0';
540 if ((p = strchr(pserver, ':'))) {
541 *p = '\0';
542 if (*(p+1)) offset = atoi(p+1);
543 }
544 if ((p = strchr(pserver, '/'))) {
545 *p = '\0';
546 if (*(p+1)) port = atoi(p+1);
547 }
548 *portNO = port;
549 return(offset);
550 }
551
552 /* Packet SND/RCV subroutines */
553 static void put4com();
554
555 /* �����Ф�����ץ�ȥ���ݡ��Ȥ��Ƥ��뤫�ɤ����Υ����å� */
556 #define check_version(cmd) \
557 (((cmd>>12) & 0xFFF) > (current_js->version & 0xFFF))
558
559 /* �����Ф��ƣɴط������ݡ��Ȥ��Ƥ��뤫�ɤ����Υ����å� */
560 #define CHECK_FI \
561 ((current_js->version & 0xFFF) >= 0xF00)
562
563 /** �ѥ��åȤΥإå��������� **/
564 static void
snd_head(cmd,server)565 snd_head(cmd, server)
566 int cmd; /** cmd=���ޥ�� **/
567 ARGS *server;
568 {
569 sbp=0;
570 if (check_version(cmd)) {
571 js_wnn_errorno_set = WNN_NOT_SUPPORT_PACKET;
572 longjmp(js_current_jserver_dead,666);
573 }
574 put4com(cmd, server);
575 rbc= -1;
576 }
577
578 /** �ѥ��åȤΥإå��������� **/
579 static int
snd_env_head(env,cmd)580 snd_env_head(env,cmd)
581 register struct wnn_env *env;
582 int cmd; /** cmd=���ޥ�� **/
583 {
584 ARGS *args = NULL;
585
586 snd_head(cmd, args);
587 put4com(env->env_id, args);
588 return 0;
589 }
590
591 /** �ѥ��åȤΥإå��������� **/
592 static int
snd_server_head(server,cmd)593 snd_server_head(server,cmd)
594 register WNN_JSERVER_ID *server;
595 int cmd; /** cmd=���ޥ�� **/
596 {
597 ARGS *args = NULL;
598
599 snd_head(cmd, args);
600 return 0;
601 }
602
603 /** �����Хåե���ե�å��夹�� **/
604 static int
snd_flush(server)605 snd_flush(server)
606 ARGS *server;
607 {
608 if(sbp==0)return(-1);
609 writen(sbp, server);
610 sbp=0;
611 return(0);
612 }
613
614 static int
writen(n,server)615 writen(n, server)
616 int n;
617 ARGS *server;
618 {int cc,x;
619 for(cc=0;cc<n;){
620 errno = 0;
621 x=write(current_sd, &(snd_buf[cc]), n-cc );
622 if(x < 0) {
623 if (ERRNO_CHECK(errno) || errno == EINTR) {
624 continue;
625 } else {
626 demon_dead(server);
627 return -1;
628 }
629 }
630 cc+=x;
631 }
632 #if DEBUG
633 fprintf(stderr,"jslib:writen=%d\n",x);
634 /* dmp(snd_buf,x); */
635 #endif
636 return(0);
637 }
638
639 /** ������1�������� **/
640 static void
put1com(c,server)641 put1com(c, server)
642 int c;
643 ARGS *server;
644 {
645 snd_buf[sbp++]=c;
646 if(sbp>=S_BUF_SIZ){
647 writen(S_BUF_SIZ, server);
648 sbp=0;
649 }
650 }
651
652 /** ������2�������� **/
653 static void
put2com(c,server)654 put2com(c, server)
655 int c;
656 ARGS *server;
657 {
658 put1com(c>>(8*1), server);
659 put1com(c , server);
660 }
661
662 /** ������4�������� **/
663 static void
put4com(c,server)664 put4com(c, server)
665 int c;
666 ARGS *server;
667 {
668 put1com(c>>(8*3), server);
669 put1com(c>>(8*2), server);
670 put1com(c>>(8*1), server);
671 put1com(c , server);
672 }
673
674 /** �����Ф�ʸ��������� **/
675 static void
putwscom(p,server)676 putwscom(p, server)
677 register w_char *p;
678 ARGS *server;
679 {
680 if(p==NULL){ put2com(0, server); return; }
681 while(*p)put2com(*p++, server);
682 put2com(0, server);
683 }
684
685 /** �����Ф�ʸ��������� **/
686 static void
putscom(p,server)687 putscom(p, server)
688 register char *p;
689 ARGS *server;
690 {
691 if(p==NULL){ put1com(0, server); return; }
692 while(*p)put1com(*p++, server);
693 put1com(0, server);
694 }
695
696 /** �����Ф���1�Х��ȼ����� **/
697 static int
get1com(server)698 get1com(server)
699 ARGS *server;
700 {
701 static int rbp;
702 static unsigned char rcv_buf[R_BUF_SIZ]; /** ���� **/
703
704 if(rbc<=0){
705 while(1) {
706 errno = 0;
707 rbc = read(current_sd, rcv_buf, R_BUF_SIZ);
708 if(rbc <= 0) {
709 if (ERRNO_CHECK(errno)) {
710 continue;
711 } else if (rbc == 0) {
712 demon_dead(server);
713 return -1;
714 } else { /* cc == -1 */
715 if (errno != EINTR) {
716 demon_dead(server);
717 return -1;
718 }
719 continue;
720 }
721 }
722 rbp=0;
723 #if DEBUG
724 fprintf(stderr,"jslib:read:rbc=%d\n",rbc);
725 /* dmp(rcv_buf,rbc); */
726 #endif
727 break;
728 }
729 }
730 rbc--;
731 return rcv_buf[rbp++] & 0xFF ;
732 }
733
734 /** �����Ф���2�Х��ȼ����� **/
735 static int
get2com(server)736 get2com(server)
737 ARGS *server;
738 {register int h;
739 h=get1com(server);
740 return (h<<8) | get1com(server);
741 }
742
743 /** �����Ф���4�Х��ȼ����� **/
744 static int
get4com(server)745 get4com(server)
746 ARGS *server;
747 {register int h1,h2,h3;
748 h1=get1com(server) << 24 ;
749 h2=get1com(server) << 16 ;
750 h3=get1com(server) << 8 ;
751 return h1 | h2 | h3 | get1com(server);
752 }
753
754 /** �����Ф���ʸ����������� **/
755 static void
getscom(cp,server,buflen)756 getscom(cp, server, buflen)
757 register char *cp;
758 ARGS *server;
759 register int buflen;
760 {
761 register int i;
762
763 for (i = 0 ; i < buflen ; i++) {
764 if ((*cp++ = get1com(server)) == '\0')
765 break;
766 }
767 /* Buffer Overflow size? */
768 if (i >= buflen) {
769 /* �Ĥ�Υǡ������˴����� */
770 while (get1com(server) != 0)
771 ;
772 if (i > 0)
773 *(cp - 1) = '\0'; /* set null terminate */
774 }
775 }
776
777 /** �����Ф���ʸ����������� **/
778 static void
getwscom(wp,server,buflen)779 getwscom(wp, server, buflen)
780 register w_char *wp;
781 ARGS *server;
782 register int buflen; /* not bytes. "buflen" is word length. */
783 {
784 register int i;
785
786 for (i = 0 ; i < buflen ; i++) {
787 if ((*wp++ = get2com(server)) == '\0')
788 break;
789 }
790 /* Buffer Overflow size? */
791 if (i >= buflen) {
792 /* �Ĥ�Υǡ������˴����� */
793 while (get2com(server) != 0)
794 ;
795 if (i > 0)
796 *(wp - 1) = '\0'; /* set null terminate */
797 }
798 }
799
800
801
802 /* Debug Subroutines */
803 #if DEBUG
804 void
xerror(s)805 xerror(s)char *s;
806 {
807 fprintf(stderr,"%s\n",s);
808 }
809
810 void
dmp(p,c)811 dmp(p,c)char *p;
812 {
813 int i,j;
814 for(i=0;;i+=16){
815 for(j=0;j<16;j++){
816 if(c<=0){ fprintf(stderr,"\n"); return;}
817 fprintf(stderr,"%02x ",p[i+j]&0xFF);
818 c--;
819 }
820 fprintf(stderr,"\n");
821 }
822 }
823
824 #endif
825
826 /* get login name form /etc/passwd file */
827 static char*
getlogname()828 getlogname()
829 {
830 extern struct passwd *getpwuid();
831 struct passwd *p;
832
833 if ((p = getpwuid(getuid())) == NULL)
834 return(NULL);
835 return(p->pw_name);
836 }
837
838 static int
send_js_open_core(server,host,user,version)839 send_js_open_core(server, host, user, version)
840 WNN_JSERVER_ID *server;
841 char *host, *user;
842 int version;
843 {
844 int x;
845
846 handler_of_jserver_dead(server);
847 if(js_wnn_errorno_eql) return(-1);
848 snd_head(JS_OPEN, server);
849 put4com(version, server); /* H.T. */
850 putscom(host, server);
851 putscom(user, server);
852 snd_flush(server);
853 if((x = get4com(server)) == -1){
854 js_wnn_errorno_set=get4com(server);
855 return(-1);
856 }
857 return(x);
858 }
859
860
861
862 /*:::DOC_START
863 *
864 * Function Name: version_negotiation
865 * Description :
866 * ���饤����ȡ������д֤Υץ�ȥ���С�������Ĵ����Ԥ�
867 * Parameter :
868 * server : (InOut) �����о���¤�ΤؤΥݥ���
869 * host : (In) ���饤����Ȼ��ѥۥ���̾
870 * user : (In) ���饤����Ȼ��ѥ桼��̾
871 * init_version : (In) ���饤����ȤΥץ�ȥ������С�������ֹ�
872 *
873 * Return value : 0==SUCCESS, -1==ERROR
874 *
875 * Author : Hideyuki Kishiba
876 *
877 * Revision history:
878 *
879 *:::DOC_END
880 */
881 static int
version_negotiation(server,host,user,init_version)882 version_negotiation(server, host, user, init_version)
883 WNN_JSERVER_ID *server;
884 char *host, *user;
885 int init_version;
886 {
887 int version, dummy;
888
889 /* ��㡼���С����������å� */
890 if((init_version >> 12) != 4) return(-1);
891
892 if (init_version > 0x4F00) {
893 /* 4.F00 ����礭����� 4.F00 �Ǻƥȥ饤 */
894 if (send_js_open_core(server, host, user, 0x4F00) < 0) {
895 if (js_wnn_errorno_eql == WNN_BAD_VERSION) {
896 /* 4.003 �Ǻƥȥ饤 */
897 if (send_js_open_core(server, host, user, 0x4003) < 0)
898 return(-1);
899 ((WNN_JSERVER_ID_INT *)server)->version = 0x4003;
900 return(0);
901 }
902 return(-1);
903 }
904 /* �����ХС������Υ����å� */
905 if (js_version(server, &version, &dummy) == -1) return(-1);
906 if (version > 0x4F00) {
907 /* �����ХС������Ǻƥȥ饤 */
908 if (send_js_open_core(server, host, user, version) >= 0) {
909 ((WNN_JSERVER_ID_INT *)server)->version = version;
910 return(0);
911 }
912 }
913 ((WNN_JSERVER_ID_INT *)server)->version = 0x4F00;
914 } else {
915 /* 4.003 �Ǻƥȥ饤 */
916 if (send_js_open_core(server, host, user, 0x4003) < 0)
917 return(-1);
918 ((WNN_JSERVER_ID_INT *)server)->version = 0x4003;
919 }
920
921 return(0);
922 } /* End of version_negotiation */
923
924
925
926 static WNN_JSERVER_ID *
reconnect_other_host(server,user,host,tmout)927 reconnect_other_host(server, user, host, tmout)
928 WNN_JSERVER_ID *server;
929 char *user, *host;
930 int tmout;
931 {
932 char addr[32];
933 int addrlen, i, port;
934 char *new_js;
935 int x;
936 struct hostent *hp;
937
938 addrlen = get4com(server);
939 /* Buffer Overflow size? */
940 if (addrlen > sizeof(addr)) {
941 for (i = 0; i < addrlen; i++) get1com(server);
942 } else {
943 for (i = 0; i < addrlen; i++) addr[i] = get1com(server);
944 }
945 port = get4com(server);
946 js_close(server);
947
948 /* Buffer Overflow size? */
949 if (addrlen > sizeof(addr)) {
950 js_wnn_errorno_set = WNN_SOME_ERROR;
951 return NULL;
952 }
953 if (!(hp = gethostbyaddr(addr, addrlen, AF_INET))) {
954 js_wnn_errorno_set = WNN_NO_JSERVER;
955 return NULL;
956 }
957 sbp=0; /* init sndBufPointer */
958 if(!(new_js=(char *)malloc(sizeof(WNN_JSERVER_ID_INT)))){
959 js_wnn_errorno_set=WNN_ALLOC_FAIL;
960 return NULL;
961 }
962 server =(WNN_JSERVER_ID *) new_js;
963 strncpy(server->js_name, hp->h_name, sizeof(server->js_name) - 1);
964 server->js_name[sizeof(server->js_name) - 1] = '\0';
965 server->js_dead= 0;
966 server->js_dead_env_flg= 0;
967 if((current_sd= cd_open_in_by_addr(addr, addrlen, port, tmout))==-1){
968 js_wnn_errorno_set = WNN_NO_JSERVER;
969 free((char*)server);
970 current_js=NULL;
971 return NULL;
972 }
973 server->sd= current_sd;
974 ((WNN_JSERVER_ID_INT *)server)->version = JLIB_VERSION;
975 ((WNN_JSERVER_ID_INT *)server)->extensions = NULL;
976 if ((x = send_js_open_core(server, host, user, JLIB_VERSION)) == -1) {
977 x = js_wnn_errorno_eql;
978 js_wnn_errorno_set = 0;
979 if ((x != WNN_BAD_VERSION) ||
980 version_negotiation(server, host, user, JLIB_VERSION)) {
981 js_close(server); /* H.T. */
982 current_js = NULL;
983 return NULL;
984 }
985 } else if (x == 1) {
986 /* re-connect to other server */
987 return(reconnect_other_host(server, user, host, tmout));
988 }
989 return(server);
990 }
991
992 /*
993 * Lib. Functions
994 * raw lib.
995 */
996
997 /***
998 js
999 ��global
1000 ***/
1001
1002
1003 /** jserver ����³���롣jserver_id ���֤��� **/
1004 WNN_JSERVER_ID *
js_open_lang(servername,lang,tmout)1005 js_open_lang(servername, lang, tmout)
1006 register char *servername, *lang;
1007 register int tmout;
1008 {char *new_js, *username;
1009 char host[WNN_HOSTLEN],user[WNN_ENVNAME_LEN];
1010 int x;
1011 WNN_JSERVER_ID_INT *server;
1012
1013 DoOnce( &once, _InitMutexs );
1014 LockMutex(&msg_lock);
1015 if (wnn_msg_cat == NULL){
1016 char nlspath[64];
1017 strcpy(nlspath, LIBDIR);
1018 strcat(nlspath, "/%L/%N");
1019 wnn_msg_cat = msg_open("libwnn.msg", nlspath, lang, NULL);
1020 if(wnn_msg_cat == NULL){
1021 fprintf(stderr, "libwnn: Can't open message file for libwnn.a\n");
1022 }
1023 }
1024 UnlockMutex(&msg_lock);
1025
1026 if(!(new_js=(char *)malloc(sizeof(WNN_JSERVER_ID_INT)))){
1027 wnn_errorno=WNN_ALLOC_FAIL;
1028 return NULL;
1029 }
1030
1031 LockMutex(&open_lock);
1032 current_js =(WNN_JSERVER_ID_INT *) new_js;
1033 if (servername == NULL) {
1034 current_js->orig.js_name[0] = '\0';
1035 } else {
1036 strncpy(current_js->orig.js_name, servername, sizeof(current_js->orig.js_name) - 1);
1037 current_js->orig.js_name[sizeof(current_js->orig.js_name) - 1] = '\0';
1038 }
1039 current_js->orig.js_dead= 0;
1040 current_js->orig.js_dead_env_flg= 0;
1041 InitMutex(&(current_js_js_lock));
1042
1043 /*
1044 if(user == NULL || 0==strcmp(user,""))
1045 */
1046 username = getlogname();
1047 if (username) {
1048 strncpy(user, username, WNN_ENVNAME_LEN);
1049 user[WNN_ENVNAME_LEN-1] = '\0'; /* truncate by WNN_ENVNAME_LEN */
1050 } else {
1051 user[0] = '\0';
1052 }
1053 if(servername == NULL || 0==strcmp(servername,"") || 0==strcmp(servername,"unix")){
1054 strcpy(host,"unix");
1055 if((current_sd= cd_open(lang))==-1){
1056 UnlockMutex(&open_lock);
1057 wnn_errorno=WNN_SOCK_OPEN_FAIL;free((char*)current_js);current_js=NULL;
1058 return NULL;
1059 }
1060 }else{
1061 gethostname(host,WNN_HOSTLEN);
1062 host[WNN_HOSTLEN-1] = '\0'; /* truncate by WNN_HOSTLEN */
1063 if((current_sd= cd_open_in(servername, lang, tmout))==-1){
1064 UnlockMutex(&open_lock);
1065 wnn_errorno=WNN_SOCK_OPEN_FAIL;free((char*)current_js);current_js=NULL;
1066 return NULL;
1067 }
1068 }
1069 current_js->orig.sd= current_sd;
1070 current_js->version= JLIB_VERSION;
1071 current_js->extensions= NULL;
1072 server = current_js;
1073 if ((x = send_js_open_core(server, host, user, JLIB_VERSION)) == -1) {
1074 x = wnn_errorno;
1075 wnn_errorno = 0;
1076 if ((x != WNN_BAD_VERSION) ||
1077 version_negotiation(server, host, user, JLIB_VERSION)) {
1078 js_close(current_js);
1079 current_js = NULL;
1080 wnn_errorno = x;
1081 UnlockMutex(&open_lock);
1082 return NULL;
1083 }
1084 } else if (x == 1) {
1085 /* re-connect to other server */
1086 return(reconnect_other_host(server, user, host, tmout));
1087 }
1088 UnlockMutex(&open_lock);
1089 return (WNN_JSERVER_ID *)current_js;
1090 }
1091
1092
1093
1094 /** �����åȤ������� **/
1095 /** jserver �Ȥ���³�� close ���롣 **/
1096 int
js_close(server)1097 js_close(server)
1098 WNN_JSERVER_ID *server;
1099 {
1100 register int x;
1101 WNN_JSERVER_ID_INT tmp_js_id;
1102
1103 if(server==0) return(-1);
1104 tmp_js_id = *(WNN_JSERVER_ID_INT *)server;
1105 free((char *)server);
1106 current_js = &tmp_js_id;
1107 server = (WNN_JSERVER_ID *)current_js;
1108 set_current_js(server);
1109 LockMutex(&(current_js_js_lock));
1110 /* handler of jserver dead */
1111 handler_of_jserver_dead(server);
1112 if(wnn_errorno) {
1113 UnlockMutex(&(current_js_js_lock));
1114 return(-1);
1115 }
1116 snd_head(JS_CLOSE, server);
1117 snd_flush(server);
1118 x=get4com(server);
1119 if(x==-1)wnn_errorno=get4com(server);
1120 close(current_sd);
1121 UnlockMutex(&(current_js_js_lock));
1122 return x;
1123 }
1124
1125
1126 /*
1127 jserver �Ȥδ֤� connection ��ĥ�ꡢƱ���� jserver �������˴�
1128 �����롣env_name �˴���¸�ߤ���Ķ�����ꤷ�����ˤϤ��δĶ���
1129 �֤���NULL ����ꤷ�����ˤϿ������Ķ����ä��֤���
1130 */
1131
1132 struct wnn_env *
js_connect_lang(server,env_name,lang)1133 js_connect_lang(server, env_name, lang)
1134 register char *env_name;
1135 WNN_JSERVER_ID *server;
1136 char *lang;
1137 {
1138 register int e_id;
1139 register struct wnn_env_int *env;
1140 void js_set_lang();
1141
1142 set_current_js(server);
1143 if(!(env=(struct wnn_env_int *)malloc(sizeof(struct wnn_env_int)))){
1144 js_wnn_errorno_set=WNN_ALLOC_FAIL;
1145 return NULL;
1146 }
1147 LockMutex(&(server_js_lock));
1148 handler_of_jserver_dead(server);
1149 if(js_wnn_errorno_eql) {
1150 UnlockMutex(&(server_js_lock));
1151 free(env);
1152 return(NULL);
1153 }
1154 snd_head(JS_CONNECT, server);
1155 putscom(env_name, server);
1156 snd_flush(server);
1157 e_id=get4com(server);
1158 if(e_id==-1){ js_wnn_errorno_set= get4com(server); free(env); return NULL; }
1159 UnlockMutex(&(server_js_lock));
1160 env->orig.env_id = e_id;
1161 env->orig.js_id = (WNN_JSERVER_ID *)server;
1162 env->orig.muhenkan_mode = WNN_DIC_RDONLY;
1163 env->orig.bunsetsugiri_mode = WNN_DIC_RDONLY;
1164 env->orig.kutouten_mode = 1;
1165 env->orig.kakko_mode = 1;
1166 env->orig.kigou_mode = 1;
1167 strncpy(env->orig.lang, lang, sizeof(env->orig.lang) - 1); /* set language name */
1168 env->orig.lang[sizeof(env->orig.lang) - 1] = 0;
1169 env->orig.autotune = 0;
1170 /* �ؽ�����ư�����֤γ�����������ʥǥե���� 50 ���*/
1171 env->orig.autosave = 50;
1172 return (struct wnn_env *)env;
1173 }
1174
1175
1176 /* get language value from env */
1177 char *
js_get_lang(env)1178 js_get_lang(env)
1179 struct wnn_env *env;
1180 {
1181 return(env->lang);
1182 }
1183
1184 int
js_env_exist(server,env_name)1185 js_env_exist(server,env_name)
1186 register char *env_name;
1187 register WNN_JSERVER_ID *server;
1188 {
1189 int x;
1190
1191 set_current_js(server);
1192 LockMutex(&(server_js_lock));
1193 handler_of_jserver_dead(server);
1194 if(js_wnn_errorno_eql) {
1195 UnlockMutex(&(server_js_lock));
1196 return(-1);
1197 }
1198 snd_head(JS_ENV_EXIST, server);
1199 putscom(env_name, server);
1200 snd_flush(server);
1201 x =get4com(server);
1202 UnlockMutex(&(server_js_lock));
1203 return x;
1204 }
1205
1206 int
js_env_sticky(env)1207 js_env_sticky(env)
1208 register struct wnn_env *env;
1209 {
1210 int x;
1211
1212 if(env==0) return(-1);
1213 set_current_js(env->js_id);
1214 LockMutex(&(env_js_lock));
1215 handler_of_jserver_dead_env(env);
1216 if(env_wnn_errorno_eql) {
1217 UnlockMutex(&(env_js_lock));
1218 return(-1);
1219 }
1220 snd_env_head(env,JS_ENV_STICKY);
1221 snd_flush(env->js_id);
1222 x = get4com(env->js_id);
1223 UnlockMutex(&(env_js_lock));
1224 return x;
1225 }
1226
1227 int
js_env_un_sticky(env)1228 js_env_un_sticky(env)
1229 register struct wnn_env *env;
1230 {
1231 int x;
1232
1233 if(env==0) return(-1);
1234 set_current_js(env->js_id);
1235 LockMutex(&(env_js_lock));
1236 handler_of_jserver_dead_env(env);
1237 if(env_wnn_errorno_eql) {
1238 UnlockMutex(&(env_js_lock));
1239 return(-1);
1240 }
1241 snd_env_head(env,JS_ENV_UN_STICKY);
1242 snd_flush(env->js_id);
1243 x = get4com(env->js_id);
1244 UnlockMutex(&(env_js_lock));
1245 return x;
1246 }
1247
1248 /**
1249 env �Ǽ������Ķ���̵������
1250 **/
1251 int
js_disconnect(env)1252 js_disconnect(env)
1253 register struct wnn_env *env;
1254 {register int x;
1255 if(env==0) return(-1);
1256 /* ����ϡ�free ���ʤ��㤢����Τ����ɡ����������������ʤ�����
1257 �ޤ���8�Х��Ȥ����顢���ߤ��Ĥ뤱�ɤ���������
1258 free((char *)env);
1259 */
1260 set_current_js(env->js_id);
1261 LockMutex(&(env_js_lock));
1262 handler_of_jserver_dead_env(env);
1263 if(env_wnn_errorno_eql) {
1264 UnlockMutex(&(env_js_lock));
1265 return(-1);
1266 }
1267 snd_env_head(env,JS_DISCONNECT);
1268 snd_flush(env->js_id);
1269 x=get4com(env->js_id);
1270 if(x==-1){ env_wnn_errorno_set= get4com(env->js_id); }
1271 UnlockMutex(&(env_js_lock));
1272 return x;
1273 }
1274
1275 /** �����Фȥ��ͥ��Ȥ��Ƥ��뤫 **/
1276 int
js_isconnect(env)1277 js_isconnect(env)
1278 struct wnn_env *env;
1279 {
1280 if (env && env->js_id)
1281 return(env->js_id->js_dead);
1282 return(-1);
1283 }
1284
1285 /**
1286 env �� �Ķ� �Ȥ��̿��Хåե��� flush ���롣
1287 **/
1288 void
js_flush(env)1289 js_flush(env)
1290 struct wnn_env *env;
1291 {
1292 }
1293
1294
1295
1296 /* Parameter set/get */
1297 /** �Ѵ� parameter �����ꤹ�롣 **/
1298 /** js_param_set **/
1299 int
js_param_set(env,para)1300 js_param_set(env,para)
1301 struct wnn_env *env;
1302 register struct wnn_param *para;
1303 {register int x;
1304 if(env==0) return(-1);
1305 set_current_js(env->js_id);
1306 LockMutex(&(env_js_lock));
1307 handler_of_jserver_dead_env(env);
1308 if(env_wnn_errorno_eql) {
1309 UnlockMutex(&(env_js_lock));
1310 return(-1);
1311 }
1312 snd_env_head(env,JS_PARAM_SET);
1313 put4com(para->n, env->js_id); /* ��(��)ʸ����ϤΣ� */
1314 put4com(para->nsho, env->js_id); /* ��ʸ����ξ�ʸ��κ���� */
1315 put4com(para->p1, env->js_id); /* ��������٤Υѥ��� */
1316 put4com(para->p2, env->js_id); /* ��ʸ��Ĺ�Υѥ��� */
1317 put4com(para->p3, env->js_id); /* ����Ĺ�Υѥ��� */
1318 put4com(para->p4, env->js_id); /* ���Ȥä���ӥåȤΥѥ��� */
1319 put4com(para->p5, env->js_id); /* ����Υѥ��� */
1320 put4com(para->p6, env->js_id); /* ��ʸ���ɾ���ͤΥѥ��� */
1321 put4com(para->p7, env->js_id); /* ��ʸ��Ĺ�Υѥ��� */
1322 put4com(para->p8, env->js_id); /* ��ʸ����Υѥ��� */
1323
1324 put4com(para->p9, env->js_id); /* �����ʻ� ���������� */
1325 put4com(para->p10, env->js_id); /* �����ʻ� ���ʤ����� *//* CWNN �ѿ������� */
1326 put4com(para->p11, env->js_id); /* �����ʻ� �ѿ������� *//* CWNN ��������� */
1327 put4com(para->p12, env->js_id); /* �����ʻ� ��������� *//* CWNN ����̤����� */
1328 put4com(para->p13, env->js_id); /* �����ʻ� �ij�̤����� *//* CWNN �ij�̤����� */
1329 put4com(para->p14, env->js_id); /* �����ʻ� ��°������� *//* BWNN No of koho */
1330 put4com(para->p15, env->js_id); /* �����ʻ� ����̤����� *//* CWNN Not used */
1331
1332 snd_flush(env->js_id);
1333 x=get4com(env->js_id);
1334 if(x==-1){ env_wnn_errorno_set= get4com(env->js_id);
1335 UnlockMutex(&(env_js_lock)); return -1; }
1336 UnlockMutex(&(env_js_lock));
1337 return 0;
1338 }
1339
1340 extern int js_get_autolearning_mode_core();
1341
1342 #define WNN_ENV_LOCAL_MASK \
1343 (WNN_ENV_KUTOUTEN_MASK|WNN_ENV_KAKKO_MASK|WNN_ENV_KIGOU_MASK)
1344
1345 /*:::DOC_START
1346 *
1347 * Function Name: js_set_henkan_env
1348 * Description : ����������Ѵ��Ķ������ꤹ��
1349 * Parameter :
1350 * env : (In) �Ķ��ؤΥݥ���
1351 * valuemask : (In) ͭ�������ͥӥåȥޥ���
1352 * henv : (In) �Ѵ��Ķ��ι�¤�ΤؤΥݥ���
1353 *
1354 * Return value : 0==SUCCESS, -1==ERROR
1355 *
1356 * Author : Hideyuki Kishiba
1357 *
1358 * Revision history:
1359 *
1360 *:::DOC_END
1361 */
1362 int
js_set_henkan_env(env,valuemask,henv)1363 js_set_henkan_env(env,valuemask,henv)
1364 struct wnn_env *env;
1365 unsigned long valuemask;
1366 register struct wnn_henkan_env *henv;
1367 {
1368 register int x;
1369
1370 if(env==0) return(-1);
1371 set_current_js(env->js_id);
1372 LockMutex(&(env_js_lock));
1373 handler_of_jserver_dead_env(env);
1374 if(env_wnn_errorno_eql) {
1375 UnlockMutex(&(env_js_lock));
1376 return(-1);
1377 }
1378 if (valuemask & WNN_ENV_LOCAL_MASK){
1379 if (valuemask & WNN_ENV_KUTOUTEN_MASK)
1380 env->kutouten_mode = henv->kutouten_flag;
1381 if (valuemask & WNN_ENV_KAKKO_MASK)
1382 env->kakko_mode = henv->kakko_flag;
1383 if (valuemask & WNN_ENV_KIGOU_MASK)
1384 env->kigou_mode = henv->kigou_flag;
1385 }
1386 if (!(valuemask & ~WNN_ENV_LOCAL_MASK)) {
1387 UnlockMutex(&(env_js_lock));
1388 return 0;
1389 }
1390 snd_env_head(env,JS_SET_HENKAN_ENV);
1391 put4com(valuemask, env->js_id); /* ����ӥåȥޥ��� */
1392 put4com(henv->last_is_first_flag, env->js_id); /* �ǽ����Ѻ�ͥ�� */
1393 put4com(henv->complex_flag, env->js_id); /* ʣ���ͥ�� */
1394 put4com(henv->okuri_learn_flag, env->js_id); /* ������ؽ� */
1395 put4com(henv->okuri_flag, env->js_id); /* ��������� */
1396 put4com(henv->prefix_learn_flag, env->js_id); /* ��Ƭ��ؽ� */
1397 put4com(henv->prefix_flag, env->js_id); /* ��Ƭ����� */
1398 put4com(henv->suffix_learn_flag, env->js_id); /* ������ؽ� */
1399 put4com(henv->common_learn_flag, env->js_id); /* ���Ѹ�ؽ� */
1400 put4com(henv->freq_func_flag, env->js_id); /* ���پ徺��Ψ�ؿ� */
1401 put4com(henv->numeric_flag, env->js_id); /* ���������ν��ɽ����ˡ */
1402 put4com(henv->alphabet_flag, env->js_id); /* ��������ե��٥åȤν��ɽ����ˡ */
1403 put4com(henv->symbol_flag, env->js_id); /* ��������ν��ɽ����ˡ */
1404 put4com(henv->yuragi_flag, env->js_id); /* Ĺ������餮���� */
1405 put4com(henv->rendaku_flag, env->js_id); /* Ϣ������ */
1406 put4com(henv->bunsetsugiri_flag, env->js_id); /* ʸ���ڤ�ؽ��⡼�� */
1407 put4com(henv->muhenkan_flag, env->js_id); /* ̵�Ѵ��ؽ��⡼�� */
1408 put4com(henv->fi_relation_learn_flag, env->js_id); /* �ƣɴط��ؽ��⡼�� */
1409 put4com(henv->fi_freq_func_flag, env->js_id); /* �ƣɴط����پ徺��Ψ�ؿ� */
1410
1411 snd_flush(env->js_id);
1412 x=get4com(env->js_id);
1413 if(x==-1){
1414 env_wnn_errorno_set= get4com(env->js_id);
1415 UnlockMutex(&(env_js_lock));
1416 return -1;
1417 }
1418 if (valuemask & WNN_ENV_BUNSETSUGIRI_LEARN_MASK)
1419 env->bunsetsugiri_mode = henv->bunsetsugiri_flag;
1420 if (valuemask & WNN_ENV_MUHENKAN_LEARN_MASK)
1421 env->muhenkan_mode = henv->muhenkan_flag;
1422 UnlockMutex(&(env_js_lock));
1423 return 0;
1424 } /* End of js_set_henkan_env */
1425
1426 /*:::DOC_START
1427 *
1428 * Function Name: js_set_henkan_hinsi
1429 * Description : �Ѵ��ˡʻ��ѡ��Ի��ѡˤ����ʻ췲�����ꤹ��
1430 * Parameter :
1431 * env : (In) �Ķ��ؤΥݥ���
1432 * mode : (In) ����⡼�ɡ�0 == ��������, else ���������
1433 * nhinsi : (In) �����ʻ������ == �Ի���, �� ���ѡ�
1434 * hlist : (In) �����ʻ�ꥹ�ȤؤΥݥ���
1435 *
1436 * Return value : 0==SUCCESS, -1==ERROR
1437 *
1438 * Author : Hideyuki Kishiba
1439 *
1440 * Revision history:
1441 *
1442 *:::DOC_END
1443 */
1444 int
js_set_henkan_hinsi(env,mode,nhinsi,hlist)1445 js_set_henkan_hinsi(env,mode,nhinsi,hlist)
1446 struct wnn_env *env;
1447 int mode, nhinsi, *hlist;
1448 {
1449 register int x;
1450 if(env==0) return(-1);
1451 set_current_js(env->js_id);
1452 LockMutex(&(env_js_lock));
1453 handler_of_jserver_dead_env(env);
1454 if(env_wnn_errorno_eql) {
1455 UnlockMutex(&(env_js_lock));
1456 return(-1);
1457 }
1458 snd_env_head(env,JS_SET_HENKAN_HINSI);
1459 put4com(mode, env->js_id);
1460 put4com(nhinsi, env->js_id);
1461 for(x = 0; x < abs(nhinsi); x++) put4com(hlist[x], env->js_id);
1462 snd_flush(env->js_id);
1463 x=get4com(env->js_id);
1464 if(x==-1){ env_wnn_errorno_set= get4com(env->js_id);
1465 UnlockMutex(&(env_js_lock)); return -1; }
1466 UnlockMutex(&(env_js_lock));
1467 return 0;
1468 }
1469
1470 /** js_param_get **/
1471 /** env �Ǽ������Ķ����Ѵ� parameter ����Ф��� **/
1472 int
js_param_get(env,para)1473 js_param_get(env,para)
1474 struct wnn_env *env;
1475 register struct wnn_param *para;
1476 {
1477 if(env==0) return(-1);
1478 set_current_js(env->js_id);
1479 LockMutex(&(env_js_lock));
1480 handler_of_jserver_dead_env(env);
1481 if(env_wnn_errorno_eql) {
1482 UnlockMutex(&(env_js_lock));
1483 return(-1);
1484 }
1485 snd_env_head(env,JS_PARAM_GET);
1486 snd_flush(env->js_id);
1487 if(get4com(env->js_id) == -1){
1488 env_wnn_errorno_set= get4com(env->js_id);
1489 UnlockMutex(&(env_js_lock)); return -1;
1490 }
1491 para->n=get4com(env->js_id); /* ��(��)ʸ����ϤΣ� */
1492 para->nsho=get4com(env->js_id); /* ��ʸ����ξ�ʸ��κ���� */
1493 para->p1=get4com(env->js_id); /* ��������٤Υѥ��� */
1494 para->p2=get4com(env->js_id); /* ��ʸ��Ĺ�Υѥ��� */
1495 para->p3=get4com(env->js_id); /* ����Ĺ�Υѥ��� */
1496 para->p4=get4com(env->js_id); /* ���Ȥä���ӥåȤΥѥ��� */
1497 para->p5=get4com(env->js_id); /* ����Υѥ��� */
1498 para->p6=get4com(env->js_id); /* ��ʸ���ɾ���ͤΥѥ��� */
1499 para->p7=get4com(env->js_id); /* ��ʸ��Ĺ�Υѥ��� */
1500 para->p8=get4com(env->js_id); /* ��ʸ����Υѥ��� */
1501 para->p9=get4com(env->js_id); /* �����ʻ� ���������� */
1502 para->p10=get4com(env->js_id); /* �����ʻ� ���ʤ����� */
1503 para->p11=get4com(env->js_id); /* �����ʻ� �ѿ������� */
1504 para->p12=get4com(env->js_id); /* �����ʻ� ��������� */
1505 para->p13=get4com(env->js_id); /* �����ʻ� �ij�̤����� */
1506 para->p14=get4com(env->js_id); /* �����ʻ� ��°������� */
1507 para->p15=get4com(env->js_id); /* �����ʻ� ����̤����� */
1508 UnlockMutex(&(env_js_lock));
1509 return 0;
1510 }
1511
1512 /*:::DOC_START
1513 *
1514 * Function Name: js_get_henkan_env
1515 * Description : ����������Ѵ��Ķ�������
1516 * Parameter :
1517 * env : (In) �Ķ��ؤΥݥ���
1518 * henv : (Out) �Ѵ��Ķ��ι�¤�ΤؤΥݥ���
1519 *
1520 * Return value : 0==SUCCESS, -1==ERROR
1521 *
1522 * Author : Hideyuki Kishiba
1523 *
1524 * Revision history:
1525 *
1526 *:::DOC_END
1527 */
1528 int
js_get_henkan_env(env,henv)1529 js_get_henkan_env(env,henv)
1530 struct wnn_env *env;
1531 register struct wnn_henkan_env *henv;
1532 {
1533 if(env==0) return(-1);
1534 set_current_js(env->js_id);
1535 LockMutex(&(env_js_lock));
1536 handler_of_jserver_dead_env(env);
1537 if(env_wnn_errorno_eql) {
1538 UnlockMutex(&(env_js_lock));
1539 return(-1);
1540 }
1541 snd_env_head(env,JS_GET_HENKAN_ENV);
1542 snd_flush(env->js_id);
1543 if(get4com(env->js_id) == -1){
1544 env_wnn_errorno_set= get4com(env->js_id);
1545 UnlockMutex(&(env_js_lock)); return -1;
1546 }
1547 henv->last_is_first_flag=get4com(env->js_id); /* �ǽ����Ѻ�ͥ�� */
1548 henv->complex_flag=get4com(env->js_id); /* ʣ���ͥ�� */
1549 henv->okuri_learn_flag=get4com(env->js_id); /* ������ؽ� */
1550 henv->okuri_flag=get4com(env->js_id); /* ��������� */
1551 henv->prefix_learn_flag=get4com(env->js_id); /* ��Ƭ��ؽ� */
1552 henv->prefix_flag=get4com(env->js_id); /* ��Ƭ����� */
1553 henv->suffix_learn_flag=get4com(env->js_id); /* ������ؽ� */
1554 henv->common_learn_flag=get4com(env->js_id); /* ���Ѹ�ؽ� */
1555 henv->freq_func_flag=get4com(env->js_id); /* ���پ徺��Ψ�ؿ� */
1556 henv->numeric_flag=get4com(env->js_id); /* ���������ν��ɽ����ˡ */
1557 henv->alphabet_flag=get4com(env->js_id); /* ��������ե��٥åȤν��ɽ����ˡ */
1558 henv->symbol_flag=get4com(env->js_id); /* ��������ν��ɽ����ˡ */
1559 henv->yuragi_flag=get4com(env->js_id); /* Ĺ������餮���� */
1560 henv->rendaku_flag=get4com(env->js_id); /* Ϣ������ */
1561 henv->bunsetsugiri_flag=get4com(env->js_id); /* ʸ���ڤ�ؽ��⡼�� */
1562 henv->muhenkan_flag=get4com(env->js_id); /* ̵�Ѵ��ؽ��⡼�� */
1563 henv->fi_relation_learn_flag=get4com(env->js_id); /* �ƣɴط��ؽ��⡼�� */
1564 henv->fi_freq_func_flag=get4com(env->js_id); /* �ƣɴط����پ徺��Ψ�ؿ� */
1565
1566 env->bunsetsugiri_mode = henv->bunsetsugiri_flag;
1567 env->muhenkan_mode = henv->muhenkan_flag;
1568
1569 henv->kutouten_flag = env->kutouten_mode; /* ������ */
1570 henv->kakko_flag = env->kakko_mode; /* ��� */
1571 henv->kigou_flag = env->kigou_mode; /* ���� */
1572
1573 UnlockMutex(&(env_js_lock));
1574 return 0;
1575 } /* End of js_get_henkan_env */
1576
1577 /*:::DOC_START
1578 *
1579 * Function Name: js_get_henkan_env_local
1580 * Description : �Ѵ��δĶ����⡤�饤�֥��ˤ����Τ���
1581 * ����������̡�����
1582 * Parameter :
1583 * env : (In) �Ķ��ؤΥݥ���
1584 * henv : (In) �Ѵ��Ķ��ι�¤�ΤؤΥݥ���
1585 *
1586 * Return value : 0==SUCCESS, -1==ERROR
1587 *
1588 * Author : Seiji KUWARI
1589 *
1590 * Revision history:
1591 *
1592 *:::DOC_END
1593 */
1594 int
js_get_henkan_env_local(env,henv)1595 js_get_henkan_env_local(env,henv)
1596 struct wnn_env *env;
1597 register struct wnn_henkan_env *henv;
1598 {
1599 if(env==0) return(-1);
1600 LockMutex(&(env_js_lock));
1601 if(env_wnn_errorno_eql) {
1602 UnlockMutex(&(env_js_lock));
1603 return(-1);
1604 }
1605 henv->kutouten_flag = env->kutouten_mode; /* ������ */
1606 henv->kakko_flag = env->kakko_mode; /* ��� */
1607 henv->kigou_flag = env->kigou_mode; /* ���� */
1608
1609 UnlockMutex(&(env_js_lock));
1610 return 0;
1611 }
1612
1613 /*:::DOC_START
1614 *
1615 * Function Name: js_get_henkan_hinsi
1616 * Description : �Ѵ��ˡʻ��ѡ��Ի��ѡˤ����ʻ췲������
1617 * Parameter :
1618 * env : (In) �Ķ��ؤΥݥ���
1619 * nhinsi : (Out) �����ʻ������ == �Ի���, �� ���ѡ�
1620 * hlist : (Out) �����ʻ�ꥹ�ȤؤΥݥ���
1621 *
1622 * Return value : 0==SUCCESS, -1==ERROR
1623 *
1624 * Author : Hideyuki Kishiba
1625 *
1626 * Revision history:
1627 *
1628 *:::DOC_END
1629 */
1630 int
js_get_henkan_hinsi(env,nhinsi,hlist)1631 js_get_henkan_hinsi(env,nhinsi,hlist)
1632 struct wnn_env *env;
1633 int *nhinsi, **hlist;
1634 {
1635 int i;
1636 if(env==0) return(-1);
1637 set_current_js(env->js_id);
1638 LockMutex(&(env_js_lock));
1639 handler_of_jserver_dead_env(env);
1640 if(env_wnn_errorno_eql) {
1641 UnlockMutex(&(env_js_lock));
1642 return(-1);
1643 }
1644 snd_env_head(env,JS_GET_HENKAN_HINSI);
1645 snd_flush(env->js_id);
1646 if(get4com(env->js_id) == -1){
1647 env_wnn_errorno_set= get4com(env->js_id);
1648 UnlockMutex(&(env_js_lock)); return -1;
1649 }
1650 *nhinsi = get4com(env->js_id);
1651 if(((*hlist) = (int *)malloc(abs(*nhinsi) * sizeof(int))) == NULL) {
1652 int dummy;
1653 for(i = 0; i < abs(*nhinsi); i++) dummy = get4com(env->js_id);
1654 env_wnn_errorno_set = WNN_ALLOC_FAIL;
1655 UnlockMutex(&(env_js_lock)); return -1;
1656 }
1657 for(i = 0; i < abs(*nhinsi); i++) (*hlist)[i] = get4com(env->js_id);
1658 UnlockMutex(&(env_js_lock));
1659 return 0;
1660 } /* End of js_get_henkan_hinsi */
1661
1662 /*
1663 global File Operation
1664 */
1665 /** js_mkdir **/
1666 int
js_mkdir(env,path)1667 js_mkdir(env,path)
1668 struct wnn_env *env;
1669 char *path;
1670 {register int x;
1671 if(env==0) return(-1);
1672 set_current_js(env->js_id);
1673 LockMutex(&(env_js_lock));
1674 handler_of_jserver_dead_env(env);
1675 if(env_wnn_errorno_eql) {
1676 UnlockMutex(&(env_js_lock));
1677 return(-1);
1678 }
1679 snd_env_head(env,JS_MKDIR);
1680 putscom(path, env->js_id);
1681 snd_flush(env->js_id);
1682 x=get4com(env->js_id);
1683 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
1684 UnlockMutex(&(env_js_lock));
1685 return x;
1686 }
1687
1688 /** js_access **/
1689 int
js_access(env,path,amode)1690 js_access(env,path,amode)
1691 struct wnn_env *env;
1692 char *path;
1693 int amode;
1694 {register int x;
1695 if(env==0) return(-1);
1696 set_current_js(env->js_id);
1697 LockMutex(&(env_js_lock));
1698 handler_of_jserver_dead_env(env);
1699 if(env_wnn_errorno_eql) {
1700 UnlockMutex(&(env_js_lock));
1701 return(-1);
1702 }
1703 snd_env_head(env,JS_ACCESS);
1704 put4com(amode, env->js_id);
1705 putscom(path, env->js_id);
1706 snd_flush(env->js_id);
1707 x=get4com(env->js_id);
1708 UnlockMutex(&(env_js_lock));
1709 return x;
1710 }
1711
1712 /** js_file_list_all **/
1713 static int rcv_file_list();
1714
1715 int
js_file_list_all(server,ret)1716 js_file_list_all(server,ret)
1717 WNN_JSERVER_ID *server;
1718 struct wnn_ret_buf *ret;
1719 {
1720 int x;
1721
1722 set_current_js(server);
1723 LockMutex(&(server_js_lock));
1724 handler_of_jserver_dead(server);
1725 if(js_wnn_errorno_eql) {
1726 UnlockMutex(&(server_js_lock));
1727 return(-1);
1728 }
1729 snd_server_head(server,JS_FILE_LIST_ALL);
1730 snd_flush(server);
1731 x = rcv_file_list(ret, server);
1732 UnlockMutex(&(server_js_lock));
1733 return x;
1734 }
1735
1736 /** js_file_list **/
1737 int
js_file_list(env,ret)1738 js_file_list(env,ret)
1739 struct wnn_env *env;
1740 struct wnn_ret_buf *ret;
1741 {
1742 int x;
1743
1744 if(env==0) return(-1);
1745 set_current_js(env->js_id);
1746 LockMutex(&(env_js_lock));
1747 handler_of_jserver_dead_env(env);
1748 if(env_wnn_errorno_eql) {
1749 UnlockMutex(&(env_js_lock));
1750 return(-1);
1751 }
1752 snd_env_head(env,JS_FILE_LIST);
1753 snd_flush(env->js_id);
1754 x = rcv_file_list(ret, env->js_id);
1755 UnlockMutex(&(env_js_lock));
1756 return x;
1757 }
1758
1759 static void re_alloc();
1760
1761 static int
rcv_file_list(ret,server)1762 rcv_file_list(ret, server)
1763 struct wnn_ret_buf *ret;
1764 ARGS *server;
1765 {register int i,count;
1766 WNN_FILE_INFO_STRUCT *files;
1767 count=get4com(server);
1768 re_alloc(ret,sizeof(WNN_FILE_INFO_STRUCT)*count);
1769 files=(WNN_FILE_INFO_STRUCT *)ret->buf;
1770 for(i=0;i<count;i++){
1771 files->fid= get4com(server);
1772 files->localf= get4com(server);
1773 files->ref_count= get4com(server);
1774 files->type= get4com(server);
1775 getscom(files->name, server, WNN_F_NAMELEN);
1776 files++;
1777 }
1778 return count;
1779 }
1780
1781 /** js_file_stat **/
1782 int
js_file_stat(env,path,s)1783 js_file_stat(env,path, s)
1784 struct wnn_env *env;
1785 char *path;
1786 WNN_FILE_STAT *s;
1787 {register int x;
1788 if(env==0) return(-1);
1789 set_current_js(env->js_id);
1790 LockMutex(&(env_js_lock));
1791 handler_of_jserver_dead_env(env);
1792 if(env_wnn_errorno_eql) {
1793 UnlockMutex(&(env_js_lock));
1794 return(-1);
1795 }
1796 snd_env_head(env,JS_FILE_STAT);
1797 putscom(path, env->js_id);
1798 snd_flush(env->js_id);
1799 x=get4com(env->js_id);
1800 UnlockMutex(&(env_js_lock));
1801 s->type = x;
1802 return x;
1803 }
1804
1805
1806 /** js_file_info **/
1807 int
js_file_info(env,fid,file)1808 js_file_info(env,fid,file)
1809 struct wnn_env *env;
1810 int fid;
1811 register WNN_FILE_INFO_STRUCT *file;
1812 {register int x;
1813 if(env==0) return(-1);
1814 set_current_js(env->js_id);
1815 LockMutex(&(env_js_lock));
1816 handler_of_jserver_dead_env(env);
1817 if(env_wnn_errorno_eql) {
1818 UnlockMutex(&(env_js_lock));
1819 return(-1);
1820 }
1821 snd_env_head(env,JS_FILE_INFO);
1822 put4com(fid, env->js_id);
1823 snd_flush(env->js_id);
1824 file->fid= fid;
1825 x=get4com(env->js_id);
1826 if(x==-1){
1827 env_wnn_errorno_set= get4com(env->js_id);
1828 UnlockMutex(&(env_js_lock));
1829 return(-1);
1830 }
1831 getscom(file->name, env->js_id, WNN_F_NAMELEN);
1832 file->localf= get4com(env->js_id);
1833 file->ref_count= get4com(env->js_id);
1834 file->type= get4com(env->js_id);
1835 UnlockMutex(&(env_js_lock));
1836 return 0;
1837 }
1838
1839 /** js_file_loaded **/
1840 int
js_file_loaded(server,path)1841 js_file_loaded(server,path)
1842 WNN_JSERVER_ID *server;
1843 char *path;
1844 {register int x;
1845 set_current_js(server);
1846 LockMutex(&(server_js_lock));
1847 handler_of_jserver_dead(server);
1848 if(js_wnn_errorno_eql) {
1849 UnlockMutex(&(server_js_lock));
1850 return(-1);
1851 }
1852 snd_server_head(server,JS_FILE_LOADED);
1853 putscom(path, server);
1854 snd_flush(server);
1855 x=get4com(server);
1856 UnlockMutex(&(server_js_lock));
1857 return x;
1858 }
1859
1860 /** js_file_loaded_local **/
1861 static int check_local_file();
1862 static int file_loaded_local();
1863
1864 static int
js_file_loaded_local_body(server,path)1865 js_file_loaded_local_body(server,path)
1866 WNN_JSERVER_ID *server;
1867 char *path;
1868 {int x;
1869
1870 handler_of_jserver_dead(server);
1871 if(js_wnn_errorno_eql) {
1872 return(-1);
1873 }
1874 if(check_local_file(path, server) == -1) return (-1);
1875 snd_server_head(server, JS_FILE_LOADED_LOCAL);
1876 x=file_loaded_local(path, server);
1877 return x;
1878 }
1879
1880 int
js_file_loaded_local(server,path)1881 js_file_loaded_local(server,path)
1882 WNN_JSERVER_ID *server;
1883 char *path;
1884 {
1885 int x;
1886 set_current_js(server);
1887 LockMutex(&(server_js_lock));
1888 x = js_file_loaded_local_body(server,path);
1889 UnlockMutex(&(server_js_lock));
1890 return x;
1891 }
1892
1893 static int
check_local_file(path,server)1894 check_local_file(path, server)
1895 char *path;
1896 ARGS *server;
1897 {
1898 register FILE *f;
1899 register int x;
1900 struct wnn_file_head fh;
1901 int is_compressed;
1902
1903 #ifdef WRITE_CHECK
1904 check_backup(path, NULL);
1905 #endif /* WRITE_CHECK */
1906 f=dic_fopen(path,"r", &is_compressed);
1907 if(f == NULL){
1908 js_wnn_errorno_set = WNN_OPENF_ERR;
1909 return -1;
1910 }
1911 x=input_file_header(f, &fh, NULL);
1912 if(x==-1){
1913 dic_fclose(f, is_compressed);
1914 js_wnn_errorno_set = WNN_NOT_A_FILE;
1915 return -1;
1916 }
1917 if(dic_check_inode(f, &fh, path, is_compressed) == -1){
1918 change_file_uniq(&fh, path, NULL);
1919 #ifdef WRITE_CHECK
1920 dic_fclose(f, is_compressed);
1921 f=dic_fopen(path,"r", &is_compressed);
1922 if(f == NULL){
1923 js_wnn_errorno_set = WNN_OPENF_ERR;
1924 return (-1);
1925 }
1926 #endif /* WRITE_CHECK */
1927 if(dic_check_inode(f, &fh, path, is_compressed) == -1){
1928 dic_fclose(f, is_compressed);
1929 js_wnn_errorno_set = WNN_INODE_CHECK_ERROR;
1930 return (-1);
1931 }
1932 }
1933 dic_fclose(f, is_compressed);
1934 return 0;
1935 }
1936
1937
1938 static int
file_loaded_local(path,server)1939 file_loaded_local(path, server)
1940 char *path;
1941 ARGS *server;
1942 {register int x,i;
1943 FILE *f;
1944 struct wnn_file_head fh;
1945 int is_compressed;
1946
1947 #ifdef WRITE_CHECK
1948 check_backup(path, NULL);
1949 #endif /* WRITE_CHECK */
1950 f=dic_fopen(path,"r", &is_compressed);
1951 if(f == NULL){
1952 js_wnn_errorno_set = WNN_OPENF_ERR;
1953 return -1;
1954 }
1955 x=input_file_header(f, &fh, NULL);
1956 if(x==-1){
1957 dic_fclose(f, is_compressed);
1958 js_wnn_errorno_set = WNN_NOT_A_FILE;
1959 return -1;
1960 }
1961 put4com(fh.file_uniq.time, server);
1962 put4com(fh.file_uniq.dev, server);
1963 put4com(fh.file_uniq.inode, server);
1964 for(i=0;i<WNN_HOSTLEN;i++){
1965 put1com(fh.file_uniq.createhost[i], server);
1966 }
1967
1968 snd_flush(server);
1969 x=get4com(server);
1970 dic_fclose(f, is_compressed);
1971 return x;
1972 }
1973
1974 /** js_hindo_file_create **/
1975 int
js_hindo_file_create(env,fid,fn,comment,hpasswd)1976 js_hindo_file_create(env,fid,fn,comment,hpasswd)
1977 struct wnn_env *env;
1978 int fid;
1979 char *fn;
1980 w_char *comment;
1981 char *hpasswd;
1982 {register int x;
1983 if(env==0) return(-1);
1984 set_current_js(env->js_id);
1985 LockMutex(&(env_js_lock));
1986 handler_of_jserver_dead_env(env);
1987 if(env_wnn_errorno_eql) {
1988 UnlockMutex(&(env_js_lock));
1989 return(-1);
1990 }
1991 snd_env_head(env,JS_HINDO_FILE_CREATE);
1992 put4com(fid, env->js_id);
1993 putscom(fn, env->js_id);
1994 putwscom(comment, env->js_id);
1995 putscom(hpasswd, env->js_id);
1996 snd_flush(env->js_id);
1997 x=get4com(env->js_id);
1998 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
1999 UnlockMutex(&(env_js_lock));
2000 return x;
2001 }
2002
2003 /*:::DOC_START
2004 *
2005 * Function Name: js_fi_hindo_file_create
2006 * Description : ������¦�ˣƣɴط����٥ե�������������
2007 * Parameter :
2008 * env : (In) �Ķ��ؤΥݥ���
2009 * fid : (In) �б��ƣɴط�����ե�����ɣ�
2010 * fn : (In) �ƣɴط����٥ե�����̾
2011 * comment : (In) �ƣɴط����٥ե����륳����
2012 * hpasswd : (In) �ƣɴط����٥ե�����ѥ����
2013 *
2014 * Return value : 0==SUCCESS, -1==ERROR
2015 *
2016 * Author : Hideyuki Kishiba
2017 *
2018 * Revision history:
2019 *
2020 *:::DOC_END
2021 */
2022 int
js_fi_hindo_file_create(env,fid,fn,comment,hpasswd)2023 js_fi_hindo_file_create(env, fid, fn, comment, hpasswd)
2024 struct wnn_env *env;
2025 int fid;
2026 char *fn;
2027 w_char *comment;
2028 char *hpasswd;
2029 {register int x;
2030 if(env==0) return(-1);
2031 set_current_js(env->js_id);
2032 LockMutex(&(env_js_lock));
2033 handler_of_jserver_dead_env(env);
2034 if(env_wnn_errorno_eql) {
2035 UnlockMutex(&(env_js_lock));
2036 return(-1);
2037 }
2038 snd_env_head(env,JS_FI_HINDO_FILE_CREATE);
2039 put4com(fid, env->js_id);
2040 putscom(fn, env->js_id);
2041 putwscom(comment, env->js_id);
2042 putscom(hpasswd, env->js_id);
2043 snd_flush(env->js_id);
2044 x=get4com(env->js_id);
2045 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2046 UnlockMutex(&(env_js_lock));
2047 return x;
2048 } /* End of js_fi_hindo_file_create */
2049
2050 /*:::DOC_START
2051 *
2052 * Function Name: js_dic_file_create
2053 * Description : ������¦�˼���ե�������������
2054 * Parameter :
2055 * env : (In) �Ķ��ؤΥݥ���
2056 * fn : (In) ��������ե�����̾
2057 * type : (In) ��������ե����륿����
2058 * comment : (In) ��������ե����륳����
2059 * passwd (In) ��������ե�����ѥ����
2060 * hpasswd : (In) �������������٥ѥ����
2061 *
2062 * Return value : 0==SUCCESS, -1==ERROR
2063 *
2064 * Author : Hideyuki Kishiba
2065 *
2066 * Revision history:
2067 *
2068 *:::DOC_END
2069 */
2070 int
js_dic_file_create(env,fn,type,comment,passwd,hpasswd)2071 js_dic_file_create(env, fn, type, comment, passwd, hpasswd)
2072 struct wnn_env *env;
2073 char *fn;
2074 w_char *comment;
2075 char *passwd, *hpasswd;
2076 int type;
2077 {register int x;
2078 if(env==0) return(-1);
2079 set_current_js(env->js_id);
2080 LockMutex(&(env_js_lock));
2081 handler_of_jserver_dead_env(env);
2082 if(env_wnn_errorno_eql) {
2083 UnlockMutex(&(env_js_lock));
2084 return(-1);
2085 }
2086 snd_env_head(env,JS_DIC_FILE_CREATE);
2087 putscom(fn, env->js_id);
2088 putwscom(comment, env->js_id);
2089 putscom(passwd, env->js_id);
2090 putscom(hpasswd, env->js_id);
2091 put4com(type, env->js_id);
2092 snd_flush(env->js_id);
2093 x=get4com(env->js_id);
2094 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2095 UnlockMutex(&(env_js_lock));
2096 return x;
2097 } /* End of js_dic_file_create */
2098
2099
2100 /** js_file_discard **/
2101 int
js_file_discard(env,fid)2102 js_file_discard(env,fid)
2103 struct wnn_env *env;
2104 int fid;
2105 {register int x;
2106 if(env==0) return(-1);
2107 set_current_js(env->js_id);
2108 LockMutex(&(env_js_lock));
2109 handler_of_jserver_dead_env(env);
2110 if(env_wnn_errorno_eql) {
2111 UnlockMutex(&(env_js_lock));
2112 return(-1);
2113 }
2114 snd_env_head(env,JS_FILE_DISCARD);
2115 put4com(fid, env->js_id);
2116 snd_flush(env->js_id);
2117 x=get4com(env->js_id);
2118 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2119 UnlockMutex(&(env_js_lock));
2120 return x;
2121 }
2122
2123 /** js_file_read **/
2124 int
js_file_read(env,fn)2125 js_file_read(env,fn)
2126 struct wnn_env *env;
2127 char *fn;
2128 {register int x;
2129 if(env==0) return(-1);
2130 set_current_js(env->js_id);
2131 LockMutex(&(env_js_lock));
2132 handler_of_jserver_dead_env(env);
2133 if(env_wnn_errorno_eql) {
2134 UnlockMutex(&(env_js_lock));
2135 return(-1);
2136 }
2137 snd_env_head(env,JS_FILE_READ);
2138 putscom(fn, env->js_id);
2139 snd_flush(env->js_id);
2140 x=get4com(env->js_id);
2141 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2142 UnlockMutex(&(env_js_lock));
2143 return x;
2144 }
2145
2146 /** js_file_write **/
2147 int
js_file_write(env,fid,fn)2148 js_file_write(env,fid,fn)
2149 struct wnn_env *env;
2150 int fid;
2151 char *fn;
2152 {register int x;
2153 if(env==0) return(-1);
2154 set_current_js(env->js_id);
2155 LockMutex(&(env_js_lock));
2156 handler_of_jserver_dead_env(env);
2157 if(env_wnn_errorno_eql) {
2158 UnlockMutex(&(env_js_lock));
2159 return(-1);
2160 }
2161 snd_env_head(env,JS_FILE_WRITE);
2162 put4com(fid, env->js_id);
2163 putscom(fn, env->js_id);
2164 snd_flush(env->js_id);
2165 x=get4com(env->js_id);
2166 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2167 UnlockMutex(&(env_js_lock));
2168 return x;
2169 }
2170
2171 /** js_file_receive **/
2172 static int xget1com();
2173 static void xput1com();
2174
2175 int
js_file_receive(env,fid,fn)2176 js_file_receive(env,fid,fn)
2177 struct wnn_env *env;
2178 int fid;
2179 char *fn;
2180 {register int mode, x;
2181 char file_name[1024];
2182 char buf[1024];
2183 FILE *f;
2184 int n;
2185 struct wnn_file_head fh;
2186 int i;
2187 #ifdef WRITE_CHECK
2188 char *tmp = NULL, *backup = NULL, tmp_x;
2189 int tmp_err = 0;
2190 #endif /* WRITE_CHECK */
2191 int is_compressed;
2192
2193 if(env==0) return(-1);
2194 set_current_js(env->js_id);
2195 LockMutex(&(env_js_lock));
2196 handler_of_jserver_dead_env(env);
2197 if(env_wnn_errorno_eql) {
2198 UnlockMutex(&(env_js_lock));
2199 return(-1);
2200 }
2201 snd_env_head(env,JS_FILE_RECEIVE);
2202 put4com(fid, env->js_id);
2203 snd_flush(env->js_id);
2204 /**/
2205 getscom(file_name, env->js_id, sizeof(file_name));
2206 if(fn ==NULL || strcmp(fn,"")==0){
2207 gethostname(buf, 1024);
2208 n = strlen(buf);
2209 buf[n] = C_LOCAL;
2210 buf[n+1] = 0;
2211 if(strncmp(buf, file_name, n + 1) == 0){
2212 fn = file_name + n + 1;
2213 }
2214 }
2215 #ifdef WRITE_CHECK
2216 check_backup(fn, NULL);
2217 #endif /* WRITE_CHECK */
2218 if((f = dic_fopen(fn, "r", &is_compressed)) == NULL){ /* New File */
2219 fh.file_uniq.time = fh.file_uniq.dev = fh.file_uniq.inode = 0;
2220 }else{ /* Old File Exists */
2221 if(input_file_header(f, &fh, NULL) == -1){
2222 env_wnn_errorno_set=WNN_NOT_A_FILE;
2223 dic_fclose(f, is_compressed);
2224 put4com(-1, env->js_id);snd_flush(env->js_id);
2225 UnlockMutex(&(env_js_lock));
2226 return(-1);
2227 }
2228 if( is_compressed ){
2229 env_wnn_errorno_set=NOT_SUPPORTED_OPERATION;
2230 dic_fclose(f, is_compressed);
2231 put4com(-1, env->js_id);snd_flush(env->js_id);
2232 UnlockMutex(&(env_js_lock));
2233 return(-1);
2234 }
2235 dic_fclose(f, is_compressed);
2236 }
2237 put4com(0, env->js_id); /* Ack */
2238 put4com(fh.file_uniq.time, env->js_id);
2239 put4com(fh.file_uniq.dev, env->js_id);
2240 put4com(fh.file_uniq.inode, env->js_id);
2241 for(i=0;i<WNN_HOSTLEN;i++){
2242 put1com(fh.file_uniq.createhost[i], env->js_id);
2243 }
2244
2245 snd_flush(env->js_id);
2246
2247 if((mode=get4com(env->js_id))==-1){ /* check stat */
2248 env_wnn_errorno_set= get4com(env->js_id);
2249 UnlockMutex(&(env_js_lock));
2250 return -1;
2251 }else if(mode==0){
2252 UnlockMutex(&(env_js_lock));
2253 return 0; /* need not saving */
2254 }else if(mode == 1 || mode == 3){ /* mode == 3 means the file is a new one. */
2255 #ifdef WRITE_CHECK
2256 backup = make_backup_file(fn, NULL);
2257 if ((tmp = make_tmp_file(fn, 0, &f, NULL)) == NULL) {
2258 delete_tmp_file(backup);
2259 #else /* WRITE_CHECK */
2260 if((f = fopen(fn, "w+")) == NULL){
2261 #endif /* WRITE_CHECK */
2262 env_wnn_errorno_set=WNN_FILE_WRITE_ERROR;
2263 put4com(-1, env->js_id);snd_flush(env->js_id);
2264 UnlockMutex(&(env_js_lock));
2265 return(-1);
2266 }
2267 }else if(mode == 2){
2268 #ifdef WRITE_CHECK
2269 backup = make_backup_file(fn, NULL);
2270 if ((tmp = make_tmp_file(fn, 1, &f, NULL)) == NULL) {
2271 delete_tmp_file(backup);
2272 #else /* WRITE_CHECK */
2273 if((f = fopen(fn, "r+")) == NULL){ /* New File */
2274 #endif /* WRITE_CHECK */
2275 env_wnn_errorno_set=WNN_FILE_WRITE_ERROR;
2276 put4com(-1, env->js_id);snd_flush(env->js_id);
2277 UnlockMutex(&(env_js_lock));
2278 return(-1);
2279 }
2280 }
2281 put4com(0, env->js_id); snd_flush(env->js_id); /* ACK */
2282 for(;;){
2283 if((x=xget1com(env->js_id))== -1) break; /* EOF */
2284 #ifdef WRITE_CHECK
2285 tmp_x = (char)x;
2286 if (fwrite(&tmp_x, sizeof(char), 1, f) == -1) tmp_err = 1;
2287 #else /* WRITE_CHECK */
2288 fputc(x,f);
2289 #endif /* WRITE_CHECK */
2290 }
2291 fclose(f);
2292 #ifdef WRITE_CHECK
2293 if (tmp_err == 0) {
2294 move_tmp_to_org(tmp, fn, 1);
2295 } else {
2296 delete_tmp_file(tmp);
2297 }
2298 delete_tmp_file(backup);
2299 #endif /* WRITE_CHECK */
2300
2301 x=get4com(env->js_id);
2302 if(x==-1) env_wnn_errorno_set= get4com(env->js_id);
2303 #ifdef WRITE_CHECK
2304 if (tmp_err) {
2305 env_wnn_errorno_set = WNN_FILE_WRITE_ERROR;
2306 UnlockMutex(&(env_js_lock));
2307 return(-1);
2308 }
2309 #endif /* WRITE_CHECK */
2310 UnlockMutex(&(env_js_lock));
2311 return x;
2312 }
2313
2314 static int
xget1com(server)2315 xget1com(server)
2316 ARGS *server;
2317 {register int x;
2318 if((x= get1com(server)) != 0xFF) return x;
2319 if(get1com(server) == 0xFF) return -1; /* EOF */
2320 return 0xFF;
2321 }
2322
2323 /** js_file_send **/
2324 int
js_file_send(env,fn)2325 js_file_send(env,fn)
2326 struct wnn_env *env;
2327 char *fn;
2328 {register int x;
2329 FILE *f;
2330 int n;
2331 char buf[1024],*b;
2332 register int cc,i;
2333 int is_compressed;
2334
2335 if(env==0) return(-1);
2336 set_current_js(env->js_id);
2337 LockMutex(&(env_js_lock));
2338 handler_of_jserver_dead_env(env);
2339 if(env_wnn_errorno_eql) {
2340 UnlockMutex(&(env_js_lock));
2341 return(-1);
2342 }
2343 if(check_local_file(fn, env->js_id) == -1) {
2344 UnlockMutex(&(env_js_lock));
2345 return (-1);
2346 }
2347 snd_env_head(env,JS_FILE_SEND);
2348 x=file_loaded_local(fn, env->js_id);
2349 if(x!= -1){ /* file is already loaded */
2350 if(get4com(env->js_id) == -1) {
2351 env_wnn_errorno_set= get4com(env->js_id);
2352 UnlockMutex(&(env_js_lock));
2353 return(-1);
2354 }
2355 return x;
2356 UnlockMutex(&(env_js_lock));
2357 }
2358
2359 x=get4com(env->js_id);
2360 if(x==-1){
2361 env_wnn_errorno_set= get4com(env->js_id);
2362 UnlockMutex(&(env_js_lock));
2363 return -1;
2364 }
2365
2366 gethostname(buf, 1024);
2367 n = strlen(buf);
2368 buf[n] = C_LOCAL;
2369 strcpy(buf + n + 1,fn);
2370 putscom(buf, env->js_id);
2371
2372 #ifdef WRITE_CHECK
2373 check_backup(fn, NULL);
2374 #endif /* WRITE_CHECK */
2375 if((f=dic_fopen(fn,"r", &is_compressed))== NULL){
2376 xput1com(-1, env->js_id); /* EOF */
2377 UnlockMutex(&(env_js_lock));
2378 return -1;
2379 }
2380
2381 /* send contents of file */
2382 for(;;){
2383 cc = fread(buf,1,1024,f);
2384 if(cc <= 0) break; /* EOF */
2385 for(b=buf,i=0;i<cc;i++){
2386 xput1com((int)*b++ & 0xff, env->js_id);
2387 }
2388 }
2389 dic_fclose(f, is_compressed);
2390 xput1com(-1, env->js_id); /* EOF */
2391 snd_flush(env->js_id);
2392 x=get4com(env->js_id);
2393 if(x==-1) env_wnn_errorno_set= get4com(env->js_id);
2394 UnlockMutex(&(env_js_lock));
2395 return x;
2396 }
2397
2398 static void
xput1com(d,server)2399 xput1com(d, server)
2400 int d;
2401 ARGS *server;
2402 {
2403 if(d == -1){ put1com(0xFF, server); put1com(0xFF, server); return;/* EOF */}
2404 put1com(d, server);
2405 if(d == 0xFF){ put1com(0x00, server);}
2406 }
2407
2408
2409 /*** Dic. Operation for Env. ***/
2410
2411 /** js_dic_add **/
2412 static int
js_dic_add_body(env,fid,hfid,rev,jnice,rw,hrw,pw1,pw2)2413 js_dic_add_body(env,fid,hfid,rev, jnice,rw,hrw, pw1, pw2)
2414 struct wnn_env *env;
2415 int fid,hfid,rev,jnice,rw,hrw;
2416 char *pw1, *pw2;
2417 {register int x;
2418 snd_env_head(env,JS_DIC_ADD);
2419 put4com(fid, env->js_id);
2420 put4com(hfid, env->js_id);
2421 put4com(jnice, env->js_id);
2422 put4com(rw, env->js_id);
2423 put4com(hrw, env->js_id);
2424 putscom(pw1, env->js_id);
2425 putscom(pw2, env->js_id);
2426 put4com(rev, env->js_id); /* rev is to add it as reverse dict */
2427 snd_flush(env->js_id);
2428 x=get4com(env->js_id);
2429 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2430 return x;
2431 }
2432 int
js_dic_add(env,fid,hfid,rev,jnice,rw,hrw,pw1,pw2)2433 js_dic_add(env,fid,hfid,rev, jnice,rw,hrw, pw1, pw2)
2434 struct wnn_env *env;
2435 int fid,hfid,rev,jnice,rw,hrw;
2436 char *pw1, *pw2;
2437 {register int x;
2438 if(env==0) return(-1);
2439 set_current_js(env->js_id);
2440 LockMutex(&(env_js_lock));
2441 handler_of_jserver_dead_env(env);
2442 if(env_wnn_errorno_eql) {
2443 UnlockMutex(&(env_js_lock));
2444 return(-1);
2445 }
2446 x = js_dic_add_body(env,fid,hfid,rev, jnice,rw,hrw, pw1, pw2);
2447 UnlockMutex(&(env_js_lock));
2448 return x;
2449 }
2450
2451 /*:::DOC_START
2452 *
2453 * Function Name: js_fi_dic_add_body
2454 * Description : js_fi_dic_add �Υ��֥롼����ؿ�
2455 * Parameter :
2456 * env : (In) �Ķ��ؤΥݥ���
2457 * fid : (In) �ƣɴط�����ե�����ɣ�
2458 * hfid : (In) �ƣɴط����٥ե�����ɣ�
2459 * suflag : (In) �����ƥ༭����桼������
2460 * rw : (In) ��������ǽ����Բ�ǽ
2461 * hrw : (In) ���ٹ�������ǽ����Բ�ǽ
2462 * pw1 : (In) �ƣɴط�����ե�����Υѥ����
2463 * pw2 : (In) �ƣɴط����٥ե�����Υѥ����
2464 *
2465 * Return value : -1==ERROR, else ��Ͽ�����ֹ�
2466 *
2467 * Author : Hideyuki Kishiba
2468 *
2469 * Revision history:
2470 *
2471 *:::DOC_END
2472 */
2473 static int
js_fi_dic_add_body(env,fid,hfid,suflag,rw,hrw,pw1,pw2)2474 js_fi_dic_add_body(env, fid, hfid, suflag, rw, hrw, pw1, pw2)
2475 struct wnn_env *env;
2476 int fid,hfid,suflag,rw,hrw;
2477 char *pw1, *pw2;
2478 {register int x;
2479 snd_env_head(env,JS_FI_DIC_ADD);
2480 put4com(fid, env->js_id);
2481 put4com(hfid, env->js_id);
2482 put4com(suflag, env->js_id);
2483 put4com(rw, env->js_id);
2484 put4com(hrw, env->js_id);
2485 putscom(pw1, env->js_id);
2486 putscom(pw2, env->js_id);
2487 snd_flush(env->js_id);
2488 x=get4com(env->js_id);
2489 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2490 return x;
2491 } /* End of js_fi_dic_add_body */
2492
2493 /*:::DOC_START
2494 *
2495 * Function Name: js_fi_dic_add
2496 * Description : �Ķ��ˣƣɼ�����ɲä���
2497 * Parameter :
2498 * env : (In) �Ķ��ؤΥݥ���
2499 * fid : (In) �ƣɴط�����ե�����ɣ�
2500 * hfid : (In) �ƣɴط����٥ե�����ɣ�
2501 * suflag : (In) �����ƥ༭����桼������
2502 * rw : (In) ��������ǽ����Բ�ǽ
2503 * hrw : (In) ���ٹ�������ǽ����Բ�ǽ
2504 * pw1 : (In) �ƣɴط�����ե�����Υѥ����
2505 * pw2 : (In) �ƣɴط����٥ե�����Υѥ����
2506 *
2507 * Return value : -1==ERROR, else ��Ͽ�����ֹ�
2508 *
2509 * Author : Hideyuki Kishiba
2510 *
2511 * Revision history:
2512 *
2513 *:::DOC_END
2514 */
2515 int
js_fi_dic_add(env,fid,hfid,suflag,rw,hrw,pw1,pw2)2516 js_fi_dic_add(env, fid, hfid, suflag, rw, hrw, pw1, pw2)
2517 struct wnn_env *env;
2518 int fid,hfid,suflag,rw,hrw;
2519 char *pw1, *pw2;
2520 {register int x;
2521 if(env==0) return(-1);
2522 set_current_js(env->js_id);
2523 LockMutex(&(env_js_lock));
2524 handler_of_jserver_dead_env(env);
2525 if(env_wnn_errorno_eql) {
2526 UnlockMutex(&(env_js_lock));
2527 return(-1);
2528 }
2529 /* call sub routine function */
2530 x = js_fi_dic_add_body(env, fid, hfid, suflag, rw, hrw, pw1, pw2);
2531 UnlockMutex(&(env_js_lock));
2532 return x;
2533 } /* End of js_fi_dic_add */
2534
2535 /** js_dic_delete **/
2536 int
js_dic_delete(env,dicno)2537 js_dic_delete(env,dicno)
2538 struct wnn_env *env;
2539 int dicno;
2540 {register int x;
2541 if(env==0) return(-1);
2542 set_current_js(env->js_id);
2543 LockMutex(&(env_js_lock));
2544 handler_of_jserver_dead_env(env);
2545 if(env_wnn_errorno_eql) {
2546 UnlockMutex(&(env_js_lock));
2547 return(-1);
2548 }
2549 snd_env_head(env,JS_DIC_DELETE);
2550 put4com(dicno, env->js_id);
2551 snd_flush(env->js_id);
2552 x=get4com(env->js_id);
2553 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2554 UnlockMutex(&(env_js_lock));
2555 return x;
2556 }
2557
2558 /** js_dic_use **/
2559 int
js_dic_use(env,dic_no,flag)2560 js_dic_use(env,dic_no,flag)
2561 struct wnn_env *env;
2562 int dic_no,flag;
2563 {register int x;
2564 if(env==0) return(-1);
2565 set_current_js(env->js_id);
2566 LockMutex(&(env_js_lock));
2567 handler_of_jserver_dead_env(env);
2568 if(env_wnn_errorno_eql) {
2569 UnlockMutex(&(env_js_lock));
2570 return(-1);
2571 }
2572 snd_env_head(env,JS_DIC_USE);
2573 put4com(dic_no, env->js_id);
2574 put4com(flag, env->js_id);
2575 snd_flush(env->js_id);
2576 x=get4com(env->js_id);
2577 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2578 UnlockMutex(&(env_js_lock));
2579 return x;
2580 }
2581
2582 /** js_fuzokugo_set **/
2583 int
js_fuzokugo_set(env,fid)2584 js_fuzokugo_set(env,fid)
2585 struct wnn_env *env;
2586 int fid;
2587 {register int x;
2588 if(env==0) return(-1);
2589 set_current_js(env->js_id);
2590 LockMutex(&(env_js_lock));
2591 handler_of_jserver_dead_env(env);
2592 if(env_wnn_errorno_eql) {
2593 UnlockMutex(&(env_js_lock));
2594 return(-1);
2595 }
2596 snd_env_head(env,JS_FUZOKUGO_SET);
2597 put4com(fid, env->js_id);
2598 snd_flush(env->js_id);
2599 x=get4com(env->js_id);
2600 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2601 UnlockMutex(&(env_js_lock));
2602 return x;
2603 }
2604
2605 /** js_fuzokugo_get **/
2606 int
js_fuzokugo_get(env)2607 js_fuzokugo_get(env)
2608 struct wnn_env *env;
2609 {register int x;
2610 if(env==0) return(-1);
2611 set_current_js(env->js_id);
2612 LockMutex(&(env_js_lock));
2613 handler_of_jserver_dead_env(env);
2614 if(env_wnn_errorno_eql) {
2615 UnlockMutex(&(env_js_lock));
2616 return(-1);
2617 }
2618 snd_env_head(env,JS_FUZOKUGO_GET);
2619 snd_flush(env->js_id);
2620 x=get4com(env->js_id);
2621 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
2622 UnlockMutex(&(env_js_lock));
2623 return x;
2624 }
2625
2626 static int rcv_dic_list();
2627 static void get_dic_info();
2628
2629 /*:::DOC_START
2630 *
2631 * Function Name: js_dic_list_all
2632 * Description : ���ꤵ�줿�����Ф����Ķ�����Ͽ����Ƥ���ף����
2633 * ������֤�
2634 * Parameter :
2635 * server : (In) �����ФؤΥݥ���
2636 * ret : (Out) �ǡ�����������ѹ�¤�ΤؤΥݥ���
2637 *
2638 * Return value : -1==ERROR, else ��Ͽ�����
2639 *
2640 * Author : Hideyuki Kishiba
2641 *
2642 * Revision history:
2643 *
2644 *:::DOC_END
2645 */
2646 int
js_dic_list_all(server,ret)2647 js_dic_list_all(server,ret)
2648 WNN_JSERVER_ID *server;
2649 struct wnn_ret_buf *ret;
2650 {
2651 int x;
2652
2653 set_current_js(server);
2654 LockMutex(&(server_js_lock));
2655 handler_of_jserver_dead(server);
2656 if(js_wnn_errorno_eql) {
2657 UnlockMutex(&(server_js_lock));
2658 return(-1);
2659 }
2660 snd_server_head(server,JS_DIC_LIST_ALL);
2661 snd_flush(server);
2662 x = rcv_dic_list(ret, server);
2663 UnlockMutex(&(server_js_lock));
2664 return x;
2665 } /* End of js_dic_list_all */
2666
2667 /*:::DOC_START
2668 *
2669 * Function Name: js_dic_list
2670 * Description : ���ꤵ�줿�Ķ�����Ͽ����Ƥ���ף���ξ�����֤�
2671 * Parameter :
2672 * env : (In) �Ķ��ؤΥݥ���
2673 * ret : (Out) �ǡ�����������ѹ�¤�ΤؤΥݥ���
2674 *
2675 * Return value : -1==ERROR, else ��Ͽ�����
2676 *
2677 * Author : Hideyuki Kishiba
2678 *
2679 * Revision history:
2680 *
2681 *:::DOC_END
2682 */
2683 int
js_dic_list(env,ret)2684 js_dic_list(env,ret)
2685 struct wnn_env *env;
2686 struct wnn_ret_buf *ret;
2687 {
2688 int x;
2689
2690 if(env==0) return(-1);
2691 set_current_js(env->js_id);
2692 LockMutex(&(env_js_lock));
2693 handler_of_jserver_dead_env(env);
2694 if(env_wnn_errorno_eql) {
2695 UnlockMutex(&(env_js_lock));
2696 return(-1);
2697 }
2698 snd_env_head(env,JS_DIC_LIST);
2699 snd_flush(env->js_id);
2700 x = rcv_dic_list(ret, env->js_id);
2701 UnlockMutex(&(env_js_lock));
2702 return x;
2703 } /* End of js_dic_list */
2704
2705 /*:::DOC_START
2706 *
2707 * Function Name: js_fi_dic_list_all
2708 * Description : ���ꤵ�줿�����Ф����Ķ�����Ͽ����Ƥ��뼭����⡢
2709 * ���ꤵ�줿���ξ�����֤�
2710 * Parameter :
2711 * server : (In) �����ФؤΥݥ���
2712 * dmask : (In) ��������ޥ���
2713 * ret : (Out) �ǡ�����������ѹ�¤�ΤؤΥݥ���
2714 *
2715 * Return value : -1==ERROR, else ��Ͽ�����
2716 *
2717 * Author : Hideyuki Kishiba
2718 *
2719 * Revision history:
2720 *
2721 *:::DOC_END
2722 */
2723 int
js_fi_dic_list_all(server,dmask,ret)2724 js_fi_dic_list_all(server, dmask, ret)
2725 WNN_JSERVER_ID *server;
2726 unsigned long dmask;
2727 struct wnn_ret_buf *ret;
2728 {
2729 int x;
2730
2731 set_current_js(server);
2732
2733 /* �����Ф� FI-Wnn ������ΥС������ʤ顢����� dic_list ̿������� */
2734 if(!CHECK_FI) return(js_dic_list_all(server, ret));
2735
2736 LockMutex(&(server_js_lock));
2737 handler_of_jserver_dead(server);
2738 if(js_wnn_errorno_eql) {
2739 UnlockMutex(&(server_js_lock));
2740 return(-1);
2741 }
2742 snd_server_head(server,JS_FI_DIC_LIST_ALL);
2743 put4com(dmask, server);
2744 snd_flush(server);
2745 x = rcv_dic_list(ret, server);
2746 UnlockMutex(&(server_js_lock));
2747 return x;
2748 } /* End of js_fi_dic_list_all */
2749
2750 /*:::DOC_START
2751 *
2752 * Function Name: js_fi_dic_list
2753 * Description : ���ꤵ�줿�Ķ�����Ͽ����Ƥ��뼭����⡢
2754 * ���ꤵ�줿���ξ�����֤�
2755 * Parameter :
2756 * env : (In) �Ķ��ؤΥݥ���
2757 * dmask : (In) ��������ޥ���
2758 * ret : (Out) �ǡ�����������ѹ�¤�ΤؤΥݥ���
2759 *
2760 * Return value : -1==ERROR, else ��Ͽ�����
2761 *
2762 * Author : Hideyuki Kishiba
2763 *
2764 * Revision history:
2765 *
2766 *:::DOC_END
2767 */
2768 int
js_fi_dic_list(env,dmask,ret)2769 js_fi_dic_list(env, dmask, ret)
2770 struct wnn_env *env;
2771 unsigned long dmask;
2772 struct wnn_ret_buf *ret;
2773 {
2774 int x;
2775
2776 if(env==0) return(-1);
2777 set_current_js(env->js_id);
2778
2779 /* �����Ф� FI-Wnn ������ΥС������ʤ顢����� dic_list ̿������� */
2780 if(!CHECK_FI) return(js_dic_list(env, ret));
2781
2782 LockMutex(&(env_js_lock));
2783 handler_of_jserver_dead_env(env);
2784 if(env_wnn_errorno_eql) {
2785 UnlockMutex(&(env_js_lock));
2786 return(-1);
2787 }
2788 snd_env_head(env,JS_FI_DIC_LIST);
2789 put4com(dmask, env->js_id);
2790 snd_flush(env->js_id);
2791 x = rcv_dic_list(ret, env->js_id);
2792 UnlockMutex(&(env_js_lock));
2793 return x;
2794 } /* End of js_fi_dic_list */
2795
2796 /*:::DOC_START
2797 *
2798 * Function Name: rcv_dic_list
2799 * Description : ��������������ѹ�¤�Τ��ΰ����ݤ���
2800 * Parameter :
2801 * ret : (Out) �ǡ�����������ѹ�¤�ΤؤΥݥ���
2802 * server : (In) �����ФؤΥݥ���
2803 *
2804 * Return value : -1==ERROR, else ��Ͽ�����
2805 *
2806 * Author : Hideyuki Kishiba
2807 *
2808 * Revision history:
2809 *
2810 *:::DOC_END
2811 */
2812 static int
rcv_dic_list(ret,server)2813 rcv_dic_list(ret, server)
2814 struct wnn_ret_buf *ret;
2815 ARGS *server;
2816 {register int i,count;
2817 register WNN_DIC_INFO *dic;
2818 if((count=get4com(server)) == -1) {
2819 js_wnn_errorno_set = get4com(server);
2820 return(-1);
2821 }
2822 re_alloc(ret, sizeof(WNN_DIC_INFO)*(count + 1));
2823
2824 dic=(WNN_DIC_INFO *)ret->buf;
2825 for(i=0;i<count;i++){
2826 get_dic_info(dic, server);
2827 dic++;
2828 }
2829 dic->dic_no = -1;
2830 return count;
2831 } /* End of rcv_dic_list */
2832
2833 /*:::DOC_START
2834 *
2835 * Function Name: get_dic_info
2836 * Description : ������������������
2837 * Parameter :
2838 * dic : (Out) ��������������ѹ�¤�ΤؤΥݥ���
2839 * server : (In) �����ФؤΥݥ���
2840 *
2841 * Return value : -1==ERROR, else ��Ͽ�����
2842 *
2843 * Author : Hideyuki Kishiba
2844 *
2845 * Revision history:
2846 *
2847 *:::DOC_END
2848 */
2849 static void
get_dic_info(dic,server)2850 get_dic_info(dic, server)
2851 register WNN_DIC_INFO *dic;
2852 ARGS *server;
2853 {
2854 dic->dic_no =get4com(server); /* dic_No */
2855 dic->body =get4com(server); /* body fid */
2856 dic->hindo =get4com(server); /* hindo fid */
2857 dic->rw =get4com(server); /* r/w */
2858 dic->hindo_rw =get4com(server); /* hindo r/w */
2859 dic->enablef =get4com(server); /* enable/disable */
2860 dic->nice =get4com(server); /* nice */
2861 dic->rev = get4com(server);
2862 /* added H.T */
2863 getwscom(dic->comment, server, WNN_COMMENT_LEN);
2864 getscom(dic->fname, server, WNN_F_NAMELEN);
2865 getscom(dic->hfname, server, WNN_F_NAMELEN);
2866 getscom(dic->passwd, server, WNN_PASSWD_LEN);
2867 getscom(dic->hpasswd, server, WNN_PASSWD_LEN);
2868 dic->type = get4com(server);
2869 dic->gosuu = get4com(server);
2870 dic->localf = get4com(server);
2871 dic->hlocalf = get4com(server);
2872 } /* End of get_dic_info */
2873
2874 /*:::DOC_START
2875 *
2876 * Function Name: rcv_fzk_list
2877 * Description : ��°������������ѹ�¤�Τ��ΰ����ݤ���
2878 * ������������������
2879 * Parameter :
2880 * curfzk : (Out) �����ѥե����뼱�̻�
2881 * ret : (Out) ��°������������ѹ�¤�ΤؤΥݥ���
2882 * server : (In) �����ФؤΥݥ���
2883 *
2884 * Return value : -1==ERROR, else �ɹ�����°���
2885 *
2886 * Author : Hideyuki Kishiba
2887 *
2888 * Revision history:
2889 *
2890 *:::DOC_END
2891 */
2892 static int
rcv_fzk_list(curfzk,ret,server)2893 rcv_fzk_list(curfzk, ret, server)
2894 int *curfzk;
2895 WNN_FZK_INFO **ret;
2896 ARGS *server;
2897 {
2898 register int i, count;
2899 register WNN_FZK_INFO *fzk;
2900
2901 /* �ɹ�����°����������ѥե����뼱�̻Ҥ������� */
2902 if((count = get4com(server)) == -1) {
2903 js_wnn_errorno_set = get4com(server);
2904 return(-1);
2905 }
2906 *curfzk = get4com(server);
2907
2908 /* �����������ѹ�¤�Τ��ΰ����ݤ��� */
2909 if(((*ret) = (WNN_FZK_INFO *)malloc((count + 1) *
2910 sizeof(WNN_FZK_INFO))) == NULL) {
2911 WNN_FZK_INFO dummy;
2912 for(i = 0; i < count; i++){
2913 getwscom(dummy.comment, server, WNN_COMMENT_LEN);
2914 getscom(dummy.fname, server, WNN_F_NAMELEN);
2915 }
2916 js_wnn_errorno_set = WNN_ALLOC_FAIL;
2917 return(-1);
2918 }
2919 fzk = (WNN_FZK_INFO *)*ret;
2920
2921 /* ��°������������ */
2922 for(i = 0; i < count; i++){
2923 getwscom(fzk->comment, server, WNN_COMMENT_LEN);
2924 getscom(fzk->fname, server, WNN_F_NAMELEN);
2925 fzk++;
2926 }
2927
2928 fzk->fname[0] = 0;
2929 return count;
2930 } /* End of rcv_fzk_list */
2931
2932 /*:::DOC_START
2933 *
2934 * Function Name: js_fuzokugo_list
2935 * Description : ���ꤵ�줿�����Ф��ɤ߹��ޤ�Ƥ�������°������
2936 * �Ķ��˸������ꤵ��Ƥ������μ��̻Ҥ��֤�
2937 * Parameter :
2938 * env : (In) �Ķ��ؤΥݥ���
2939 * curfzk : (Out) �����ѥե����뼱�̻�
2940 * ret : (Out) ��°������������ѹ�¤�ΤؤΥݥ���
2941 *
2942 * Return value : -1==ERROR, else �ɹ�����°���
2943 *
2944 * Author : Hideyuki Kishiba
2945 *
2946 * Revision history:
2947 *
2948 *:::DOC_END
2949 */
2950 int
js_fuzokugo_list(env,curfzk,ret)2951 js_fuzokugo_list(env, curfzk, ret)
2952 struct wnn_env *env;
2953 int *curfzk;
2954 WNN_FZK_INFO **ret;
2955 {
2956 register int x;
2957
2958 if(env==0) return(-1);
2959 set_current_js(env->js_id);
2960 LockMutex(&(env_js_lock));
2961 handler_of_jserver_dead_env(env);
2962 if(env_wnn_errorno_eql) {
2963 UnlockMutex(&(env_js_lock));
2964 return(-1);
2965 }
2966 snd_env_head(env,JS_FUZOKUGO_LIST);
2967 snd_flush(env->js_id);
2968 x = rcv_fzk_list(curfzk, ret, env->js_id);
2969 UnlockMutex(&(env_js_lock));
2970 return x;
2971 } /* End of js_fuzokugo_list */
2972
2973 /*** Dic. Operation by dic_No. ***/
2974
2975 /** js_word_add **/
2976 int
js_word_add(env,dic_no,yomi,kanji,comment,hinshi,init_hindo)2977 js_word_add(env,dic_no,yomi,kanji,comment,hinshi,init_hindo)
2978 struct wnn_env *env;
2979 int dic_no;
2980 w_char *yomi,*kanji,*comment;
2981 int hinshi,init_hindo;
2982 {register int x;
2983 if(env==0) return(-1);
2984 set_current_js(env->js_id);
2985 LockMutex(&(env_js_lock));
2986 handler_of_jserver_dead_env(env);
2987 if(env_wnn_errorno_eql) {
2988 UnlockMutex(&(env_js_lock));
2989 return(-1);
2990 }
2991 snd_env_head(env,JS_WORD_ADD);
2992 put4com(dic_no, env->js_id);
2993 putwscom(yomi, env->js_id);
2994 putwscom(kanji, env->js_id);
2995 putwscom(comment, env->js_id);
2996 put4com(hinshi, env->js_id);
2997 put4com(init_hindo, env->js_id);
2998 snd_flush(env->js_id);
2999 x=get4com(env->js_id);
3000 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
3001 UnlockMutex(&(env_js_lock));
3002 return x;
3003 }
3004
3005 /** js_word_delete **/
3006 int
js_word_delete(env,dic_no,entry)3007 js_word_delete(env,dic_no,entry)
3008 struct wnn_env *env;
3009 int dic_no;
3010 int entry;
3011 {register int x;
3012 if(env==0) return(-1);
3013 set_current_js(env->js_id);
3014 LockMutex(&(env_js_lock));
3015 handler_of_jserver_dead_env(env);
3016 if(env_wnn_errorno_eql) {
3017 UnlockMutex(&(env_js_lock));
3018 return(-1);
3019 }
3020 snd_env_head(env,JS_WORD_DELETE);
3021 put4com(dic_no, env->js_id);
3022 put4com(entry, env->js_id);
3023 snd_flush(env->js_id);
3024 x=get4com(env->js_id);
3025 if(x==-1)env_wnn_errorno_set= get4com(env->js_id);
3026 UnlockMutex(&(env_js_lock));
3027 return x;
3028 }
3029
3030
3031 /** js_word_search **/
3032 static int rcv_word_data();
3033
3034 int
js_word_search(env,dic_no,yomi,ret)3035 js_word_search(env,dic_no,yomi,ret)
3036 struct wnn_env *env;
3037 int dic_no;
3038 w_char *yomi;
3039 struct wnn_ret_buf *ret;
3040 {
3041 int x;
3042
3043 if(env==0) return(-1);
3044 set_current_js(env->js_id);
3045 LockMutex(&(env_js_lock));
3046 handler_of_jserver_dead_env(env);
3047 if(env_wnn_errorno_eql) {
3048 UnlockMutex(&(env_js_lock));
3049 return(-1);
3050 }
3051 snd_env_head(env,JS_WORD_SEARCH);
3052 put4com(dic_no, env->js_id);
3053 putwscom(yomi, env->js_id);
3054 snd_flush(env->js_id);
3055 x = rcv_word_data(ret, yomi, env->js_id);
3056 UnlockMutex(&(env_js_lock));
3057 return x;
3058 }
3059
3060 /** js_word_search_by_env **/
3061 int
js_word_search_by_env(env,yomi,ret)3062 js_word_search_by_env(env,yomi,ret)
3063 struct wnn_env *env;
3064 w_char *yomi;
3065 struct wnn_ret_buf *ret;
3066 {
3067 int x;
3068
3069 if(env==0) return(-1);
3070 set_current_js(env->js_id);
3071 LockMutex(&(env_js_lock));
3072 handler_of_jserver_dead_env(env);
3073 if(env_wnn_errorno_eql) {
3074 UnlockMutex(&(env_js_lock));
3075 return(-1);
3076 }
3077 snd_env_head(env,JS_WORD_SEARCH_BY_ENV);
3078 putwscom(yomi, env->js_id);
3079 snd_flush(env->js_id);
3080 x = rcv_word_data(ret, yomi, env->js_id);
3081 UnlockMutex(&(env_js_lock));
3082 return x;
3083 }
3084
3085 /** js_word_info **/
3086 int
js_word_info(env,dic_no,entry,ret)3087 js_word_info(env,dic_no,entry,ret)
3088 struct wnn_env *env;
3089 int dic_no,entry;
3090 struct wnn_ret_buf *ret;
3091 {register int x;
3092 w_char yomi[LENGTHYOMI];
3093
3094 if(env==0) return(-1);
3095 set_current_js(env->js_id);
3096 LockMutex(&(env_js_lock));
3097 handler_of_jserver_dead_env(env);
3098 if(env_wnn_errorno_eql) {
3099 UnlockMutex(&(env_js_lock));
3100 return(-1);
3101 }
3102 snd_env_head(env,JS_WORD_INFO);
3103 put4com(dic_no, env->js_id);
3104 put4com(entry, env->js_id);
3105 snd_flush(env->js_id);
3106 x=get4com(env->js_id);
3107 if(x==-1){
3108 env_wnn_errorno_set= get4com(env->js_id);
3109 UnlockMutex(&(env_js_lock));
3110 return(-1);
3111 }
3112 getwscom(yomi, env->js_id, sizeof(yomi) / sizeof(w_char));
3113 rcv_word_data(ret, yomi, env->js_id);
3114 UnlockMutex(&(env_js_lock));
3115 return(0);
3116 }
3117
3118 int
js_word_comment_set(env,dic_no,entry,comment)3119 js_word_comment_set(env, dic_no, entry, comment)
3120 struct wnn_env *env;
3121 int dic_no,entry;
3122 w_char *comment;
3123 {
3124 register int x;
3125 if(env==0) return(-1);
3126 set_current_js(env->js_id);
3127 LockMutex(&(env_js_lock));
3128 handler_of_jserver_dead_env(env);
3129 if(env_wnn_errorno_eql) {
3130 UnlockMutex(&(env_js_lock));
3131 return(-1);
3132 }
3133 snd_env_head(env,JS_WORD_COMMENT_SET);
3134 put4com(dic_no, env->js_id);
3135 put4com(entry, env->js_id);
3136 putwscom(comment, env->js_id);
3137 snd_flush(env->js_id);
3138 x=get4com(env->js_id);
3139 if(x==-1){
3140 env_wnn_errorno_set= get4com(env->js_id);
3141 UnlockMutex(&(env_js_lock));
3142 return(-1);
3143 }
3144 UnlockMutex(&(env_js_lock));
3145 return(0);
3146 }
3147
3148 /** rcv for word_search **/
3149 static int
rcv_word_data(ret,yomi,server)3150 rcv_word_data(ret, yomi, server)
3151 struct wnn_ret_buf *ret;
3152 w_char *yomi; /* Yomi is not sent from server
3153 * (at least for the time being).
3154 */
3155 ARGS *server;
3156 {register int x, j_c,k_c, databytes, wlen;
3157 w_char *k;
3158 w_char wbuf[LENGTHKANJI];
3159 register struct wnn_jdata *jd;
3160 register int cnt, error_flag;
3161
3162 j_c = get4com(server);
3163 k_c = get4com(server);
3164 databytes = sizeof(w_char)*(k_c + j_c * 3 + j_c * wnn_Strlen(yomi));
3165 re_alloc(ret, sizeof(struct wnn_jdata)*(j_c + 1) + databytes);
3166 jd=(struct wnn_jdata *)ret->buf;
3167 for(cnt = 0;;cnt++){
3168 jd->dic_no = x = get4com(server);
3169 if(x==-1) break;
3170 jd->serial = get4com(server);
3171 jd->hinshi = get4com(server);
3172 jd->hindo = get4com(server); jd->ima = get4com(server);
3173 jd->int_hindo = get4com(server); jd->int_ima = get4com(server);
3174 jd++;
3175 }
3176 jd++;
3177 k= (w_char *)jd;
3178 jd=(struct wnn_jdata *)ret->buf;
3179 error_flag = 0;
3180 for(;;){
3181 if(jd->dic_no==-1) break;
3182
3183 if (!error_flag) {
3184 wlen = wnn_Strlen(yomi) + 1;
3185 if ((wlen * sizeof(w_char)) > databytes) {
3186 error_flag = 1;
3187 } else {
3188 jd->yomi = k; /* Copy Yomi */
3189 wnn_Strcpy(k, yomi);
3190 k+= wlen;
3191 databytes -= (wlen * sizeof(w_char));
3192 }
3193 }
3194
3195 getwscom(wbuf, server, sizeof(wbuf) / sizeof(w_char));
3196 if (!error_flag) {
3197 wlen = wnn_Strlen(wbuf) + 1;
3198 if ((wlen * sizeof(w_char)) > databytes) {
3199 error_flag = 1;
3200 } else {
3201 jd->kanji = k; /* Get Kanji */
3202 wnn_Strcpy(k, wbuf);
3203 k+= wlen;
3204 databytes -= (wlen * sizeof(w_char));
3205 }
3206 }
3207
3208 getwscom(wbuf, server, sizeof(wbuf) / sizeof(w_char));
3209 if (!error_flag) {
3210 wlen = wnn_Strlen(wbuf) + 1;
3211 if ((wlen * sizeof(w_char)) > databytes) {
3212 error_flag = 1;
3213 } else {
3214 jd->com = k; /* Get Comment */
3215 wnn_Strcpy(k, wbuf);
3216 k+= wlen;
3217 databytes -= (wlen * sizeof(w_char));
3218 }
3219 }
3220 jd++;
3221 }
3222 return cnt;
3223 }
3224
3225
3226 /** js_dic_info **/
3227 int
js_dic_info(env,dic_no,ret)3228 js_dic_info(env,dic_no,ret)
3229 struct wnn_env *env;
3230 int dic_no;
3231 register WNN_DIC_INFO *ret;
3232 {register int x;
3233 if(env==0) return(-1);
3234 set_current_js(env->js_id);
3235 LockMutex(&(env_js_lock));
3236 handler_of_jserver_dead_env(env);
3237 if(env_wnn_errorno_eql) {
3238 UnlockMutex(&(env_js_lock));
3239 return(-1);
3240 }
3241 snd_env_head(env,JS_DIC_INFO);
3242 put4com(dic_no, env->js_id);
3243 snd_flush(env->js_id);
3244 x=get4com(env->js_id);
3245 if(x==-1){
3246 env_wnn_errorno_set = get4com(env->js_id);
3247 UnlockMutex(&(env_js_lock));
3248 return x;
3249 }
3250 get_dic_info(ret, env->js_id);
3251 UnlockMutex(&(env_js_lock));
3252 return dic_no;
3253 }
3254
3255 /** js_who **/
3256 int
js_who(server,ret)3257 js_who(server,ret)
3258 WNN_JSERVER_ID *server;
3259 struct wnn_ret_buf *ret;
3260 {register int i,j,c;
3261 WNN_JWHO *w;
3262 set_current_js(server);
3263 LockMutex(&(server_js_lock));
3264 handler_of_jserver_dead(server);
3265 if(js_wnn_errorno_eql) {
3266 UnlockMutex(&(server_js_lock));
3267 return(-1);
3268 }
3269 snd_server_head(server,JS_WHO);
3270 snd_flush(server);
3271
3272 c=get4com(server);
3273 if(c==-1){
3274 js_wnn_errorno_set= get4com(server);
3275 UnlockMutex(&(server_js_lock));
3276 return -1;
3277 }
3278
3279 re_alloc(ret, sizeof(WNN_JWHO)*c);
3280 w=(WNN_JWHO *)ret->buf;
3281 for(i=0;i<c;i++){
3282 w->sd=get4com(server);
3283 getscom(w->user_name, server, sizeof(w->user_name));
3284 getscom(w->host_name, server, sizeof(w->host_name));
3285 for(j=0;j<WNN_MAX_ENV_OF_A_CLIENT;j++){
3286 (w->env)[j]=get4com(server);
3287 }
3288 w++;
3289 }
3290 UnlockMutex(&(server_js_lock));
3291 return(c);
3292 }
3293
3294 /** jserver ������ƤδĶ��˴ؤ����������롣
3295 (���鵻)
3296 **/
3297 int
js_env_list(server,ret)3298 js_env_list(server,ret)
3299 WNN_JSERVER_ID *server;
3300 struct wnn_ret_buf *ret;
3301 {register int i,j,c;
3302 WNN_ENV_INFO *w;
3303 set_current_js(server);
3304 LockMutex(&(server_js_lock));
3305 handler_of_jserver_dead(server);
3306 if(js_wnn_errorno_eql) {
3307 UnlockMutex(&(server_js_lock));
3308 return(-1);
3309 }
3310 snd_server_head(server,JS_ENV_LIST);
3311 snd_flush(server);
3312
3313 c=get4com(server);
3314 if(c==-1){
3315 js_wnn_errorno_set= get4com(server);
3316 UnlockMutex(&(server_js_lock));
3317 return -1;
3318 }
3319
3320 re_alloc(ret, sizeof(WNN_ENV_INFO)*c);
3321 w=(WNN_ENV_INFO *)ret->buf;
3322 for(i=0;i<c;i++){
3323 w->env_id = get4com(server);
3324 getscom(w->env_name, server, WNN_ENVNAME_LEN);
3325 w->ref_count=get4com(server);
3326 w->fzk_fid=get4com(server);
3327 w->jishomax=get4com(server);
3328 for(j=0;j<WNN_MAX_JISHO_OF_AN_ENV;j++){
3329 (w->jisho)[j]= get4com(server);
3330 }
3331 for(j=0;j<WNN_MAX_FILE_OF_AN_ENV;j++){
3332 (w->file)[j]= get4com(server);
3333 }
3334 w++;
3335 }
3336 UnlockMutex(&(server_js_lock));
3337 return(c);
3338 }
3339
3340 /****
3341
3342 ****/
3343 /*:::DOC_START
3344 *
3345 * Function Name: js_hindo_set
3346 * Description : ���ꤵ�줿����κ��ӥåȡ����٤����ꤹ��
3347 * Parameter :
3348 * env : (In) �Ķ��ؤΥݥ���
3349 * dic : (In) ���䤬��Ͽ����Ƥ��뼭���ֹ�
3350 * entry : (In) ����Υ���ȥ��ֹ�
3351 * ima : (In) ���ӥåȤ�������ˡ�ե饰
3352 * hindo : (In) ���٤�������ˡ�ե饰
3353 *
3354 * Return value : 0==SUCCESS, -1==ERROR
3355 *
3356 * Author : Hideyuki Kishiba
3357 *
3358 * Revision history:
3359 *
3360 *:::DOC_END
3361 */
3362 int
js_hindo_set(env,dic,entry,ima,hindo)3363 js_hindo_set(env,dic,entry,ima,hindo)
3364 struct wnn_env *env;
3365 int dic, entry, ima,hindo;
3366 {register int x;
3367 if(env==0) return(-1);
3368 set_current_js(env->js_id);
3369 LockMutex(&(env_js_lock));
3370 handler_of_jserver_dead_env(env);
3371 if(env_wnn_errorno_eql) {
3372 UnlockMutex(&(env_js_lock));
3373 return(-1);
3374 }
3375 snd_env_head(env,JS_HINDO_SET);
3376
3377 put4com(dic, env->js_id);
3378 put4com(entry, env->js_id);
3379 put4com(ima, env->js_id);
3380 put4com(hindo, env->js_id);
3381 snd_flush(env->js_id);
3382 if((x=get4com(env->js_id))==-1){
3383 env_wnn_errorno_set= get4com(env->js_id);
3384 UnlockMutex(&(env_js_lock)); return -1;
3385 }
3386 UnlockMutex(&(env_js_lock));
3387 return x;
3388 } /* End of js_hindo_set */
3389
3390 /*:::DOC_START
3391 *
3392 * Function Name: js_set_fi_priority
3393 * Description : ����ƣɴط��ǡ����Σƣɴط���³���ӥåȤ�
3394 * �ƣɴط���³���٤����ꤹ��
3395 * Parameter :
3396 * env : (In) �Ķ��ؤΥݥ���
3397 * fi_rel_entry : (In) ���ѣƣɴط������ѹ�¤�ΤؤΥݥ���
3398 *
3399 * Return value : 0==SUCCESS, -1==ERROR
3400 *
3401 * Author : Hideyuki Kishiba
3402 *
3403 * Revision history:
3404 *
3405 *:::DOC_END
3406 */
3407 int
js_set_fi_priority(env,fi_rel_entry)3408 js_set_fi_priority(env, fi_rel_entry)
3409 struct wnn_env *env;
3410 struct wnn_fi_rel_buf *fi_rel_entry;
3411 {
3412 register int x;
3413
3414 if(env==0) return(-1);
3415 set_current_js(env->js_id);
3416
3417 /* �����Ф��ƣɳؽ��ݡ��Ȥ��Ƥ��ʤ����ϲ��⤷�ʤ� */
3418 if(!CHECK_FI) return(0);
3419
3420 LockMutex(&(env_js_lock));
3421 handler_of_jserver_dead_env(env);
3422 if(env_wnn_errorno_eql) {
3423 UnlockMutex(&(env_js_lock));
3424 return(-1);
3425 }
3426 snd_env_head(env,JS_SET_FI_PRIORITY);
3427
3428 put4com(fi_rel_entry->num, env->js_id);
3429 for(x = 0; x < fi_rel_entry->num; x++) {
3430 put4com(fi_rel_entry->fi_buf[x].fi_dic_no, env->js_id);
3431 put4com(fi_rel_entry->fi_buf[x].dic_no, env->js_id);
3432 put4com(fi_rel_entry->fi_buf[x].entry, env->js_id);
3433 put4com(fi_rel_entry->fi_buf[x].offset, env->js_id);
3434 put4com(fi_rel_entry->fi_buf[x].fi_hindo, env->js_id);
3435 put4com(fi_rel_entry->fi_buf[x].fi_ima, env->js_id);
3436 }
3437 snd_flush(env->js_id);
3438
3439 if((x = get4com(env->js_id)) == -1) {
3440 env_wnn_errorno_set= get4com(env->js_id);
3441 UnlockMutex(&(env_js_lock)); return -1;
3442 }
3443 UnlockMutex(&(env_js_lock));
3444 return x;
3445 } /* End of js_set_fi_priority */
3446
3447 /*:::DOC_START
3448 *
3449 * Function Name: js_optimize_fi
3450 * Description : ���ꤵ�줿������κ��ӥåȡ����٤����ꤷ���Ƴؽ�����
3451 * ����Ƭ�졦�����ࡦ���Ѹ졦�����졦�ƣɡˤ�Ԥ�
3452 * Parameter :
3453 * env : (In) �Ķ��ؤΥݥ���
3454 * nkouho : (In) ��������
3455 * dic : (In) ���䤬��Ͽ����Ƥ��뼭���ֹ�����ؤΥݥ���
3456 * entry (In) ����Υ���ȥ��ֹ�����ؤΥݥ���
3457 * ima : (In) ���ӥåȤ�������ˡ�ե饰����ؤΥݥ���
3458 * hindo : (In) ���٤�������ˡ�ե饰����ؤΥݥ���
3459 * kmoji : (In) ����ʸ��������°��ʤ�������ؤΥݥ���
3460 * kouho : (In) ����ʸ�������°�줢�������ؤΥݥ���
3461 *
3462 * Return value : 0==SUCCESS, -1==ERROR
3463 *
3464 * Author : Hideyuki Kishiba
3465 *
3466 * Revision history:
3467 *
3468 *:::DOC_END
3469 */
3470 int
js_optimize_fi(env,nkouho,dic,entry,ima,hindo,kmoji,kouho)3471 js_optimize_fi(env,nkouho,dic,entry,ima,hindo,kmoji,kouho)
3472 struct wnn_env *env;
3473 int nkouho, *dic, *entry, *ima, *hindo, *kmoji;
3474 w_char **kouho;
3475 {
3476 register int x, i;
3477
3478 x = 0;
3479 if(env==0) return(-1);
3480 set_current_js(env->js_id);
3481
3482 /* �����Ф��ƣɳؽ��ݡ��Ȥ��Ƥ��ʤ����ϡ�
3483 �������������ץ�ȥ����������������� */
3484 if(!CHECK_FI) {
3485 for(i = 0; i < nkouho; i++) {
3486 x = js_hindo_set(env, dic[i], entry[i], ima[i], hindo[i]);
3487 if(x == -1) return(-1);
3488 }
3489 return(x);
3490 }
3491
3492 LockMutex(&(env_js_lock));
3493 handler_of_jserver_dead_env(env);
3494 if(env_wnn_errorno_eql) {
3495 UnlockMutex(&(env_js_lock));
3496 return(-1);
3497 }
3498 snd_env_head(env,JS_OPTIMIZE_FI);
3499
3500 put4com(nkouho, env->js_id);
3501 for(x = 0; x < nkouho; x++) {
3502 put4com(dic[x], env->js_id);
3503 put4com(entry[x], env->js_id);
3504 put4com(ima[x], env->js_id);
3505 put4com(hindo[x], env->js_id);
3506 put4com(kmoji[x], env->js_id);
3507 putwscom(kouho[x], env->js_id);
3508 }
3509 snd_flush(env->js_id);
3510
3511 if((x = get4com(env->js_id)) == -1) {
3512 env_wnn_errorno_set= get4com(env->js_id);
3513 UnlockMutex(&(env_js_lock)); return -1;
3514 }
3515 UnlockMutex(&(env_js_lock));
3516 return x;
3517 } /* End of js_optimize_fi */
3518
3519
3520 /****
3521 Henkan
3522 ****/
3523
3524 static void
put_fzk_vec(hinsi,fzk,vec,vec1,server)3525 put_fzk_vec(hinsi,fzk,vec,vec1, server)
3526 int hinsi;
3527 w_char *fzk;
3528 int vec;
3529 int vec1;
3530 ARGS *server;
3531 {
3532 put4com(hinsi, server);
3533 putwscom(fzk, server);
3534 put4com(vec, server);
3535 put4com(vec1, server);
3536 }
3537
3538 /**
3539 kanren
3540 **/
3541 static int rcv_dai(), rcv_fi_rel_data();
3542 static void rcv_sho_x();
3543 static void rcv_sho_kanji();
3544
3545 int
js_kanren(env,yomi,hinsi,fzk,vec,vec1,vec2,rb)3546 js_kanren(env,yomi,hinsi,fzk,vec,vec1,vec2,rb)
3547 struct wnn_env *env;
3548 w_char *yomi;
3549 int hinsi;
3550 w_char *fzk;
3551 int vec;
3552 int vec1;
3553 int vec2;
3554 struct wnn_ret_buf *rb;
3555 {
3556 int x;
3557
3558 if(env==0) return(-1);
3559 set_current_js(env->js_id);
3560 LockMutex(&(env_js_lock));
3561 handler_of_jserver_dead_env(env);
3562 if(env_wnn_errorno_eql) {
3563 UnlockMutex(&(env_js_lock));
3564 return(-1);
3565 }
3566 snd_env_head(env,JS_KANREN);
3567 putwscom(yomi, env->js_id);
3568 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
3569 put4com(vec2, env->js_id);
3570 snd_flush(env->js_id);
3571 x = rcv_dai(rb, env->js_id);
3572 UnlockMutex(&(env_js_lock));
3573 return x;
3574 }
3575
3576 /*:::DOC_START
3577 *
3578 * Function Name: js_fi_kanren
3579 * Description : Ϣʸ��ƣ��Ѵ���Ԥ�����̤�������
3580 * Parameter :
3581 * env : (In) �Ķ��ؤΥݥ���
3582 * yomi: (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
3583 * hinsi (In) ����ʸ����ʻ��ֹ�
3584 * fzk : (In) ����ʸ�����°��ʸ����ؤΥݥ���
3585 * vec : (In) ��ü�٥��ȥ룱
3586 * vec1 : (In) ��ü�٥��ȥ룲
3587 * vec2 : (In) Ϣʸ���Ѵ��������ʸ��ν�ü�٥��ȥ�
3588 * prev : (In) ľ������ʸ�����¤�ΤؤΥݥ���
3589 * rb : (Out) �Ѵ���������ѹ�¤�ΤؤΥݥ���
3590 * fi_rb : (Out) ���ѣƣɴط������ѹ�¤�ΤؤΥݥ���
3591 *
3592 * Return value : 0==SUCCESS, -1==ERROR
3593 *
3594 * Author : Hideyuki Kishiba
3595 *
3596 * Revision history:
3597 *
3598 *:::DOC_END
3599 */
3600 int
js_fi_kanren(env,yomi,hinsi,fzk,vec,vec1,vec2,prev,rb,fi_rb)3601 js_fi_kanren(env,yomi,hinsi,fzk,vec,vec1,vec2,prev,rb,fi_rb)
3602 struct wnn_env *env;
3603 w_char *yomi;
3604 int hinsi;
3605 w_char *fzk;
3606 int vec;
3607 int vec1;
3608 int vec2;
3609 struct wnn_prev_bun *prev;
3610 struct wnn_ret_buf *rb;
3611 struct wnn_fi_rel_buf *fi_rb;
3612 {
3613 int x;
3614
3615 if(env==0) return(-1);
3616 set_current_js(env->js_id);
3617
3618 /* �����Ф��ƣ��Ѵ��ݡ��Ȥ��Ƥ��ʤ����ϡ������Ϣʸ�����
3619 �ץ�ȥ�������� */
3620 if(!CHECK_FI) return(js_kanren(env,yomi,hinsi,fzk,vec,vec1,vec2,rb));
3621
3622 LockMutex(&(env_js_lock));
3623 handler_of_jserver_dead_env(env);
3624 if(env_wnn_errorno_eql) {
3625 UnlockMutex(&(env_js_lock));
3626 return(-1);
3627 }
3628 snd_env_head(env,JS_FI_KANREN);
3629 putwscom(yomi, env->js_id);
3630 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
3631 put4com(vec2, env->js_id);
3632 /* ľ������ʸ����� */
3633 for(x = 0; x < WNN_PREV_BUN_SUU; x++) {
3634 put4com(prev[x].dic_no, env->js_id); /* Wnn �����ֹ� */
3635 put4com(prev[x].entry, env->js_id); /* ����ȥ��ֹ� */
3636 put4com(prev[x].jirilen, env->js_id); /* ��Ω���ɤ�Ĺ */
3637 put4com(prev[x].hinsi, env->js_id); /* �ʻ��ֹ� */
3638 putwscom((prev[x].kouho + prev[x].real_kanjilen), env->js_id);
3639 /* ��°��ʸ���� */
3640 }
3641 snd_flush(env->js_id);
3642
3643 /* Ϣʸ��ƣ��Ѵ���̤������� */
3644 x = rcv_dai(rb, env->js_id);
3645 /* ���ѣƣɴط��������� */
3646 if(x != -1) {
3647 if(rcv_fi_rel_data(fi_rb, env->js_id) == -1) x = -1;
3648 }
3649
3650 UnlockMutex(&(env_js_lock));
3651 return x;
3652 } /* End of js_fi_kanren */
3653
3654 /* rcv dai */
3655 static int
rcv_dai(ret,server)3656 rcv_dai(ret, server)
3657 struct wnn_ret_buf *ret;
3658 ARGS *server;
3659 {int dai_cnt,sho_sum,kanji_sum,d_size,s_size,k_size,x;
3660 register int i;
3661 struct wnn_dai_bunsetsu *dai_list;
3662 register struct wnn_dai_bunsetsu *dp;
3663 struct wnn_sho_bunsetsu *sho_list;
3664 register struct wnn_sho_bunsetsu *sp;
3665 w_char *kanji,*kp;
3666
3667 dai_cnt = get4com(server);
3668 if(dai_cnt == -1){ /* error dayo */
3669 js_wnn_errorno_set = get4com(server);
3670 return -1;
3671 }
3672 sho_sum = get4com(server);
3673 kanji_sum = get4com(server);
3674
3675 d_size=sizeof(struct wnn_dai_bunsetsu)*dai_cnt;
3676 s_size=sizeof(struct wnn_sho_bunsetsu)*sho_sum;
3677 k_size=sizeof(w_char)*kanji_sum;
3678
3679 /* re_alloc(ret, d_size+s_size+k_size); Seems This cause Bug?? H.T.*/
3680 re_alloc(ret, d_size+s_size+k_size);
3681
3682 dai_list = ( struct wnn_dai_bunsetsu *) ret->buf;
3683 sho_list = ( struct wnn_sho_bunsetsu *)((char *)ret->buf + d_size);
3684 kanji = (w_char *)((char *)ret->buf + d_size + s_size);
3685
3686 for(dp = dai_list,i=0; i<dai_cnt; i++){
3687 dp -> end = get4com(server);
3688 dp -> start = get4com(server);
3689 dp -> sbncnt = get4com(server);
3690 dp -> hyoka = get4com(server);
3691 dp++;
3692 }
3693
3694 for(dp = dai_list, sp = sho_list, i=0; i<dai_cnt; i++){
3695 dp -> sbn = sp;
3696 x = dp -> sbncnt;
3697 rcv_sho_x(sp,x, server);
3698 sp += x;
3699 dp++;
3700 }
3701
3702 for(dp=dai_list, kp=kanji, i=0; i<dai_cnt; i++){
3703 rcv_sho_kanji(dp->sbn,dp->sbncnt,&kp,&k_size,server);
3704 dp++;
3705 }
3706 return dai_cnt;
3707 }
3708
3709 /* rcv sho routines */
3710 static void
rcv_sho_x(sho_list,sho_cnt,server)3711 rcv_sho_x(sho_list,sho_cnt, server)
3712 register struct wnn_sho_bunsetsu *sho_list;
3713 int sho_cnt;
3714 ARGS *server;
3715 {register int i;
3716 for(i=0;i<sho_cnt;i++){
3717 sho_list -> end = get4com(server);
3718 sho_list -> start = get4com(server);
3719 sho_list -> jiriend = get4com(server);
3720 sho_list -> dic_no = get4com(server);
3721 sho_list -> entry = get4com(server);
3722 sho_list -> hindo = get4com(server);
3723 sho_list -> ima = get4com(server);
3724 sho_list -> hinsi = get4com(server);
3725 sho_list -> status = get4com(server);
3726 sho_list -> status_bkwd = get4com(server);
3727 sho_list ->kangovect = get4com(server);
3728 sho_list -> hyoka = get4com(server);
3729 sho_list++;
3730 }
3731 }
3732
3733 static void
rcv_sho_kanji(sho_list,sho_cnt,kanji,kanjibytes,server)3734 rcv_sho_kanji(sho_list,sho_cnt,kanji,kanjibytes,server)
3735 struct wnn_sho_bunsetsu *sho_list;
3736 int sho_cnt;
3737 w_char **kanji;
3738 int *kanjibytes;
3739 ARGS *server;
3740 {
3741 register w_char *k;
3742 register int i, bytes, error_flag, wlen;
3743 w_char wbuf[LENGTHKANJI];
3744
3745 k = *kanji;
3746 bytes = *kanjibytes;
3747 if (bytes <= 0)
3748 error_flag = 1;
3749 else
3750 error_flag = 0;
3751
3752 for(i=0;i<sho_cnt;i++){
3753 getwscom(wbuf, server, sizeof(wbuf) / sizeof(w_char));
3754 if (!error_flag) {
3755 wlen = wnn_Strlen(wbuf) + 1;
3756 if ((wlen * sizeof(w_char)) > bytes) {
3757 error_flag = 1;
3758 } else {
3759 sho_list->kanji = k;
3760 wnn_Strcpy(k, wbuf);
3761 k += wlen;
3762 bytes -= (wlen * sizeof(w_char));
3763 }
3764 }
3765
3766 getwscom(wbuf, server, sizeof(wbuf) / sizeof(w_char));
3767 if (!error_flag) {
3768 wlen = wnn_Strlen(wbuf) + 1;
3769 if ((wlen * sizeof(w_char)) > bytes) {
3770 error_flag = 1;
3771 } else {
3772 sho_list->yomi = k;
3773 wnn_Strcpy(k, wbuf);
3774 k += wlen;
3775 bytes -= (wlen * sizeof(w_char));
3776 }
3777 }
3778
3779 getwscom(wbuf, server, sizeof(wbuf) / sizeof(w_char));
3780 if (!error_flag) {
3781 wlen = wnn_Strlen(wbuf) + 1;
3782 if ((wlen * sizeof(w_char)) > bytes) { /* '>=' �ǤϤʤ� */
3783 error_flag = 1;
3784 } else {
3785 sho_list->fuzoku = k;
3786 wnn_Strcpy(k, wbuf);
3787 k += wlen;
3788 bytes -= (wlen * sizeof(w_char));
3789 }
3790 }
3791 sho_list++;
3792 }
3793 *kanji = k;
3794 *kanjibytes = bytes;
3795 }
3796
3797
3798 static int
rcv_sho(ret,server)3799 rcv_sho(ret, server)
3800 struct wnn_ret_buf *ret;
3801 ARGS *server;
3802 {int sho_sum,kanji_sum,s_size,k_size;
3803 struct wnn_sho_bunsetsu *sho_list;
3804 w_char *kanji,*kp;
3805
3806 sho_sum = get4com(server);
3807 if(sho_sum == -1){ /* error dayo */
3808 js_wnn_errorno_set = get4com(server);
3809 return -1;
3810 }
3811 kanji_sum = get4com(server);
3812
3813 s_size=sizeof(struct wnn_sho_bunsetsu)*sho_sum;
3814 k_size=sizeof(w_char)*kanji_sum;
3815
3816 re_alloc(ret, s_size+k_size);
3817
3818 sho_list = ( struct wnn_sho_bunsetsu *)((char *)ret->buf);
3819 kanji = (w_char *)((char *)ret->buf + s_size);
3820
3821 rcv_sho_x(sho_list,sho_sum, server);
3822 kp=kanji;
3823 rcv_sho_kanji(sho_list,sho_sum,&kp,&k_size,server);
3824 return sho_sum;
3825 }
3826
3827 /*:::DOC_START
3828 *
3829 * Function Name: rcv_fi_rel_data
3830 * Description : Ϣʸ��ƣ��Ѵ��˻��Ѥ����ƣɴط������������
3831 * Parameter :
3832 * ret : (Out) ���ѣƣɴط������ѹ�¤�ΤؤΥݥ���
3833 * server : (In) �о� jserver ����¤�ΤؤΥݥ���
3834 *
3835 * Return value : 0==SUCCESS, -1==ERROR
3836 *
3837 * Author : Hideyuki Kishiba
3838 *
3839 * Revision history:
3840 *
3841 *:::DOC_END
3842 */
3843 static int
rcv_fi_rel_data(ret,server)3844 rcv_fi_rel_data(ret, server)
3845 struct wnn_fi_rel_buf *ret;
3846 ARGS *server;
3847 {
3848 register int i, fi_num;
3849 struct fi_rel_data *fi_data;
3850
3851 fi_num = get4com(server); /* ���ѣƣɴط��� */
3852 if(fi_num == 0) return(0); /* ���ѣƣɴط����ʤ��ä� */
3853
3854 if(ret->size < ret->num + fi_num) {
3855 /* �����ˣƣɴط��ǡ�����¤���������ݤ��� */
3856 fi_data = (struct fi_rel_data *)
3857 malloc((ret->num + fi_num) * sizeof(struct fi_rel_data));
3858
3859 /* ���˻��Ѥ��Ƥ����ƣɴط��ǡ����ԡ����� */
3860 if(fi_data) {
3861 if(ret->fi_buf) {
3862 bcopy(ret->fi_buf, fi_data, ret->num * sizeof(struct fi_rel_data));
3863 free((char *)ret->fi_buf);
3864 }
3865 }
3866 ret->fi_buf = fi_data;
3867 ret->size = ret->num + fi_num;
3868 }
3869
3870 /* �ƣɴط��ǡ�����¤�������ݤǤ������� */
3871 if(ret->fi_buf == NULL) {
3872 int dummy;
3873 for(i = 0; i < 4 * fi_num; i++) dummy = get4com(server);
3874 js_wnn_errorno_set = WNN_MALLOC_ERR;
3875 return(-1);
3876 }
3877
3878 /* ���ѣƣɴط��ǡ����������� */
3879 fi_data = ret->fi_buf + ret->num;
3880 for(i = 0; i < fi_num; i++, fi_data++) {
3881 fi_data->fi_dic_no = get4com(server);
3882 fi_data->dic_no = get4com(server);
3883 fi_data->entry = get4com(server);
3884 fi_data->offset = get4com(server);
3885 fi_data->fi_hindo = WNN_HINDO_NOP;
3886 fi_data->fi_ima = WNN_IMA_OFF;
3887 }
3888 ret->num = ret->num + fi_num;
3889 return(0);
3890 } /* End of rcv_fi_rel_data */
3891
3892 /**
3893 kantan
3894 **/
3895 int
js_kantan_dai(env,yomi,hinsi,fzk,vec,vec1,rb)3896 js_kantan_dai(env,yomi,hinsi,fzk,vec,vec1,rb)
3897 struct wnn_env *env;
3898 w_char *yomi;
3899 int hinsi;
3900 w_char *fzk;
3901 int vec;
3902 int vec1;
3903 struct wnn_ret_buf *rb;
3904 {
3905 int x;
3906
3907 if(env==0) return(-1);
3908 set_current_js(env->js_id);
3909 LockMutex(&(env_js_lock));
3910 handler_of_jserver_dead_env(env);
3911 if(env_wnn_errorno_eql) {
3912 UnlockMutex(&(env_js_lock));
3913 return(-1);
3914 }
3915 snd_env_head(env,JS_KANTAN_DAI);
3916 putwscom(yomi, env->js_id);
3917 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
3918 snd_flush(env->js_id);
3919 x = rcv_dai(rb, env->js_id);
3920 UnlockMutex(&(env_js_lock));
3921 return x;
3922 }
3923
3924 int
js_kantan_sho(env,yomi,hinsi,fzk,vec,vec1,rb)3925 js_kantan_sho(env,yomi,hinsi,fzk,vec,vec1,rb)
3926 struct wnn_env *env;
3927 w_char *yomi;
3928 int hinsi;
3929 w_char *fzk;
3930 int vec;
3931 int vec1;
3932 struct wnn_ret_buf *rb;
3933 {int sbncnt;
3934 if(env==0) return(-1);
3935 set_current_js(env->js_id);
3936 LockMutex(&(env_js_lock));
3937 handler_of_jserver_dead_env(env);
3938 if(env_wnn_errorno_eql) {
3939 UnlockMutex(&(env_js_lock));
3940 return(-1);
3941 }
3942 snd_env_head(env,JS_KANTAN_SHO);
3943 putwscom(yomi, env->js_id);
3944 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
3945 snd_flush(env->js_id);
3946
3947 sbncnt = rcv_sho(rb, env->js_id);
3948 UnlockMutex(&(env_js_lock));
3949 return sbncnt;
3950 }
3951
3952 /**
3953 kanzen
3954 **/
3955 int
js_kanzen_dai(env,yomi,hinsi,fzk,vec,vec1,rb)3956 js_kanzen_dai(env,yomi,hinsi,fzk,vec,vec1,rb)
3957 struct wnn_env *env;
3958 w_char *yomi;
3959 int hinsi;
3960 w_char *fzk;
3961 int vec;
3962 int vec1;
3963 struct wnn_ret_buf *rb;
3964 {
3965 int x;
3966
3967 if(env==0) return(-1);
3968 set_current_js(env->js_id);
3969 LockMutex(&(env_js_lock));
3970 handler_of_jserver_dead_env(env);
3971 if(env_wnn_errorno_eql) {
3972 UnlockMutex(&(env_js_lock));
3973 return(-1);
3974 }
3975 snd_env_head(env,JS_KANZEN_DAI);
3976 putwscom(yomi, env->js_id);
3977 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
3978 snd_flush(env->js_id);
3979 x = rcv_dai(rb, env->js_id);
3980 UnlockMutex(&(env_js_lock));
3981 return x;
3982 }
3983
3984
3985 int
js_kanzen_sho(env,yomi,hinsi,fzk,vec,vec1,rb)3986 js_kanzen_sho(env,yomi,hinsi,fzk,vec,vec1,rb)
3987 struct wnn_env *env;
3988 w_char *yomi;
3989 int hinsi;
3990 w_char *fzk;
3991 int vec;
3992 int vec1;
3993 struct wnn_ret_buf *rb;
3994 {int sbncnt;
3995 if(env==0) return(-1);
3996 set_current_js(env->js_id);
3997 LockMutex(&(env_js_lock));
3998 handler_of_jserver_dead_env(env);
3999 if(env_wnn_errorno_eql) {
4000 UnlockMutex(&(env_js_lock));
4001 return(-1);
4002 }
4003 snd_env_head(env,JS_KANZEN_SHO);
4004 putwscom(yomi, env->js_id);
4005 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
4006 snd_flush(env->js_id);
4007
4008 sbncnt = rcv_sho(rb, env->js_id);
4009 UnlockMutex(&(env_js_lock));
4010 return sbncnt;
4011 }
4012
4013 /**
4014 henkan with data
4015 **/
4016 int
js_henkan_with_data(env,fuku,nhinsi,hlist,henkan,yomi,hinsi,fzk,vec,vec1,vec2,rb)4017 js_henkan_with_data(env,fuku,nhinsi,hlist,henkan,yomi,hinsi,fzk,vec,vec1,vec2,rb)
4018 struct wnn_env *env;
4019 int fuku, nhinsi, *hlist, henkan;
4020 w_char *yomi;
4021 int hinsi;
4022 w_char *fzk;
4023 int vec;
4024 int vec1;
4025 int vec2;
4026 struct wnn_ret_buf *rb;
4027 {
4028 int x, i, loop = abs(nhinsi);
4029
4030 if(env==0) return(-1);
4031 set_current_js(env->js_id);
4032 LockMutex(&(env_js_lock));
4033 handler_of_jserver_dead_env(env);
4034 if(env_wnn_errorno_eql) {
4035 UnlockMutex(&(env_js_lock));
4036 return(-1);
4037 }
4038 snd_env_head(env,JS_HENKAN_WITH_DATA);
4039 put4com(fuku, env->js_id); /* ʣ���ͥ�� */
4040 put4com(nhinsi, env->js_id); /* �Ѵ������ʻ�� */
4041 for(i = 0; i < loop; i++)
4042 put4com(hlist[i], env->js_id); /* �Ѵ������ʻ��ֹ� */
4043 put4com(henkan, env->js_id); /* �Ѵ����� */
4044 putwscom(yomi, env->js_id);
4045 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
4046 put4com(vec2, env->js_id);
4047 snd_flush(env->js_id);
4048
4049 switch(henkan) {
4050 case WNN_KANREN:
4051 case WNN_KANTAN_DAI:
4052 case WNN_KANZEN_DAI:
4053 x = rcv_dai(rb, env->js_id);
4054 break;
4055 case WNN_KANTAN_SHO:
4056 case WNN_KANZEN_SHO:
4057 x = rcv_sho(rb, env->js_id);
4058 break;
4059 default:
4060 x = get4com(env->js_id);
4061 env_wnn_errorno_set= get4com(env->js_id);
4062 }
4063 UnlockMutex(&(env_js_lock));
4064 return x;
4065 }
4066
4067 /** js_version **/
4068 int
js_version(server,serv,libv)4069 js_version(server,serv,libv)
4070 int *serv,*libv;
4071 WNN_JSERVER_ID *server;
4072 {
4073 set_current_js(server);
4074 LockMutex(&(server_js_lock));
4075 handler_of_jserver_dead(server);
4076 if(js_wnn_errorno_eql) {
4077 UnlockMutex(&(server_js_lock));
4078 return(-1);
4079 }
4080 snd_server_head(server, JS_VERSION);
4081 snd_flush(server);
4082 *libv= JLIB_VERSION;
4083 *serv = get4com(server);
4084 UnlockMutex(&(server_js_lock));
4085 return *serv;
4086 }
4087
4088 static void
re_alloc(ret,size)4089 re_alloc(ret,size)
4090 register struct wnn_ret_buf *ret;
4091 int size;
4092 {
4093 if(ret->size < size){
4094 if(ret->buf)
4095 free((char *)ret->buf);
4096 ret->buf = malloc(size);
4097 ret->size = size;
4098 }
4099 }
4100
4101 int
js_kill(server)4102 js_kill(server)
4103 WNN_JSERVER_ID *server;
4104 {
4105 int x;
4106 set_current_js(server);
4107 LockMutex(&(server_js_lock));
4108 handler_of_jserver_dead(server);
4109 if(js_wnn_errorno_eql) {
4110 UnlockMutex(&(server_js_lock));
4111 return(-1);
4112 }
4113 snd_server_head(server, JS_KILL);
4114 snd_flush(server);
4115 x = get4com(server);
4116 UnlockMutex(&(server_js_lock));
4117 return(x);
4118 }
4119
4120 int
js_file_remove(server,n,pwd)4121 js_file_remove(server, n, pwd)
4122 WNN_JSERVER_ID *server;
4123 char *n, *pwd;
4124 {
4125 register int x;
4126 set_current_js(server);
4127 LockMutex(&(server_js_lock));
4128 handler_of_jserver_dead(server);
4129 if(js_wnn_errorno_eql) {
4130 UnlockMutex(&(server_js_lock));
4131 return(-1);
4132 }
4133 snd_server_head(server,JS_FILE_REMOVE);
4134 putscom(n, server);
4135 putscom(pwd, server);
4136 snd_flush(server);
4137 if((x=get4com(server))==-1){
4138 js_wnn_errorno_set= get4com(server);
4139 UnlockMutex(&(server_js_lock));
4140 return -1;
4141 }
4142 UnlockMutex(&(server_js_lock));
4143 return(x);
4144 }
4145
4146 int
js_file_remove_client(server,n,pwd)4147 js_file_remove_client(server, n, pwd)
4148 WNN_JSERVER_ID *server;
4149 char *n, *pwd;
4150 {
4151 struct wnn_file_head fh;
4152 register FILE *fp;
4153 int is_compressed;
4154
4155 set_current_js(server);
4156 LockMutex(&(server_js_lock));
4157 handler_of_jserver_dead(server);
4158 if(js_wnn_errorno_eql) {
4159 UnlockMutex(&(server_js_lock));
4160 return(-1);
4161 }
4162 if(js_file_loaded_local_body(server, n) != -1){
4163 js_wnn_errorno_set = WNN_FILE_IN_USE;
4164 UnlockMutex(&(server_js_lock));
4165 return(-1);
4166 }
4167 #ifdef WRITE_CHECK
4168 check_backup(n, NULL);
4169 #endif /* WRITE_CHECK */
4170 if((fp=dic_fopen(n,"r", &is_compressed)) == NULL){
4171 js_wnn_errorno_set = WNN_FILE_READ_ERROR;
4172 UnlockMutex(&(server_js_lock));
4173 return(-1);
4174 }
4175 if(input_file_header(fp, &fh, NULL) == -1){
4176 dic_fclose(fp, is_compressed);
4177 UnlockMutex(&(server_js_lock));
4178 return(-1);
4179 }
4180 dic_fclose(fp, is_compressed);
4181 if(!check_pwd(pwd, fh.file_passwd)){
4182 js_wnn_errorno_set = WNN_INCORRECT_PASSWD;
4183 UnlockMutex(&(server_js_lock));
4184 return(-1);
4185 }
4186 if(unlink(n) == -1){
4187 js_wnn_errorno_set = WNN_UNLINK;
4188 UnlockMutex(&(server_js_lock));
4189 return(-1);
4190 }
4191 UnlockMutex(&(server_js_lock));
4192 return(0);
4193 }
4194
4195 /*:::DOC_START
4196 *
4197 * Function Name: js_dic_file_create_client
4198 * Description : ���饤�����¦�˼���ե�������������
4199 * Parameter :
4200 * env : (In) �Ķ��ؤΥݥ���
4201 * fn : (In) ��������ե�����̾
4202 * type : (In) ��������ե����륿����
4203 * com : (In) ��������ե����륳����
4204 * passwd (In) ��������ե�����ѥ����
4205 * hpasswd : (In) �������������٥ѥ����
4206 *
4207 * Return value : 0==SUCCESS, -1==ERROR
4208 *
4209 * Author : Hideyuki Kishiba
4210 *
4211 * Revision history:
4212 *
4213 *:::DOC_END
4214 */
4215 int
js_dic_file_create_client(env,fn,type,com,passwd,hpasswd)4216 js_dic_file_create_client(env, fn, type, com, passwd, hpasswd)
4217 struct wnn_env *env;
4218 int type;
4219 char *fn;
4220 w_char *com;
4221 char *passwd, *hpasswd;
4222 {
4223 int x, js_jishonum;
4224
4225 if(env==0) return(-1);
4226 LockMutex(&(env_js_lock));
4227 /*
4228 * Hideyuki Kishiba (Jul. 7, 1994)
4229 * �ƣɴط������롼���ޡ�������κ����������ɲ�
4230 */
4231 if(type != WNN_REV_DICT &&
4232 type != CWNN_REV_DICT &&
4233 type != BWNN_REV_DICT &&
4234 type != WNN_UD_DICT &&
4235 type != WNN_FI_USER_DICT &&
4236 type != WNN_GROUP_DICT &&
4237 type != WNN_MERGE_DICT){
4238 env_wnn_errorno_set = WNN_NOT_A_UD;
4239 UnlockMutex(&(env_js_lock));
4240 return(-1);
4241 }
4242 if(type == WNN_FI_USER_DICT) { /* �ƣɴط���������ؿ���Ƥ� */
4243 int i, j;
4244 unsigned char njisho;
4245 struct wnn_file_uniq duniq[WNN_MAX_JISHO_OF_AN_ENV];
4246 int dprimary[WNN_MAX_JISHO_OF_AN_ENV];
4247
4248 /* ��³�����������primary index table��file uniq�ˤμ������ */
4249 set_current_js(env->js_id);
4250 handler_of_jserver_dead_env(env);
4251 if(env_wnn_errorno_eql) {
4252 UnlockMutex(&(env_js_lock));
4253 return(-1);
4254 }
4255 snd_env_head(env, JS_DIC_FILE_CREATE_CLIENT);
4256 snd_flush(env->js_id);
4257 x = get4com(env->js_id);
4258 if(x == -1) {
4259 env_wnn_errorno_set = get4com(env->js_id);
4260 UnlockMutex(&(env_js_lock));
4261 return(-1);
4262 }
4263 js_jishonum = get1com(env->js_id); /* ��³�������� */
4264 if (js_jishonum > WNN_MAX_JISHO_OF_AN_ENV)
4265 njisho = WNN_MAX_JISHO_OF_AN_ENV;
4266 else
4267 njisho = js_jishonum;
4268 for(i = 0; i < njisho; i++) {
4269 /* ��³������� file uniq */
4270 duniq[i].time = get4com(env->js_id);
4271 duniq[i].dev = get4com(env->js_id);
4272 duniq[i].inode = get4com(env->js_id);
4273 for(j = 0; j < WNN_HOSTLEN; j++){
4274 duniq[i].createhost[j] = get1com(env->js_id);
4275 }
4276 /* ��³���������Ͽ���ÿ� */
4277 dprimary[i] = get4com(env->js_id);
4278 }
4279 if (js_jishonum > WNN_MAX_JISHO_OF_AN_ENV) {
4280 js_jishonum -= WNN_MAX_JISHO_OF_AN_ENV;
4281 for(i = 0; i < js_jishonum; i++) {
4282 get4com(env->js_id);
4283 get4com(env->js_id);
4284 get4com(env->js_id);
4285 for(j = 0; j < WNN_HOSTLEN; j++){
4286 get1com(env->js_id);
4287 }
4288 get4com(env->js_id);
4289 }
4290 }
4291 x = create_null_fi_dic(fn, com, passwd, hpasswd, type, njisho, duniq, dprimary, NULL);
4292
4293 } else /* �ף�������ؿ���Ƥ� */
4294 x = create_null_dic(fn,com, passwd, hpasswd, type, NULL);
4295
4296 if(x == -1){
4297 env_wnn_errorno_set = WNN_FILE_CREATE_ERROR;
4298 UnlockMutex(&(env_js_lock));
4299 return(-1);
4300 }
4301 UnlockMutex(&(env_js_lock));
4302 return(0);
4303 } /* End of js_dic_file_create_client */
4304
4305
4306 /** js_hindo_file_create_client **/
4307 int
js_hindo_file_create_client(env,fid,fn,com,hpasswd)4308 js_hindo_file_create_client(env,fid,fn,com,hpasswd)
4309 struct wnn_env *env;
4310 int fid;
4311 char *fn;
4312 w_char *com;
4313 char *hpasswd;
4314 {
4315 register int x;
4316 struct wnn_file_uniq funiq;
4317 int serial;
4318 register int i;
4319
4320 if(env==0) return(-1);
4321 set_current_js(env->js_id);
4322 LockMutex(&(env_js_lock));
4323 handler_of_jserver_dead_env(env);
4324 if(env_wnn_errorno_eql) {
4325 UnlockMutex(&(env_js_lock));
4326 return(-1);
4327 }
4328 snd_env_head(env,JS_HINDO_FILE_CREATE_CLIENT);
4329 put4com(fid, env->js_id);
4330 snd_flush(env->js_id);
4331 x = get4com(env->js_id);
4332 if(x == -1){
4333 env_wnn_errorno_set = get4com(env->js_id);
4334 UnlockMutex(&(env_js_lock));
4335 return(-1);
4336 }
4337 serial = get4com(env->js_id);
4338 funiq.time = get4com(env->js_id);
4339 funiq.dev = get4com(env->js_id);
4340 funiq.inode = get4com(env->js_id);
4341 for(i=0;i<WNN_HOSTLEN;i++){
4342 funiq.createhost[i]=get1com(env->js_id);
4343 }
4344 if(create_hindo_file(&funiq,fn,com,hpasswd,serial, NULL, NULL) == -1){
4345 env_wnn_errorno_set = WNN_FILE_CREATE_ERROR;
4346 UnlockMutex(&(env_js_lock));
4347 return(-1);
4348 }
4349 UnlockMutex(&(env_js_lock));
4350 return(0);
4351 }
4352
4353 /*:::DOC_START
4354 *
4355 * Function Name: js_fi_hindo_file_create_client
4356 * Description : ���饤�����¦�ˣƣɴط����٥ե�������������
4357 * Parameter :
4358 * env : (In) �Ķ��ؤΥݥ���
4359 * fid : (In) �б��ƣɴط�����ե�����ɣ�
4360 * fn : (In) �ƣɴط����٥ե�����̾
4361 * com : (In) �ƣɴط����٥ե����륳����
4362 * hpasswd : (In) �ƣɴط����٥ե�����ѥ����
4363 *
4364 * Return value : 0==SUCCESS, -1==ERROR
4365 *
4366 * Author : Hideyuki Kishiba
4367 *
4368 * Revision history:
4369 *
4370 *:::DOC_END
4371 */
4372 int
js_fi_hindo_file_create_client(env,fid,fn,com,hpasswd)4373 js_fi_hindo_file_create_client(env, fid, fn, com, hpasswd)
4374 struct wnn_env *env;
4375 int fid;
4376 char *fn;
4377 w_char *com;
4378 char *hpasswd;
4379 {
4380 register int x;
4381 struct wnn_file_uniq funiq;
4382 unsigned char njisho;
4383 int *primary;
4384 register int i;
4385
4386 if(env==0) return(-1);
4387 set_current_js(env->js_id);
4388 LockMutex(&(env_js_lock));
4389 handler_of_jserver_dead_env(env);
4390 if(env_wnn_errorno_eql) {
4391 UnlockMutex(&(env_js_lock));
4392 return(-1);
4393 }
4394 snd_env_head(env,JS_FI_HINDO_FILE_CREATE_CLIENT);
4395 put4com(fid, env->js_id);
4396 snd_flush(env->js_id);
4397 x = get4com(env->js_id);
4398 if(x == -1){
4399 env_wnn_errorno_set = get4com(env->js_id);
4400 UnlockMutex(&(env_js_lock));
4401 return(-1);
4402 }
4403 funiq.time = get4com(env->js_id);
4404 funiq.dev = get4com(env->js_id);
4405 funiq.inode = get4com(env->js_id);
4406 for(i=0;i<WNN_HOSTLEN;i++){
4407 funiq.createhost[i]=get1com(env->js_id);
4408 }
4409 njisho = get1com(env->js_id);
4410 if((primary = (int *)malloc(njisho * sizeof(int))) == NULL) {
4411 env_wnn_errorno_set = WNN_MALLOC_ERR;
4412 UnlockMutex(&(env_js_lock));
4413 return(-1);
4414 }
4415 for(i = 0; i < njisho; i++)
4416 primary[i] = get4com(env->js_id);
4417 if(create_fi_hindo_file(&funiq,fn,com,hpasswd,njisho,primary,NULL) == -1){
4418 free(primary);
4419 env_wnn_errorno_set = WNN_FILE_CREATE_ERROR;
4420 UnlockMutex(&(env_js_lock));
4421 return(-1);
4422 }
4423 free(primary);
4424 UnlockMutex(&(env_js_lock));
4425 return(0);
4426 } /* End of js_fi_hindo_file_create_client */
4427
4428 int
js_file_comment_set(env,fid,comment)4429 js_file_comment_set(env, fid, comment)
4430 struct wnn_env *env;
4431 int fid;
4432 w_char *comment;
4433 {
4434 register int x;
4435 if(env==0) return(-1);
4436 set_current_js(env->js_id);
4437 LockMutex(&(env_js_lock));
4438 handler_of_jserver_dead_env(env);
4439 if(env_wnn_errorno_eql) {
4440 UnlockMutex(&(env_js_lock));
4441 return(-1);
4442 }
4443 snd_env_head(env,JS_FILE_COMMENT_SET);
4444 put4com(fid, env->js_id);
4445 putwscom(comment, env->js_id);
4446 snd_flush(env->js_id);
4447 x=get4com(env->js_id);
4448 if(x==-1){
4449 env_wnn_errorno_set= get4com(env->js_id);
4450 UnlockMutex(&(env_js_lock));
4451 return(-1);
4452 }
4453 UnlockMutex(&(env_js_lock));
4454 return(0);
4455 }
4456
4457 /*
4458 * Hinsi Primitives
4459 */
4460
4461 int
js_hinsi_name(server,no,rb)4462 js_hinsi_name(server, no, rb)
4463 WNN_JSERVER_ID *server;
4464 int no;
4465 struct wnn_ret_buf *rb;
4466 {
4467 register int size;
4468
4469 set_current_js(server);
4470 LockMutex(&(server_js_lock));
4471 handler_of_jserver_dead(server);
4472 if(js_wnn_errorno_eql) {
4473 UnlockMutex(&(server_js_lock));
4474 return(-1);
4475 }
4476 snd_server_head(server,JS_HINSI_NAME);
4477 put4com(no, server);
4478 snd_flush(server);
4479 if((size = get4com(server)) == -1){
4480 js_wnn_errorno_set = get4com(server);
4481 UnlockMutex(&(server_js_lock));
4482 return(-1);
4483 }
4484 re_alloc(rb,sizeof(w_char)*(size + 1));
4485 getwscom((w_char *)rb->buf, server, size + 1);
4486 UnlockMutex(&(server_js_lock));
4487 return(0);
4488 }
4489
4490
4491 int
js_hinsi_number(server,name)4492 js_hinsi_number(server, name)
4493 WNN_JSERVER_ID *server;
4494 w_char *name;
4495 {
4496 register int no;
4497
4498 set_current_js(server);
4499 LockMutex(&(server_js_lock));
4500 handler_of_jserver_dead(server);
4501 if(js_wnn_errorno_eql) {
4502 UnlockMutex(&(server_js_lock));
4503 return(-1);
4504 }
4505 snd_server_head(server,JS_HINSI_NUMBER);
4506 putwscom(name, server);
4507 snd_flush(server);
4508 if((no = get4com(server)) == -1){
4509 js_wnn_errorno_set = get4com(server);
4510 UnlockMutex(&(server_js_lock));
4511 return(-1);
4512 }
4513 UnlockMutex(&(server_js_lock));
4514 return(no);
4515 }
4516
4517 int
js_hinsi_list(env,dic_no,name,rb)4518 js_hinsi_list(env, dic_no, name, rb)
4519 struct wnn_env *env;
4520 int dic_no;
4521 w_char *name;
4522 struct wnn_ret_buf *rb;
4523 {
4524 int wtotal;
4525 int count;
4526 register w_char *s;
4527 register w_char **r;
4528 register int k, wlen, error_flag;
4529 w_char wbuf[LENGTHKANJI];
4530
4531 if(env==0) return(-1);
4532 set_current_js(env->js_id);
4533 LockMutex(&(env_js_lock));
4534 handler_of_jserver_dead_env(env);
4535 if(env_wnn_errorno_eql) {
4536 UnlockMutex(&(env_js_lock));
4537 return(-1);
4538 }
4539 snd_env_head(env,JS_HINSI_LIST);
4540 put4com(dic_no, env->js_id);
4541 putwscom(name, env->js_id);
4542 snd_flush(env->js_id);
4543 if((count = get4com(env->js_id)) == -1){
4544 env_wnn_errorno_set = get4com(env->js_id);
4545 UnlockMutex(&(env_js_lock));
4546 return(-1);
4547 }
4548 wtotal = get4com(env->js_id);
4549 wtotal += 1;
4550 re_alloc(rb,sizeof(w_char)*(wtotal) + count * sizeof(w_char *) );
4551 r = (w_char **)rb->buf;
4552 s = (w_char *)((w_char **)rb->buf + count);
4553 error_flag = 0;
4554 for(k = 0 ; k < count ; k++){
4555 getwscom(wbuf, env->js_id, sizeof(wbuf) / sizeof(w_char));
4556 if (!error_flag) {
4557 wlen = wnn_Strlen(wbuf) + 1;
4558 if (wlen > wtotal) {
4559 error_flag = 1;
4560 } else {
4561 *r++ = s;
4562 wnn_Strcpy(s, wbuf);
4563 s += wlen;
4564 wtotal -= wlen;
4565 }
4566 }
4567 }
4568 UnlockMutex(&(env_js_lock));
4569 return(count);
4570 }
4571
4572 int
js_hinsi_dicts(env,no,rb)4573 js_hinsi_dicts(env, no, rb)
4574 struct wnn_env *env;
4575 int no;
4576 struct wnn_ret_buf *rb;
4577 {
4578 register int k, count;
4579 int *p;
4580
4581 if(env==0) return(-1);
4582 set_current_js(env->js_id);
4583 LockMutex(&(env_js_lock));
4584 handler_of_jserver_dead_env(env);
4585 if(env_wnn_errorno_eql) {
4586 UnlockMutex(&(env_js_lock));
4587 return(-1);
4588 }
4589 snd_env_head(env,JS_HINSI_DICTS);
4590 put4com(no, env->js_id);
4591 snd_flush(env->js_id);
4592 if((count = get4com(env->js_id)) == -1){
4593 env_wnn_errorno_set = get4com(env->js_id);
4594 UnlockMutex(&(env_js_lock));
4595 return(-1);
4596 }
4597 re_alloc(rb,sizeof(int) * (count + 1));
4598 p = (int *)rb->buf;
4599
4600 for(k = 0 ; k < count ; k++){
4601 *p++ = get4com(env->js_id);
4602 }
4603 UnlockMutex(&(env_js_lock));
4604 return(count);
4605 }
4606
4607
4608 char *wnn_dic_types[] = {"","����","��Ͽ","�հ�","����","����","FI����","FI�桼��","FI����","���롼��","�ޡ���"};
4609
4610 char *cwnn_dic_types[] = {"","�̶�","��¼","ƴ��","����"};
4611 char *bwnn_dic_types[] = {"","�̶�","��¼","����","����"};
4612
4613 char *kwnn_dic_types[] = {"","����","���","����","����"};
4614 /* ͳ�� ���� ��� ��Ю */
4615
4616
4617 /* New primitives 9/8 */
4618
4619 int
js_file_password_set(env,fid,which,old,new)4620 js_file_password_set(env, fid, which, old, new)
4621 struct wnn_env *env;
4622 int fid;
4623 int which; /* 1 for dic, 2 for hindo 3(0) for both*/
4624 char *old, *new;
4625 {
4626 register int x;
4627 if(env==0) return(-1);
4628 set_current_js(env->js_id);
4629 LockMutex(&(env_js_lock));
4630 handler_of_jserver_dead_env(env);
4631 if(env_wnn_errorno_eql) {
4632 UnlockMutex(&(env_js_lock));
4633 return(-1);
4634 }
4635 snd_env_head(env,JS_FILE_PASSWORD_SET);
4636 put4com(fid, env->js_id);
4637 put4com(which, env->js_id);
4638 putscom(old, env->js_id);
4639 putscom(new, env->js_id);
4640 snd_flush(env->js_id);
4641 x=get4com(env->js_id);
4642 if(x==-1){
4643 env_wnn_errorno_set= get4com(env->js_id);
4644 UnlockMutex(&(env_js_lock));
4645 return(-1);
4646 }
4647 UnlockMutex(&(env_js_lock));
4648 return(0);
4649 }
4650
4651 int
js_hinsi_table_set(env,dic_no,hinsi_table)4652 js_hinsi_table_set(env, dic_no, hinsi_table)
4653 struct wnn_env *env;
4654 int dic_no;
4655 w_char *hinsi_table;
4656 {
4657 int x;
4658 if(env==0) return(-1);
4659 set_current_js(env->js_id);
4660 LockMutex(&(env_js_lock));
4661 handler_of_jserver_dead_env(env);
4662 if(env_wnn_errorno_eql) {
4663 UnlockMutex(&(env_js_lock));
4664 return(-1);
4665 }
4666 snd_env_head(env,JS_HINSI_TABLE_SET);
4667 put4com(dic_no, env->js_id);
4668 putwscom(hinsi_table, env->js_id);
4669 snd_flush(env->js_id);
4670 x=get4com(env->js_id);
4671 if(x==-1){
4672 env_wnn_errorno_set= get4com(env->js_id);
4673 UnlockMutex(&(env_js_lock));
4674 return(-1);
4675 }
4676 UnlockMutex(&(env_js_lock));
4677 return(0);
4678 }
4679
4680 /* Start of packets in 4004 */
4681 int
js_open_extension(server,ext_name)4682 js_open_extension(server, ext_name)
4683 WNN_JSERVER_ID *server;
4684 char *ext_name;
4685 {
4686 register wnn_extension_set *p;
4687
4688 if (!ext_name || !*ext_name) {
4689 js_wnn_errorno_set = WNN_NOT_SUPPORT_EXTENSION;
4690 return(-1);
4691 }
4692 for (p = ((WNN_JSERVER_ID_INT *)server)->extensions;
4693 p && p->id && p->name; p++) {
4694 if (!strcmp(p->name, ext_name)) {
4695 return(p->id);
4696 }
4697 }
4698 js_wnn_errorno_set = WNN_NOT_SUPPORT_EXTENSION;
4699 return(0);
4700 }
4701
4702 int
js_get_extension(server,ret)4703 js_get_extension(server, ret)
4704 WNN_JSERVER_ID *server;
4705 char ***ret;
4706 {
4707 register wnn_extension_set *p;
4708 register char *s, **l;
4709 int total = 0, num = 0;
4710
4711 if (!((WNN_JSERVER_ID_INT *)server)->extensions) {
4712 js_wnn_errorno_set = WNN_NOT_SUPPORT_PACKET;
4713 return(-1);
4714 }
4715 for (p = ((WNN_JSERVER_ID_INT *)server)->extensions;
4716 p && p->id && p->name; p++) {
4717 total += strlen(p->name) + 1;
4718 num++;
4719 }
4720 if (num == 0) return(0);
4721 if (!(l = (char **)(s = malloc((sizeof(char *) * num) + total)))) {
4722 js_wnn_errorno_set = WNN_MALLOC_ERR;
4723 return(-1);
4724 }
4725 *ret = l;
4726 s += sizeof(char *) * num;
4727 for (p = ((WNN_JSERVER_ID_INT *)server)->extensions;
4728 p && p->id && p->name; p++) {
4729 *l++ = s;
4730 strcpy(s, p->name);
4731 s += strlen(s) + 1;
4732 }
4733 return(num);
4734 }
4735
4736
4737 static int
access_host_core(server,ha,enable,ule)4738 access_host_core(server, ha, enable, ule)
4739 WNN_JSERVER_ID *server;
4740 host_address *ha;
4741 int enable, ule;
4742 {
4743 register int x;
4744 register char *p;
4745
4746 handler_of_jserver_dead(server);
4747 if (js_wnn_errorno_eql) return(-1);
4748 if (enable) {
4749 snd_server_head(server, JS_ACCESS_ADD_HOST);
4750 put4com(ule, server);
4751 } else {
4752 snd_server_head(server, JS_ACCESS_REMOVE_HOST);
4753 }
4754 put4com(ha->address_len, server);
4755 p = ha->address;
4756 for (x = 0; x < ha->address_len; x++) put1com(*p++, server);
4757 snd_flush(server);
4758 x=get4com(server);
4759 if(x==-1){
4760 js_wnn_errorno_set= get4com(server);
4761 return(-1);
4762 }
4763 return(x);
4764 }
4765
4766 static int
access_host(server,host,enable,ule)4767 access_host(server, host, enable, ule)
4768 WNN_JSERVER_ID *server;
4769 char *host;
4770 int enable, ule;
4771 {
4772 struct hostent *hp;
4773 struct in_addr addr;
4774 host_address ha;
4775 char **l;
4776 int x;
4777
4778 if ((addr.s_addr = inet_addr(host)) != -1) {
4779 ha.address = (char *)&addr.s_addr;
4780 ha.address_len = sizeof(addr.s_addr);
4781 x = access_host_core(server, &ha, enable, ule);
4782 return(x);
4783 } else if ((hp = gethostbyname(host)) && hp->h_addrtype == AF_INET) {
4784 ha.address_len = sizeof(addr.s_addr);
4785 for (l = hp->h_addr_list; *l; l++) {
4786 ha.address = *l;
4787 if ((x = access_host_core(server, &ha, enable, ule)) == -1) {
4788 return(-1);
4789 }
4790 }
4791 return(0);
4792 } else {
4793 js_wnn_errorno_set = WNN_ACCESS_NO_HOST;
4794 return(-1);
4795 }
4796 }
4797
4798 int
js_access_add_host(server,host,ule)4799 js_access_add_host(server, host, ule)
4800 WNN_JSERVER_ID *server;
4801 char *host;
4802 int ule;
4803 {
4804 int x;
4805
4806 set_current_js(server);
4807 LockMutex(&(server_js_lock));
4808 x = access_host(server, host, 1, ule);
4809 UnlockMutex(&(server_js_lock));
4810 return(x);
4811 }
4812
4813 int
js_access_remove_host(server,host)4814 js_access_remove_host(server, host)
4815 WNN_JSERVER_ID *server;
4816 char *host;
4817 {
4818 int x;
4819
4820 set_current_js(server);
4821 LockMutex(&(server_js_lock));
4822 x = access_host(server, host, 0, 0);
4823 UnlockMutex(&(server_js_lock));
4824 return(x);
4825 }
4826
4827 static int
access_user_core(server,ha,user,enable)4828 access_user_core(server, ha, user, enable)
4829 WNN_JSERVER_ID *server;
4830 host_address *ha;
4831 char *user;
4832 int enable;
4833 {
4834 register int x;
4835 register char *p;
4836
4837 handler_of_jserver_dead(server);
4838 if (js_wnn_errorno_eql) return(-1);
4839 if (enable) {
4840 snd_server_head(server, JS_ACCESS_ADD_USER);
4841 } else {
4842 snd_server_head(server, JS_ACCESS_REMOVE_USER);
4843 }
4844 put4com(ha->address_len, server);
4845 p = ha->address;
4846 for (x = 0; x < ha->address_len; x++) put1com(*p++, server);
4847 putscom(user, server);
4848 snd_flush(server);
4849 x=get4com(server);
4850 if(x==-1){
4851 js_wnn_errorno_set= get4com(server);
4852 return(-1);
4853 }
4854 return(x);
4855 }
4856
4857 static int
access_user(server,host,user,enable)4858 access_user(server, host, user, enable)
4859 WNN_JSERVER_ID *server;
4860 char *host, *user;
4861 int enable;
4862 {
4863 struct hostent *hp;
4864 struct in_addr addr;
4865 host_address ha;
4866 char **l;
4867 int x;
4868
4869 if (!host || !*host) {
4870 ha.address = NULL;
4871 ha.address_len = 0;
4872 x = access_user_core(server, &ha, user, enable);
4873 return(x);
4874 } else if ((addr.s_addr = inet_addr(host)) != -1) {
4875 ha.address = (char *)&addr.s_addr;
4876 ha.address_len = sizeof(addr.s_addr);
4877 x = access_user_core(server, &ha, user, enable);
4878 return(x);
4879 } else if ((hp = gethostbyname(host)) && hp->h_addrtype == AF_INET) {
4880 ha.address_len = sizeof(addr.s_addr);
4881 for (l = hp->h_addr_list; *l; l++) {
4882 ha.address = *l;
4883 if ((x = access_user_core(server, &ha, user, enable)) == -1) {
4884 return(-1);
4885 }
4886 }
4887 return(0);
4888 } else {
4889 js_wnn_errorno_set = WNN_ACCESS_NO_USER;
4890 return(-1);
4891 }
4892 }
4893
4894 int
js_access_add_user(server,host,user)4895 js_access_add_user(server, host, user)
4896 WNN_JSERVER_ID *server;
4897 char *host, *user;
4898 {
4899 int x;
4900
4901 set_current_js(server);
4902 LockMutex(&(server_js_lock));
4903 x = access_user(server, host, user, 1);
4904 UnlockMutex(&(server_js_lock));
4905 return(x);
4906 }
4907
4908 int
js_access_remove_user(server,host,user)4909 js_access_remove_user(server, host, user)
4910 WNN_JSERVER_ID *server;
4911 char *host, *user;
4912 {
4913 int x;
4914
4915 set_current_js(server);
4916 LockMutex(&(server_js_lock));
4917 x = access_user(server, host, user, 0);
4918 UnlockMutex(&(server_js_lock));
4919 return(x);
4920 }
4921
4922 static int
access_control(server,enable)4923 access_control(server, enable)
4924 WNN_JSERVER_ID *server;
4925 int enable;
4926 {
4927 int x;
4928
4929 handler_of_jserver_dead(server);
4930 if (js_wnn_errorno_eql) return(-1);
4931 if (enable) {
4932 snd_server_head(server, JS_ACCESS_ENABLE);
4933 } else {
4934 snd_server_head(server, JS_ACCESS_DISABLE);
4935 }
4936 snd_flush(server);
4937 x=get4com(server);
4938 if(x==-1){
4939 js_wnn_errorno_set= get4com(server);
4940 return(-1);
4941 }
4942 return(x);
4943 }
4944
4945 int
js_access_enable(server)4946 js_access_enable(server)
4947 WNN_JSERVER_ID *server;
4948 {
4949 int x;
4950
4951 set_current_js(server);
4952 LockMutex(&(server_js_lock));
4953 x = access_control(server, 1);
4954 UnlockMutex(&(server_js_lock));
4955 return(x);
4956 }
4957
4958 int
js_access_disable(server)4959 js_access_disable(server)
4960 WNN_JSERVER_ID *server;
4961 {
4962 int x;
4963
4964 set_current_js(server);
4965 LockMutex(&(server_js_lock));
4966 x = access_control(server, 0);
4967 UnlockMutex(&(server_js_lock));
4968 return(x);
4969 }
4970
4971 static int
get_host_name_len(host_p)4972 get_host_name_len(host_p)
4973 host_address *host_p;
4974 {
4975 char *p;
4976 register struct hostent *hp;
4977 int user_len = 0;
4978 char address[32];
4979 char *inet_ntoa();
4980
4981 if ((p = strchr(host_p->address, ':'))) {
4982 user_len = strlen(p);
4983 }
4984
4985 bcopy((char *)host_p->address, address, host_p->address_len);
4986 if ((hp = gethostbyaddr (address, host_p->address_len, AF_INET))) {
4987 return(strlen(hp->h_name) + user_len);
4988 }
4989 if (!(p = inet_ntoa(*((struct in_addr *)(address))))) return(0);
4990 return(strlen(p) + user_len);
4991 }
4992
4993 static int
get_host_name(host_p,host)4994 get_host_name(host_p, host)
4995 host_address *host_p;
4996 char *host;
4997 {
4998 char *p, *user;
4999 register struct hostent *hp;
5000 int user_len = 0;
5001 char address[32];
5002 char *inet_ntoa();
5003
5004 if ((user = strchr(host_p->address, ':'))) {
5005 user_len = strlen(user);
5006 }
5007
5008 bcopy((char *)host_p->address, address, host_p->address_len);
5009 if ((hp = gethostbyaddr (address, host_p->address_len, AF_INET))) {
5010 strcpy(host, hp->h_name);
5011 if (user) strcat(host, user);
5012 return(strlen(host));
5013 }
5014 if (!(p = inet_ntoa(*((struct in_addr *)(address))))) return(0);
5015 strcpy(host, p);
5016 if (user) strcat(host, user);
5017 return(strlen(host));
5018 }
5019
5020 char **
js_access_get_info(server,enable,ret_num)5021 js_access_get_info(server, enable, ret_num)
5022 WNN_JSERVER_ID *server;
5023 int *enable;
5024 int *ret_num;
5025 {
5026 int i, j, host_num, except_num, total_num, bytes, total, error_flag;
5027 register char *p, **out, *save, **out_save;
5028 host_address *host_p;
5029 char dummy[1024];
5030
5031 *ret_num = -1;
5032 set_current_js(server);
5033 LockMutex(&(server_js_lock));
5034 handler_of_jserver_dead(server);
5035 if (js_wnn_errorno_eql) {
5036 UnlockMutex(&(server_js_lock));
5037 return(NULL);
5038 }
5039 snd_server_head(server, JS_ACCESS_GET_INFO);
5040 snd_flush(server);
5041 *enable = get4com(server);
5042 if(*enable == -1){
5043 js_wnn_errorno_set= get4com(server);
5044 UnlockMutex(&(server_js_lock));
5045 return((char **)NULL);
5046 }
5047 bytes = get4com(server);
5048 host_num = get4com(server);
5049 except_num = get4com(server);
5050 total_num = host_num + except_num;
5051 if (total_num == 0) {
5052 *ret_num = 0;
5053 UnlockMutex(&(server_js_lock));
5054 return((char **)NULL);
5055 }
5056 if (!(save = p = malloc((sizeof(host_address) * total_num) + bytes))) {
5057 for (i = 0; i < bytes; i++) get1com(server);
5058 js_wnn_errorno_set = WNN_MALLOC_ERR;
5059 return((char **)NULL);
5060 }
5061 host_p = (host_address *)p;
5062 p += sizeof(host_address) * total_num;
5063 error_flag = 0;
5064 for (i = 0; i < host_num; i++, host_p++) {
5065 host_p->address_len = get4com(server);
5066 if ((host_p->address_len >= bytes) || (bytes <= 0) || error_flag) {
5067 error_flag = 1;
5068 for (j = 0; j < host_p->address_len; j++) get1com(server);
5069 if (get4com(server))
5070 getscom(dummy, server, sizeof(dummy));
5071 } else {
5072 for (j = 0; j < host_p->address_len; j++) p[j] = get1com(server);
5073 host_p->address = p;
5074 p += host_p->address_len;
5075 bytes -= host_p->address_len;
5076 if (get4com(server)) {
5077 *p++ = ':';
5078 bytes--;
5079 getscom(p, server, bytes);
5080 if (bytes > 0) {
5081 p += strlen(p) + 1;
5082 bytes -= strlen(p) + 1;
5083 }
5084 } else {
5085 *p++ = '\0';
5086 bytes--;
5087 }
5088 }
5089 }
5090 for (i = 0; i < except_num; i++, host_p++) {
5091 if ((bytes <= 0) || error_flag) {
5092 error_flag = 1;
5093 getscom(dummy, server, sizeof(dummy));
5094 } else {
5095 host_p->address = p;
5096 *p++ = '@';
5097 bytes--;
5098 getscom(p, server, bytes);
5099 if (bytes > 0) {
5100 p += strlen(p) + 1;
5101 bytes -= strlen(p) + 1;
5102 host_p->address_len = strlen(host_p->address);
5103 }
5104 }
5105 }
5106 if (error_flag) {
5107 free((char *)save);
5108 js_wnn_errorno_set = WNN_SOME_ERROR;
5109 UnlockMutex(&(server_js_lock));
5110 return((char **)NULL);
5111 }
5112 for (host_p = (host_address *)save, total = 0, i = 0;
5113 i < total_num; i++, host_p++) {
5114 if (host_p->address_len > 0 && host_p->address[0] == '@')
5115 total += strlen(host_p->address); /* exceptional user name */
5116 else
5117 total += get_host_name_len(host_p);
5118 }
5119 if (!(p = malloc((sizeof(char *) * total_num) + total + total_num))) {
5120 free((char *)save);
5121 js_wnn_errorno_set = WNN_MALLOC_ERR;
5122 UnlockMutex(&(server_js_lock));
5123 return((char **)NULL);
5124 }
5125 out = out_save = (char **)p;
5126 p += (sizeof(char *) * total_num);
5127 for (host_p = (host_address *)save, i = 0; i < total_num; i++, host_p++) {
5128 *out++ = p;
5129 if (host_p->address_len > 0 && host_p->address[0] == '@') {
5130 strcpy(p, host_p->address) /* exceptional user name */;
5131 p += strlen(host_p->address) + 1;
5132 } else
5133 p += get_host_name(host_p, p) + 1;
5134 }
5135 free((char *)save);
5136 *ret_num = total_num;
5137 UnlockMutex(&(server_js_lock));
5138 return(out_save);
5139 }
5140
5141 /*:::DOC_START
5142 *
5143 * Function Name: js_is_loaded_temporary_dic
5144 * Description :
5145 * �ƥ�ݥ�꼭�Ķ��ˤ��뤫�ɤ�����Ĵ�٤�
5146 * Parameter :
5147 * env : (In) �Ķ��ؤΥݥ���
5148 *
5149 * Return value : 1==EXIST, 0==NO EXIST, -1==ERROR
5150 *
5151 * Author : Seiji KUWARI
5152 *
5153 * Revision history:
5154 *
5155 *:::DOC_END
5156 */
5157 int
js_is_loaded_temporary_dic(env)5158 js_is_loaded_temporary_dic(env)
5159 struct wnn_env *env;
5160 {
5161 register int x = 0;
5162
5163 if(!env) return(-1);
5164 set_current_js(env->js_id);
5165 LockMutex(&(env_js_lock));
5166 handler_of_jserver_dead_env(env);
5167 if(env_wnn_errorno_eql) {
5168 UnlockMutex(&(env_js_lock));
5169 return(-1);
5170 }
5171 snd_env_head(env,JS_IS_LOADED_TEMPORARY_DIC);
5172 snd_flush(env->js_id);
5173 x=get4com(env->js_id);
5174 if (x == -1) {
5175 wnn_errorno = get4com(env->js_id);
5176 }
5177 UnlockMutex(&(env_js_lock));
5178 return x;
5179 }
5180
5181 /*:::DOC_START
5182 *
5183 * Function Name: js_temporary_dic_delete
5184 * Description :
5185 * �ƥ�ݥ�꼭���Ķ����ɲä���
5186 * Parameter :
5187 * env : (In) �Ķ��ؤΥݥ���
5188 *
5189 * Return value : 0==SUCCESS, -1==ERROR
5190 *
5191 * Author : Seiji KUWARI
5192 *
5193 * Revision history:
5194 *
5195 *:::DOC_END
5196 */
5197 int
js_temporary_dic_add(env,rev)5198 js_temporary_dic_add(env, rev)
5199 struct wnn_env *env;
5200 int rev;
5201 {
5202 register int x = 0;
5203
5204 if(!env) return(-1);
5205 set_current_js(env->js_id);
5206 LockMutex(&(env_js_lock));
5207 handler_of_jserver_dead_env(env);
5208 if(env_wnn_errorno_eql) {
5209 UnlockMutex(&(env_js_lock));
5210 return(-1);
5211 }
5212 snd_env_head(env,JS_TEMPORARY_DIC_ADD);
5213 put4com(rev, env->js_id);
5214 snd_flush(env->js_id);
5215 x=get4com(env->js_id);
5216 if (x == -1) wnn_errorno = get4com(env->js_id);
5217 UnlockMutex(&(env_js_lock));
5218 return x;
5219 }
5220
5221 /*:::DOC_START
5222 *
5223 * Function Name: js_temporary_dic_delete
5224 * Description :
5225 * �ƥ�ݥ�꼭���Ķ�����������
5226 * Parameter :
5227 * env : (In) �Ķ��ؤΥݥ���
5228 *
5229 * Return value : 0==SUCCESS, -1==ERROR
5230 *
5231 * Author : Seiji KUWARI
5232 *
5233 * Revision history:
5234 *
5235 *:::DOC_END
5236 */
5237 int
js_temporary_dic_delete(env)5238 js_temporary_dic_delete(env)
5239 struct wnn_env *env;
5240 {
5241 register int x;
5242
5243 if(!env) return(-1);
5244 set_current_js(env->js_id);
5245 LockMutex(&(env_js_lock));
5246 handler_of_jserver_dead_env(env);
5247 if(env_wnn_errorno_eql) {
5248 UnlockMutex(&(env_js_lock));
5249 return(-1);
5250 }
5251 snd_env_head(env,JS_TEMPORARY_DIC_DELETE);
5252 snd_flush(env->js_id);
5253 x=get4com(env->js_id);
5254 if (x == -1) wnn_errorno = get4com(env->js_id);
5255 UnlockMutex(&(env_js_lock));
5256 return x;
5257 }
5258
5259 /*:::DOC_START
5260 *
5261 * Function Name: js_temporary_word_add
5262 * Description :
5263 * �ƥ�ݥ�꼭���ñ�����Ͽ���롣
5264 * Parameter :
5265 * env : (In) �Ķ��ؤΥݥ���
5266 * yomi : (In) �ɤ�
5267 * kanji : (In) ����
5268 * comment : (In) ������
5269 * hinsi : (In) �ʻ�
5270 * init_hindo :(In) �������
5271 *
5272 * Return value : 0==SUCCESS, -1==ERROR
5273 *
5274 * Author : Seiji KUWARI
5275 *
5276 * Revision history:
5277 *
5278 *:::DOC_END
5279 */
5280 int
js_temporary_word_add(env,yomi,kanji,comment,hinshi,init_hindo)5281 js_temporary_word_add(env, yomi, kanji, comment, hinshi, init_hindo)
5282 struct wnn_env *env;
5283 w_char *yomi,*kanji,*comment;
5284 int hinshi,init_hindo;
5285 {
5286 register int x;
5287
5288 if(!env) return(-1);
5289 set_current_js(env->js_id);
5290 LockMutex(&(env_js_lock));
5291 handler_of_jserver_dead_env(env);
5292 if(env_wnn_errorno_eql) {
5293 UnlockMutex(&(env_js_lock));
5294 return(-1);
5295 }
5296 snd_env_head(env,JS_TEMPORARY_WORD_ADD);
5297 putwscom(yomi, env->js_id);
5298 putwscom(kanji, env->js_id);
5299 putwscom(comment, env->js_id);
5300 put4com(hinshi, env->js_id);
5301 put4com(init_hindo, env->js_id);
5302 snd_flush(env->js_id);
5303 x=get4com(env->js_id);
5304 if (x == -1) wnn_errorno = get4com(env->js_id);
5305 UnlockMutex(&(env_js_lock));
5306 return x;
5307 }
5308
5309 /*:::DOC_START
5310 *
5311 * Function Name: js_autolearning_word_add
5312 * Description :
5313 * ��ư��Ͽ��ñ�����Ͽ���롣
5314 * Parameter :
5315 * env : (In) �Ķ��ؤΥݥ���
5316 * type : (In) �ؽ����륿����(��������/ʸ���ڤ�)
5317 * yomi : (In) �ɤ�
5318 * kanji : (In) ����
5319 * comment : (In) ������
5320 * hinsi : (In) �ʻ�
5321 * init_hindo :(In) �������
5322 *
5323 * Return value : 0==SUCCESS, -1==ERROR
5324 *
5325 * Author : Seiji KUWARI
5326 *
5327 * Revision history:
5328 *
5329 *:::DOC_END
5330 */
5331 int
js_autolearning_word_add(env,type,yomi,kanji,comment,hinshi,init_hindo)5332 js_autolearning_word_add(env, type, yomi, kanji, comment, hinshi, init_hindo)
5333 struct wnn_env *env;
5334 w_char *yomi,*kanji,*comment;
5335 int type, hinshi,init_hindo;
5336 {
5337 register int x;
5338
5339 if(!env) return(-1);
5340 set_current_js(env->js_id);
5341 LockMutex(&(env_js_lock));
5342 handler_of_jserver_dead_env(env);
5343 if(env_wnn_errorno_eql) {
5344 UnlockMutex(&(env_js_lock));
5345 return(-1);
5346 }
5347 snd_env_head(env,JS_AUTOLEARNING_WORD_ADD);
5348 put4com(type, env->js_id);
5349 putwscom(yomi, env->js_id);
5350 putwscom(kanji, env->js_id);
5351 putwscom(comment, env->js_id);
5352 put4com(hinshi, env->js_id);
5353 put4com(init_hindo, env->js_id);
5354 snd_flush(env->js_id);
5355 x=get4com(env->js_id);
5356 if (x == -1) wnn_errorno = get4com(env->js_id);
5357 UnlockMutex(&(env_js_lock));
5358 return x;
5359 }
5360
5361 /*:::DOC_START
5362 *
5363 * Function Name: js_set_autolearning_dic
5364 * Description :
5365 * ��ư��Ͽ�Ѥμ������Ͽ����
5366 * Parameter :
5367 * env : (In) �Ķ��ؤΥݥ���
5368 * type : (In) ����Υ�����(��������/ʸ���ڤ�)
5369 * dic_no : (In) �����ֹ�
5370 *
5371 * Return value : 0==SUCCESS, -1==ERROR
5372 *
5373 * Author : Seiji KUWARI
5374 *
5375 * Revision history:
5376 *
5377 *:::DOC_END
5378 */
5379 int
js_set_autolearning_dic(env,type,dic_no)5380 js_set_autolearning_dic(env, type, dic_no)
5381 register struct wnn_env *env;
5382 register int type, dic_no;
5383 {
5384 int x;
5385
5386 if(!env) return(-1);
5387 set_current_js(env->js_id);
5388 LockMutex(&(env_js_lock));
5389 handler_of_jserver_dead_env(env);
5390 if(env_wnn_errorno_eql) {
5391 UnlockMutex(&(env_js_lock));
5392 return(-1);
5393 }
5394 snd_env_head(env,JS_SET_AUTOLEARNING_DIC);
5395 put4com(type, env->js_id);
5396 put4com(dic_no, env->js_id);
5397 snd_flush(env->js_id);
5398 x=get4com(env->js_id);
5399 if (x == -1) wnn_errorno = get4com(env->js_id);
5400 UnlockMutex(&(env_js_lock));
5401 return(x);
5402 }
5403
5404 /*:::DOC_START
5405 *
5406 * Function Name: js_get_autolearning_dic
5407 * Description :
5408 * ��ư��Ͽ�Ѥμ����Ĵ�٤�
5409 * Parameter :
5410 * env : (In) �Ķ��ؤΥݥ���
5411 * type : (In) ����Υ�����(��������/ʸ���ڤ�)
5412 *
5413 * Return value : -1==ERROR, ELSE==������ֹ�
5414 *
5415 * Author : Seiji KUWARI
5416 *
5417 * Revision history:
5418 *
5419 *:::DOC_END
5420 */
5421 int
js_get_autolearning_dic(env,type)5422 js_get_autolearning_dic(env, type)
5423 register struct wnn_env *env;
5424 register int type;
5425 {
5426 register int x;
5427
5428 if(!env) return(-1);
5429 set_current_js(env->js_id);
5430 LockMutex(&(env_js_lock));
5431 handler_of_jserver_dead_env(env);
5432 if(env_wnn_errorno_eql) {
5433 UnlockMutex(&(env_js_lock));
5434 return(-1);
5435 }
5436 snd_env_head(env,JS_GET_AUTOLEARNING_DIC);
5437 put4com(type, env->js_id);
5438 snd_flush(env->js_id);
5439 x=get4com(env->js_id);
5440 if (x == -1) {
5441 UnlockMutex(&(env_js_lock));
5442 wnn_errorno = get4com(env->js_id);
5443 return -1;
5444 }
5445 x=get4com(env->js_id);
5446 UnlockMutex(&(env_js_lock));
5447 return(x);
5448 }
5449
5450
5451 /* For wnnoffline */
5452 #ifdef WNNOFFLINE
5453 int
js_lock(server)5454 js_lock(server)
5455 WNN_JSERVER_ID *server;
5456 {
5457 int x;
5458
5459 set_current_js(server);
5460 LockMutex(&(server_js_lock));
5461 handler_of_jserver_dead(server);
5462 if(js_wnn_errorno_eql) {
5463 UnlockMutex(&(server_js_lock));
5464 return(-1);
5465 }
5466 snd_server_head(server,JS_LOCK);
5467 snd_flush(server);
5468 if((x=get4com(server)) == -1) {
5469 js_wnn_errorno_set = get4com(server);
5470 }
5471 UnlockMutex(&(server_js_lock));
5472 return x;
5473 }
5474
5475 int
js_unlock(server)5476 js_unlock(server)
5477 WNN_JSERVER_ID *server;
5478 {
5479 int x;
5480
5481 set_current_js(server);
5482 LockMutex(&(server_js_lock));
5483 handler_of_jserver_dead(server);
5484 if(js_wnn_errorno_eql) {
5485 UnlockMutex(&(server_js_lock));
5486 return(-1);
5487 }
5488 snd_server_head(server,JS_UNLOCK);
5489 snd_flush(server);
5490 if((x=get4com(server)) == -1) {
5491 js_wnn_errorno_set = get4com(server);
5492 }
5493 UnlockMutex(&(server_js_lock));
5494 return x;
5495 }
5496 #endif /* WNNOFFLINE */
5497
5498
5499 /*:::DOC_START
5500 *
5501 * Function Name:
5502 * rcv_dai_sim, rcv_sho_x_sim, rcv_sho_kanji_sim, rcv_sho_sim
5503 * Description :
5504 * emulate rcv_dai etc. for local test
5505 * Parameter : same as emulated (omitted)
5506 *
5507 * Return value : same as emulated (omitted)
5508 *
5509 * Author : fujimori
5510 *
5511 * Revision history:
5512 * 20-Dec-94: initial release
5513 *
5514 *:::DOC_END
5515 */
5516
5517
5518
5519 /*:::DOC_START
5520 *
5521 * Function Name: js_ikeiji_with_data
5522 * Description :
5523 * �Ѵ��ѳƼ�ǡ�����ʣ����Ѵ����Ѵ��ʻ�ꥹ�ȡˤ�
5524 * ���ꤷ�ơ��۷��� �Ѵ�������Ԥʤ�
5525 * Parameter :
5526 * env : (In) �Ķ��ؤΥݥ���
5527 * fuku : (In) ʣ����Ѵ�
5528 * nhinsi : (In) �ʻ�ο�
5529 * hlist : (In) �ʻ�ꥹ��
5530 * henkan : (In) �Ѵ��Υ�����
5531 * yomi : (In) ��������
5532 * hinsi : (In) ������̤��ʻ�
5533 * fzk : (In) ��°��ξ���
5534 * vec : (In) ��³�ξ���
5535 * vec1 : (In) ��³�ξ��� 1
5536 * vec2 : (In) ��³�ξ��� 2
5537 * cur_bun : (In) ʸ��ξ���
5538 * yomi_orig : (In) �ɤ�
5539 * rb : (Out) ������
5540 *
5541 * Return value : ��ʸ��ο�
5542 *
5543 * Author : fujimori
5544 *
5545 * Revision history:
5546 * 20-Dec-94: initial release
5547 *
5548 *:::DOC_END
5549 */
5550 int
js_ikeiji_with_data(env,fuku,nhinsi,hlist,henkan,yomi,hinsi,fzk,vec,vec1,vec2,cur_bun,yomi_orig,rb)5551 js_ikeiji_with_data(env,fuku,nhinsi,hlist,henkan,yomi,hinsi,fzk,vec,vec1,vec2,
5552 cur_bun, yomi_orig,
5553 rb)
5554 struct wnn_env *env;
5555 int fuku, nhinsi, *hlist, henkan;
5556 w_char *yomi;
5557 int hinsi;
5558 w_char *fzk;
5559 int vec;
5560 int vec1;
5561 int vec2;
5562 WNN_BUN *cur_bun;
5563 w_char *yomi_orig;
5564 struct wnn_ret_buf *rb;
5565 {
5566 int x;
5567 int i, loop = abs(nhinsi);
5568
5569 int for_ret_status;
5570 int for_ret_status_bkwd;
5571
5572 for_ret_status = (cur_bun->dai_top)? WNN_NOT_CONNECT : WNN_CONNECT;
5573 /* where are WNN_SENTOU and WNN_GIJI gone to ? */
5574 for_ret_status_bkwd = (cur_bun->dai_end)? WNN_NOT_CONNECT_BK : WNN_CONNECT_BK;
5575
5576
5577 if(env==0) return(-1);
5578 set_current_js(env->js_id);
5579 LockMutex(&(env_js_lock));
5580 handler_of_jserver_dead_env(env);
5581 if(env_wnn_errorno_eql) {
5582 UnlockMutex(&(env_js_lock));
5583 return(-1);
5584 }
5585
5586
5587 snd_env_head(env,JS_HENKAN_IKEIJI);
5588 put4com(fuku, env->js_id); /* ʣ���ͥ�� */
5589 put4com(nhinsi, env->js_id); /* �Ѵ������ʻ�� */
5590 for(i = 0; i < loop; i++)
5591 put4com(hlist[i], env->js_id); /* �Ѵ������ʻ��ֹ� */
5592 put4com(henkan, env->js_id); /* �Ѵ����� */
5593 putwscom(yomi, env->js_id);
5594 put_fzk_vec(hinsi,fzk,vec,vec1, env->js_id);
5595 put4com(vec2, env->js_id);
5596 /* need fugokugo-len, hinsi, etc */
5597 put4com( (int) (cur_bun->yomilen - cur_bun->jirilen), env->js_id);
5598 put4com(cur_bun->hinsi, env->js_id);
5599
5600 /* more */
5601 put4com( cur_bun->hyoka, env->js_id);
5602 /* for ret_sho_hyoka in jserver */
5603 put4com( cur_bun->daihyoka, env->js_id);
5604 /* for ret_hyoka in jserver */
5605 put4com( for_ret_status /* (wnn_sho_bunsetsu*)->status */ , env->js_id);
5606 /* for ret_status in jserver */
5607 put4com( for_ret_status_bkwd /* (wnn_sho_bunsetsu*)->status_bkwd */ , env->js_id);
5608 /* for int ret_status_bkwd in jserver */
5609 put4com( cur_bun->kangovect, env->js_id);
5610 /* for ret_kangovect in jserver */
5611 /* �Ѵ��ɤ�ʸ������Ф��������� ����� ������ ���Ϥ� */
5612 putwscom(yomi_orig, env->js_id);
5613 /* for ret_yomi_orig[i] in jserver */
5614 put4com( cur_bun->jirilen, env->js_id);
5615 /* for ret_jirilen_orig in jserver */
5616 put4com( cur_bun->yomilen, env->js_id);
5617 /* for ret_yomilen_orig in jserver */
5618 put4com( cur_bun->kanjilen, env->js_id);
5619 /* for ret_kanjilen_orig in jserver */
5620 put4com( cur_bun->real_kanjilen, env->js_id);
5621 /* for ret_real_kanjilen_orig in jserver */
5622
5623 snd_flush(env->js_id);
5624
5625 switch(henkan) {
5626 case WNN_IKEIJI_DAI:
5627 x = rcv_dai(rb, env->js_id);
5628 break;
5629 default:
5630 x = get4com(env->js_id);
5631 env_wnn_errorno_set= get4com(env->js_id);
5632 }
5633 UnlockMutex(&(env_js_lock));
5634 return x;
5635 }
5636 /* end of js_ikeiji_with_data */
5637
5638
5639