1 /*
2  * $Id: jl.c,v 2.113.2.4 2000/09/01 09:31:20 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 Hi-level Library
142 */
143 
144 #if defined(__DragonFly__)
145 #include <stdlib.h>
146 #include <string.h>
147 #include <unistd.h>
148 #include <sys/stat.h>
149 #include <time.h>
150 #endif
151 
152 #include "commonhd.h"
153 #include "config.h"
154 #include <stdio.h>
155 #include <sys/types.h>
156 #ifdef SYSVR2
157 #   include <string.h>
158 #endif
159 #ifdef BSD42
160 #   include <strings.h>
161 #endif
162 #include <sys/file.h>
163 #include <ctype.h>
164 #include <pwd.h>
165 
166 #include "wnnerror.h"
167 #include "jd_sock.h"
168 #include "jslib.h"
169 #include "jllib.h"
170 #include "mt_jlib.h"
171 
172 #include "msg.h"
173 #include "serverdefs.h"
174 #include "wnn_string.h"
175 extern struct msg_cat *wnn_msg_cat;
176 
177 
178 #define MAXENVS WNN_MAX_ENV_OF_A_CLIENT
179 
180 #define MAXINCLUDE 10
181 
182 #define DEFAULT_BUN_LEN 3
183 
184 #define DEFAULT_ZENKOUHO_LEN 3
185 
186 #define DEFAULT_HEAP_LEN 3
187 
188 #define INCREMENT 2
189 
190 #define SHO 0
191 #define DAI 1
192 #define IKEIJI 2 /* ==WNN_IKEIJI */
193 
194 #define BUN 0
195 #define ZENKOUHO 1   /* Must not change!, they are assigned to two bit flag */
196 #define ZENKOUHO_DAI 3 /* DAI << 1 | ZENKOUHO */
197 #define ZENKOUHO_IKEIJI_DAI 5 /* IKEIJI << 1 | ZENKOUHO */
198 
199 #define	if_dead_disconnect(env) \
200 { \
201 	if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) { \
202 		jl_disconnect_if_server_dead_body((WNN_ENV_INT *)env);\
203 	} \
204 }
205 
206 #define	if_dead_disconnect_b(buf) \
207 { \
208 	if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD) { \
209        jl_disconnect_if_server_dead_body((WNN_ENV_INT *) \
210 					 ((WNN_BUF_MT *)buf)->orig.env);\
211 		((WNN_BUF_MT *)buf)->orig.env = NULL; \
212 	} \
213 }
214 
215 #define ARGS char
216 #define env_wnn_errorno_set wnn_errorno
217 #define env_wnn_errorno_eql wnn_errorno
218 #define env_wnn_errorno_copy(env) {}
219 #define buf_wnn_errorno_set wnn_errorno
220 #define buf_wnn_errorno_eql wnn_errorno
221 #define buf_wnn_errorno_copy(buf) {}
222 #define env_rb rb
223 #define buf_rb rb
224 
225 static struct wnn_ret_buf rb = {0, NULL};
226 static struct wnn_ret_buf dicrb = {0, NULL};
227 static struct wnn_ret_buf wordrb = {0, NULL};
228 
229 static int dumbhinsi;
230 static w_char *mae_fzk;
231 static int syuutanv;
232 static int syuutanv1;
233 
234 int confirm_state;
235 # ifdef KOREAN
236 static int kwnn_tankan = -1;
237 static int kwnn_hangul = -1;
238 static int kwnn_meisi = -1;
239 static int kwnn_fuzokugo = -1;
240 # endif /* KOREAN */
241 static int wnn_rendaku = -1;
242 static int wnn_settou = -1;
243 static int wnn_meisi = -1;
244 /* �ؽ�����ư�������ѳ��ꥫ������ */
245 static int kakutei_count = 0;
246 
247 #define jl_get_yomi_body(buf, bun_no, bun_no2, area) \
248                    wnn_get_area_body(buf, bun_no, bun_no2, area, WNN_YOMI)
249 
250 #define jl_get_kanji_body(buf, bun_no, bun_no2, area) \
251                    wnn_get_area_body(buf, bun_no, bun_no2, area, WNN_KANJI)
252 
253 #define CONFIRM  1
254 #define CONFIRM1 2
255 #define CREATE_WITHOUT_CONFIRM  3
256 #define NO_CREATE 4
257 
258 static void add_down_bnst();
259 static int alloc_heap();
260 static int call_error_handler();
261 static int change_ascii_to_int();
262 static int create_file();
263 static int dai_end();
264 static int expand_expr();
265 static int expand_expr_all();
266 static int file_discard();
267 static int file_exist();
268 static int file_read();
269 static int file_remove();
270 static int find_same_kouho();
271 static int find_same_kouho_dai();
272 static void free_bun();
273 static void free_down();
274 static void free_sho();
275 static void free_zenkouho();
276 static int get_c_jikouho();
277 static int get_c_jikouho_dai();
278 static int get_c_jikouho_from_zenkouho();
279 static int get_c_jikouho_from_zenkouho_dai();
280 static int get_pwd();
281 static int insert_dai();
282 static int insert_sho();
283 static int jl_set_env_wnnrc1_body();
284 static int jl_yomi_len_body();
285 static int make_dir1();
286 static int make_dir_rec1();
287 static void make_space_for();
288 static void make_space_for_bun();
289 static void make_space_for_zenkouho();
290 static void message_out();
291 static int ren_conv1(), ren_conv_sub();
292 static int nobi_conv_sub();
293 static void set_dai();
294 static void set_sho();
295 static int tan_conv1(), tan_conv_sub();
296 static int wnn_get_area_body();
297 static w_char *wnn_area();
298 static void _Sstrcpy();
299 static int jl_hinsi_number_e_body();
300 static int zen_conv_sho1();
301 static int zen_conv_dai1();
302 static int set_ima_off();
303 static int optimize_in_lib();
304 static int optimize_in_server();
305 
306 static int insert_dai_or_ikeiji();
307 static int jl_dic_save_all_e_body();
308 
309 /*
310  * Sub-routines to handle files, enviroments and connections.
311  */
312 
313 struct wnn_file_name_id {
314     struct wnn_file_name_id *next;
315     int id;
316     char name[1];
317 };
318 
319 struct wnn_jl_env{
320     WNN_JSERVER_ID *js;
321     struct wnn_env_int *env;
322     char env_n[WNN_ENVNAME_LEN];
323     char server_n[WNN_HOSTLEN];
324     char lang[32];
325     int ref_cnt;
326     struct wnn_file_name_id *file;
327 } envs[MAXENVS];
328 
329 static void
initialize_envs()330 initialize_envs()
331 {
332     int i;
333     for (i = 0; i < MAXENVS; i++) {
334         envs[i].ref_cnt = 0;
335     }
336 }
337 
338 /*
339  * File management routines.
340  */
341 
342 static
find_jl_env(env)343 struct wnn_jl_env *find_jl_env(env)
344 register struct wnn_env_int *env;
345 {
346     register int k;
347     for(k = 0 ; k < MAXENVS; k++){
348 	if(envs[k].env == env) return(envs + k);
349     }
350     return(NULL);
351 }
352 
353 
354 static
355 struct wnn_env_int *
find_env_of_same_js_id(js_id)356 find_env_of_same_js_id(js_id)
357 register WNN_JSERVER_ID *js_id;
358 {
359     register int k;
360 
361     for(k = 0 ; k < MAXENVS; k++){
362 	if (envs[k].js == NULL) continue;
363 	if (envs[k].js->sd == js_id->sd){
364 	    return(envs[k].env);
365 	}
366     }
367     return(NULL);
368 }
369 
370 static
371 WNN_JSERVER_ID *
find_same_env_server(env_n,server_n,lang)372 find_same_env_server(env_n, server_n, lang)
373 register char *env_n, *server_n, *lang;
374 {
375     register int k;
376 
377     if (server_n == NULL || lang == NULL) return(NULL);
378     for(k = 0 ; k < MAXENVS; k++){
379 	if(strncmp(envs[k].server_n, server_n, WNN_HOSTLEN - 1) == 0 &&
380 	   strcmp(envs[k].lang, lang) == 0){
381 	    return(envs[k].js);
382 	}
383     }
384     return(NULL);
385 }
386 
387 static int
find_same_server_from_id(js)388 find_same_server_from_id(js)
389 register WNN_JSERVER_ID *js;
390 {
391     register int k;
392     for(k = 0 ; k < MAXENVS; k++){
393 	if(envs[k].js == NULL) continue;
394 	if(envs[k].js->sd == js->sd) return(1);
395     }
396     return(0);
397 }
398 
399 
400 
401 static
402 struct wnn_env_int *
find_same_env(js,env_n,lang)403 find_same_env(js, env_n, lang)
404 register WNN_JSERVER_ID *js;
405 register char *env_n;
406 char *lang;
407 {
408     register int k;
409 
410     if (env_n == NULL || lang == NULL) return(NULL);
411     for(k = 0 ; k < MAXENVS; k++){
412 	if(envs[k].js == js && strcmp(envs[k].env_n, env_n) == 0
413 			    && strcmp(envs[k].lang, lang) == 0){
414 	    envs[k].ref_cnt++;
415 	    return(envs[k].env);
416 	}
417     }
418     return(NULL);
419 }
420 
421 static char *
env_name(env)422 env_name(env)
423 register struct wnn_env_int *env;
424 {
425     register int k;
426 
427     for(k = 0 ; k < MAXENVS; k++){
428 	if(envs[k].env == env){
429 	    return(envs[k].env_n);
430 	}
431     }
432     return(NULL);
433 }
434 
435 
436 static void
add_new_env(js,env,env_n,server_n,lang)437 add_new_env(js, env, env_n, server_n, lang)
438 register WNN_JSERVER_ID *js;
439 register struct wnn_env_int *env;
440 char *env_n, *server_n, *lang;
441 {
442     register int k;
443 
444     for(k = 0 ; k < MAXENVS; k++){
445 	if(envs[k].ref_cnt == 0){
446 	    strncpy(envs[k].server_n, server_n, WNN_HOSTLEN - 1);
447 	    envs[k].server_n[WNN_HOSTLEN - 1] = '\0';
448 	    strncpy(envs[k].env_n, env_n, WNN_ENVNAME_LEN - 1);
449 	    envs[k].env_n[WNN_ENVNAME_LEN - 1] = '\0';
450 	    strncpy(envs[k].lang, lang, sizeof(envs[k].lang) - 1);
451 	    envs[k].lang[sizeof(envs[k].lang) - 1] = 0;
452 	    envs[k].js = js;
453 	    envs[k].env = env;
454 	    envs[k].ref_cnt = 1;
455 	    envs[k].file = NULL;
456 	    break;
457 	}
458     }
459 }
460 
461 static int
delete_env(env)462 delete_env(env)
463 register struct wnn_env_int *env;
464 {
465     register int k;
466 
467     for(k = 0 ; k < MAXENVS; k++){
468 	if(envs[k].env == env){
469 	    if(--envs[k].ref_cnt == 0){
470 		strcpy(envs[k].server_n, "");
471 		strcpy(envs[k].env_n, "");
472 		strcpy(envs[k].lang, "");
473 		envs[k].js = NULL;
474 		envs[k].env = NULL;
475 		return(1);	/* Need To delete env */
476 	    }else{
477 		return(0);	/* Need not to delete env */
478 	    }
479 	}
480     }
481     return(-1);			/* This must not happen */
482 }
483 
484 /* Routines to manipulate files */
485 
486 static int
add_file_to_env(env,id,name)487 add_file_to_env(env, id, name)
488 struct wnn_env_int *env;
489 int id;
490 register char *name;
491 {
492     register struct wnn_file_name_id *f, *f1;
493     if((f = (struct wnn_file_name_id *)malloc(sizeof(struct wnn_file_name_id) +
494 					     strlen(name) + 1)) == NULL){
495 	env_wnn_errorno_set=WNN_ALLOC_FAIL;
496 	return(-1);
497     }
498     strcpy(f->name, name);
499     f->id = id;
500     LockMutex(&envs_lock);
501     f1 = find_jl_env(env)->file;
502     f->next = f1;
503     find_jl_env(env)->file = f;
504     UnlockMutex(&envs_lock);
505     return(0);
506 }
507 
508 static char *
find_file_name_from_id(env,id)509 find_file_name_from_id(env, id)
510 struct wnn_env_int *env;
511 register int id;
512 {
513     register struct wnn_file_name_id *f;
514     f = find_jl_env(env)->file;
515     for(;f; f = f->next){
516 	if(f->id == id){
517 	    return(f->name);
518 	}
519     }
520 /*    env_wnn_errorno_set=WNN_FILE_NOT_READ_FROM_CLIENT; */
521     return(NULL);
522 }
523 
524 static int
delete_file_from_env(env,id)525 delete_file_from_env(env, id)
526 struct wnn_env_int *env;
527 register int id;
528 {
529     struct wnn_file_name_id *f;
530     register struct wnn_file_name_id **prev;
531     register struct wnn_jl_env *jl_env_p;
532 
533     LockMutex(&envs_lock);
534     jl_env_p = find_jl_env(env);
535     if (!jl_env_p->file) {
536 	UnlockMutex(&envs_lock);
537 	return(0);
538     }
539     for(prev = &jl_env_p->file; (f = *prev); prev = &f->next){
540 	if (f->id == id) {
541 	    *prev = f->next;
542 	    free(f);
543 	    UnlockMutex(&envs_lock);
544 	    return(0);
545 	}
546     }
547     UnlockMutex(&envs_lock);
548     env_wnn_errorno_set=WNN_FILE_NOT_READ_FROM_CLIENT;
549     return(-1);
550 }
551 
552 /*
553  * Libraries which handle Connection To Jserver
554  */
555 
556 struct wnn_env *
jl_connect_lang(env_n,server_n,lang,wnnrc_n,error_handler,message_handler,timeout)557 jl_connect_lang(env_n, server_n, lang, wnnrc_n, error_handler, message_handler, timeout)
558 register char *env_n, *server_n, *wnnrc_n, *lang;
559 int  (*error_handler)(), (*message_handler)();
560 int timeout;
561 {
562     register WNN_JSERVER_ID	*js = NULL;
563     struct wnn_env_int *env;
564     int env_exist, cnt;
565     char p_lang[16];
566     register char *p, *l;
567     static int initialized_envs = 0;
568     extern char *getenv();
569 
570     DoOnce( &once, _InitMutexs );
571     LockMutex(&open_lock);
572     if (!initialized_envs) {
573         initialize_envs();
574         initialized_envs = 1;
575     }
576 
577     wnn_errorno = 0;
578     /* if lang not specified use $LANG */
579     if(!lang || !*lang){
580 	lang = getenv("LANG");
581     }
582     if (!lang || !*lang){
583 /* Sorry! Default is Japanese. :-) */
584 	strcpy(p_lang, "ja_JP");
585 
586     } else {
587 	/* Use only [language]_[teritorry] */
588 	for(p = p_lang, l = lang, cnt = 0;
589 	    (*l != '@') && (*l != '.') && (*l != 0) &&
590 	    (cnt < sizeof(p_lang) - 1)
591 	    ; p++, l++, cnt++)
592 	    *p = *l;
593 	*p = 0;
594     }
595 
596     LockMutex(&envs_lock);
597    /* To See serverdefs file when server_n is not specified. */
598     if(!server_n || !*server_n){
599 	/* find server machine name from table by lang */
600 	if ((server_n = wnn_get_machine_of_serverdefs(p_lang))) {
601 	    if((js = find_same_env_server(env_n, server_n, p_lang)) == NULL){
602 		if((js = js_open_lang(server_n, p_lang, timeout)) == NULL){
603 		    server_n = NULL;
604 		}
605 	    }
606 	}
607 	if (!server_n || !*server_n) {
608 	    server_n = "unix";
609 	}
610     }
611 
612     if (js == NULL) {
613 	if((js = find_same_env_server(env_n, server_n, p_lang)) == NULL){
614 	    if((js = js_open_lang(server_n, p_lang, timeout)) == NULL){
615 		UnlockMutex(&envs_lock);
616 		UnlockMutex(&open_lock);
617 		return(NULL);
618 	    }
619     /*	js_hinsi_list(js); */
620 	}
621     }
622     if ((env_exist = js_env_exist(js, env_n)) < 0) {
623 	UnlockMutex(&envs_lock);
624 	UnlockMutex(&open_lock);
625 	return (NULL);
626     }
627     if((env = find_same_env(js, env_n, p_lang)) == NULL){ /* Incr ref_cnt */
628 	if((env = (WNN_ENV_INT *)js_connect_lang(js, env_n, p_lang)) == NULL){
629 	    UnlockMutex(&envs_lock);
630 	    UnlockMutex(&open_lock);
631 	    return(NULL);
632 	}
633 	InitMutex(&(env->env_lock));
634 # ifdef KOREAN
635         if(!strncmp(lang, WNN_K_LANG, 5)) {
636             w_char tmp[8];
637             _Sstrcpy(tmp, "Ӥ�"); kwnn_tankan = jl_hinsi_number_e_body(env, tmp);
638             _Sstrcpy(tmp, "�ѱ�"); kwnn_hangul = jl_hinsi_number_e_body(env, tmp);
639             _Sstrcpy(tmp, "٣��"); kwnn_meisi = jl_hinsi_number_e_body(env, tmp);
640             _Sstrcpy(tmp, "ݾ����"); kwnn_fuzokugo = jl_hinsi_number_e_body(env, tmp);
641         }
642 # endif /* KOREAN */
643 	if(!strncmp(lang, WNN_J_LANG, 5)) {
644             w_char tmp[8];
645 	    _Sstrcpy(tmp, WNN_HINSI_RENDAKU);
646 	    wnn_rendaku = jl_hinsi_number_e_body(env, tmp);
647 	    _Sstrcpy(tmp, WNN_HINSI_SETTOUO);
648 	    wnn_settou = jl_hinsi_number_e_body(env, tmp);
649 	    _Sstrcpy(tmp, WNN_HINSI_MEISI);
650 	    wnn_meisi = jl_hinsi_number_e_body(env, tmp);
651 	}
652 	add_new_env(js, env, env_n, server_n, p_lang);
653     }
654     UnlockMutex(&envs_lock);
655     if(env_exist == 0 && wnnrc_n){
656 	jl_set_env_wnnrc(env, wnnrc_n, error_handler, message_handler);
657     } else {
658 	unsigned long mask = WNN_ENV_BUNSETSUGIRI_LEARN_MASK |
659 			     WNN_ENV_MUHENKAN_LEARN_MASK;
660 	struct wnn_henkan_env henv;
661 	if(wnnrc_n)
662 	    jl_set_env_wnnrc1_body(env, wnnrc_n, error_handler,
663 				   message_handler, 0, 1);
664 	if(js_get_henkan_env(env, &henv) == 0) {
665 	    env->orig.muhenkan_mode = henv.muhenkan_flag;
666 	    env->orig.bunsetsugiri_mode = henv.bunsetsugiri_flag;
667 	} else {
668 	    env->orig.muhenkan_mode = WNN_DIC_RDONLY;
669 	    env->orig.bunsetsugiri_mode = WNN_DIC_RDONLY;
670 	}
671     }
672     UnlockMutex(&open_lock);
673     return((struct wnn_env *)env);
674 }
675 
676 
677 static void
jl_disconnect_body(env)678 jl_disconnect_body(env)
679 register struct wnn_env_int *env;
680 {
681     int ret;
682 
683     env_wnn_errorno_set = 0;
684     LockMutex(&envs_lock);
685     if((ret = delete_env(env)) < 0){
686 	UnlockMutex(&envs_lock);
687 	return;
688     } else if (ret) {
689 	js_disconnect((WNN_ENV *)env);
690     }
691     if(!find_same_server_from_id(env->orig.js_id)){
692 	js_close(env->orig.js_id);
693 	env->orig.js_id = 0;
694     }
695     UnlockMutex(&envs_lock);
696 }
697 
698 void
jl_disconnect(env)699 jl_disconnect(env)
700 register struct wnn_env *env;
701 {
702     if(!env) return;
703     LockMutex(&ENV_LOCK(env));
704     jl_disconnect_body((WNN_ENV_INT *)env);
705     UnlockMutex(&ENV_LOCK(env));
706 }
707 
708 int
jl_isconnect_e(env)709 jl_isconnect_e(env)
710 register struct wnn_env *env;
711 {
712     if(!env) return(0);
713     LockMutex(&ENV_LOCK(env));
714     if (js_isconnect(env) == 0) {
715 	UnlockMutex(&ENV_LOCK(env));
716 	return(1);
717     } else {
718 	UnlockMutex(&ENV_LOCK(env));
719 	return (0);
720     }
721 }
722 
723 int
jl_isconnect(buf)724 jl_isconnect(buf)
725 register struct wnn_buf *buf;
726 {
727     int x;
728 
729     if(!buf) return(0);
730     LockMutex(&BUF_LOCK(buf));
731     x = jl_isconnect_e(buf->env);
732     UnlockMutex(&BUF_LOCK(buf));
733     return x;
734 }
735 
736 /* JSERVER �������� env �� disconnect ���Ʋ�� */
737 static void
jl_disconnect_if_server_dead_body(env)738 jl_disconnect_if_server_dead_body(env)
739 register struct wnn_env *env;
740 {
741     register struct wnn_env_int *same_env;
742     int ret;
743 
744     LockMutex(&envs_lock);
745     if((ret = delete_env((WNN_ENV_INT *)env)) < 0){
746 	UnlockMutex(&envs_lock);
747 	return;
748     } else if (ret) {
749 	js_disconnect(env);
750     }
751 
752     while ((same_env = find_env_of_same_js_id(env->js_id)) != 0) {
753 	if(delete_env(same_env)){
754 	    LockMutex(&(same_env->env_lock));
755 	    js_disconnect((WNN_ENV *)same_env);
756 	    UnlockMutex(&(same_env->env_lock));
757 	}
758     }
759     UnlockMutex(&envs_lock);
760 
761     js_close(env->js_id);
762 
763     /* jserver ��������Ǥ� js_id ���Ȥ���ؿ���¸�ߤ���Τǡ�
764        NULL �ݥ���������ϹԤ鷺��js_dead �ե饰�ˤ�� jserver ��
765        ���Ǥ��뤫�ɤ����Υ����å���Ԥ� */
766     /* env->js_id = 0; */
767 }
768 
769 
770 void
jl_disconnect_if_server_dead(env)771 jl_disconnect_if_server_dead(env)
772 register struct wnn_env *env;
773 {
774     if(!env) return;
775     LockMutex(&ENV_LOCK(env));
776     jl_disconnect_if_server_dead_body((WNN_ENV_INT *)env);
777     UnlockMutex(&ENV_LOCK(env));
778 }
779 
780 struct wnn_buf *
jl_open_lang(env_n,server_n,lang,wnnrc_n,error_handler,message_handler,timeout)781 jl_open_lang(env_n, server_n, lang, wnnrc_n, error_handler, message_handler, timeout)
782 char *env_n, *server_n, *wnnrc_n, *lang;
783 int  (*error_handler)(), (*message_handler)();
784 int timeout;
785 {
786     register int k, dmy;
787     register struct wnn_buf_mt *buf;
788     struct wnn_env *env;
789 
790     wnn_errorno = 0;
791     if(rb.size == 0) rb.buf = (char *)malloc((unsigned)(rb.size = 1024));
792 
793 #define ALLOC_SET(pter, type, size, size_var) \
794     ((pter) = ((type *)malloc((unsigned)(sizeof(type) * ((size_var) = (size))))))
795 
796     if(!ALLOC_SET(buf, struct wnn_buf_mt, 1, dmy)){
797 	wnn_errorno=WNN_ALLOC_FAIL;return NULL;
798     }
799 
800     buf->orig.bun_suu = 0;
801     buf->orig.zenkouho_suu = 0;
802     buf->orig.zenkouho_daip = 0;
803     buf->orig.c_zenkouho = -1;
804     buf->orig.zenkouho_bun = -1;
805     buf->orig.zenkouho_end_bun = -1;
806     buf->orig.free_heap = NULL;
807     buf->orig.heap = NULL;
808     buf->orig.zenkouho_dai_suu = 0;
809     buf->orig.env = NULL;
810     /*
811      * Hideyuki Kishiba (Sep. 20, 1994)
812      * ���ѣƣɴط���������ѹ�¤�Τ���������
813      */
814     buf->orig.fi_rb.size = buf->orig.fi_rb.num = 0;
815     buf->orig.fi_rb.fi_buf = NULL;
816     /* ľ�������������ν���� */
817     for(k = 0; k < WNN_PREV_BUN_SUU; k++) {
818 	buf->orig.prev_bun[k].dic_no = -2;
819 	buf->orig.prev_bun[k].real_kanjilen = 0;
820 	buf->orig.prev_bun[k].kouho[0] = 0;
821     }
822 
823     if(!ALLOC_SET(buf->orig.bun, WNN_BUN *, DEFAULT_BUN_LEN, buf->orig.msize_bun) ||
824        !ALLOC_SET(buf->orig.zenkouho_dai, int, DEFAULT_ZENKOUHO_LEN + 1, buf->orig.msize_zenkouho) ||
825        !ALLOC_SET(buf->orig.zenkouho, WNN_BUN *, DEFAULT_ZENKOUHO_LEN, buf->orig.msize_zenkouho) ||
826        !ALLOC_SET(buf->orig.down_bnst, WNN_BUN *, DEFAULT_BUN_LEN, buf->orig.msize_bun)
827        ){
828 	wnn_errorno=WNN_ALLOC_FAIL;return NULL;
829     }
830 
831     for(k = 0 ; k < DEFAULT_BUN_LEN ; k++){
832 	buf->orig.down_bnst[k] = NULL;
833     }
834 
835     if(alloc_heap(buf, DEFAULT_HEAP_LEN) == -1){
836 	return NULL;
837     }
838 
839     env = jl_connect_lang(env_n, server_n, lang, wnnrc_n, error_handler, message_handler, timeout);
840     buf->orig.env = env;
841     InitMutex(&BUF_LOCK(buf));
842 
843     return((struct wnn_buf *)buf);
844 }
845 
846 
847 static void
_Sstrcpy(ws,s)848 _Sstrcpy(ws, s)
849 w_char *ws;
850 unsigned char *s;
851 {
852     register int eesiz = -1;
853     register unsigned char x;
854     register w_char *ie;
855     register unsigned char *ee;
856     register int cs_id, non_limit = 1;
857     int _etc_cs[3];
858     int cs_mask[3];
859 
860 	_etc_cs[0] = 2;
861 	_etc_cs[1] = 1;
862 	_etc_cs[2] = 2;
863 	cs_mask[0] = 0x8080;
864 	cs_mask[1] = 0x0080;
865 	cs_mask[2] = 0x8000;
866     ie=ws;ee=s;
867 
868     for(;(non_limit?(*ee):(eesiz>0));){
869         x = *ee++;
870         if(x > 0x9f || x == 0x8e || x == 0x8f){
871             cs_id = ((x == 0x8e)? 1 : ((x == 0x8f)? 2: 0));
872             if (cs_id == 1 || cs_id == 2) x = *ee++;
873             if (_etc_cs[cs_id] <= 0) continue;
874             if (_etc_cs[cs_id] > 1) {
875                 *ie = (w_char)(x & 0x7f) << 8;
876                 x = *ee++;
877             } else {
878                 *ie = (w_char)0;
879             }
880             *ie |= (x & 0x7f);
881             *ie++ |= cs_mask[cs_id];
882             eesiz -= _etc_cs[cs_id] + 1;
883         }else{
884             *ie++ = x;
885             eesiz--;
886         }
887     }
888 
889     non_limit = ((char *)ie - (char *)ws) / sizeof(w_char);
890     ws[non_limit] = 0;
891 }
892 
893 static int
alloc_heap(buf,len)894 alloc_heap(buf, len)
895 struct wnn_buf_mt *buf;
896 register int len;
897 {
898     char **c;
899     register WNN_BUN *d;
900 
901     if((c =(char **)malloc((unsigned)(len * sizeof(WNN_BUN) + sizeof(char *)))) == NULL){
902 	    buf_wnn_errorno_set=WNN_ALLOC_FAIL;
903 	return(-1);
904     }
905 
906     *c = buf->orig.heap;
907     buf->orig.heap = (char *)c;
908     d = (WNN_BUN *)(c + 1);
909     for(--len; len > 0 ; len--, d++){
910 	d->free_next = d + 1;
911     }
912     d->free_next = buf->orig.free_heap;
913     buf->orig.free_heap = (WNN_BUN *)(c + 1);
914     return(0);
915 }
916 
917 void
jl_close(buf)918 jl_close(buf)
919 register struct wnn_buf *buf;
920 {
921     register char *c, *next;
922     struct wnn_buf_mt tmpbuf;
923 
924     if(buf == NULL) return;
925     tmpbuf = *(WNN_BUF_MT *)buf;
926     LockMutex(&(tmpbuf.buf_lock));
927     if(buf->env){
928 	LockMutex(&(envmt->env_lock));
929 	buf_wnn_errorno_set = 0;
930 	jl_disconnect_body((WNN_ENV_INT *)buf->env);
931 	UnlockMutex(&(envmt->env_lock));
932 	buf->env = 0;
933     }
934 
935     if(buf->bun) free((char *)buf->bun);
936     if(buf->zenkouho) free((char *)buf->zenkouho);
937     if(buf->zenkouho_dai) free((char *)buf->zenkouho_dai);
938     if(buf->down_bnst) free((char *)buf->down_bnst);
939     for(c = buf->heap; c; c = next) {
940 	next = *(char **)c;
941 	free(c);
942     }
943     free((char *)buf);
944     UnlockMutex(&(tmpbuf.buf_lock));
945 }
946 
947 /*
948  * Conversion Libraries
949  */
950 
951 /*:::DOC_START
952  *
953  *    Function Name: jl_ren_conv
954  *    Description  : Ϣʸ���Ѵ���Ԥ�
955  *    Parameter    :
956  *         buf :      (InOut) �Хåե��ؤΥݥ���
957  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
958  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
959  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
960  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
961  *
962  *    Return value : -1==ERROR, else �Ѵ�ʸ���
963  *
964  *    Author      :  Hideyuki Kishiba
965  *
966  *    Revision history:
967  *	16-May-96: �߾�:  ���Ѻѣƣɴط��ǡ���������
968  *
969  *:::DOC_END
970  */
971 int
jl_ren_conv(buf,yomi,bun_no,bun_no2,use_maep)972 jl_ren_conv(buf, yomi, bun_no, bun_no2, use_maep)
973 register struct wnn_buf *buf;
974 register w_char *yomi;
975 int bun_no, bun_no2;
976 int use_maep;
977 {
978     int x;
979 
980     if(!buf) return(-1);
981     LockMutex(&BUF_LOCK(buf));
982     buf_wnn_errorno_set = 0;
983 
984     /* ���Ѻѣƣɴط��ǡ������������롣 05/16/96  H.Kishiba */
985     buf->fi_rb.num = 0;
986 
987     if(bun_no < 0) {
988 	UnlockMutex(&BUF_LOCK(buf));
989 	return(-1);
990     }
991 
992     x = ren_conv_sub((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
993 		     0, 0, NULL, 0);
994     UnlockMutex(&BUF_LOCK(buf));
995     return x;
996 } /* End of jl_ren_conv */
997 
998 /*:::DOC_START
999  *
1000  *    Function Name: jl_ren_conv_with_hinsi_name
1001  *    Description  : �Ѵ��˻��Ѥ����ʻ����ꤷ��Ϣʸ���Ѵ���Ԥ�
1002  *    Parameter    :
1003  *         buf :      (InOut) �Хåե��ؤΥݥ���
1004  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1005  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1006  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1007  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1008  *	   nhinsi :   (In) �ʻ�����Ѵ����λ����ʻ��
1009  *         hlist :    (In) �ʻ�����Ѵ����λ����ʻ�̾����ؤΥݥ���
1010  *
1011  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1012  *
1013  *    Author      :  Hideyuki Kishiba
1014  *
1015  *    Revision history:
1016  *	16-May-96: �߾�:  ���Ѻѣƣɴط��ǡ���������
1017  *
1018  *:::DOC_END
1019  */
1020 int
jl_ren_conv_with_hinsi_name(buf,yomi,bun_no,bun_no2,use_maep,nhinsi,hname)1021 jl_ren_conv_with_hinsi_name(buf, yomi, bun_no, bun_no2, use_maep, nhinsi, hname)
1022 register struct wnn_buf *buf;
1023 register w_char *yomi;
1024 int bun_no, bun_no2;
1025 int use_maep, nhinsi;
1026 char **hname;
1027 {
1028     int x, i, hsize, *hno = NULL;
1029     w_char tmp[64];
1030 
1031     if(!buf) return(-1);
1032     LockMutex(&BUF_LOCK(buf));
1033     buf_wnn_errorno_set = 0;
1034 
1035     /* ���Ѻѣƣɴط��ǡ������������롣 05/16/96  H.Kishiba */
1036     buf->fi_rb.num = 0;
1037 
1038     if(bun_no < 0) {
1039         UnlockMutex(&BUF_LOCK(buf));
1040         return(-1);
1041     }
1042     if(nhinsi) {
1043         hsize = abs(nhinsi);
1044         hno = (int *)malloc(hsize * sizeof(int));
1045         for(i = 0; i < hsize; i++) {
1046             _Sstrcpy(tmp, hname[i]);
1047             if((hno[i] = jl_hinsi_number_e(buf->env, tmp)) == -1) {
1048                 free((char *)hno);
1049                 UnlockMutex(&BUF_LOCK(buf));
1050                 return(-1);
1051             }
1052         }
1053     }
1054 
1055     x = ren_conv_sub((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
1056 		     0, nhinsi, hno, 0);
1057     if(nhinsi) free((char *)hno);
1058     UnlockMutex(&BUF_LOCK(buf));
1059     return x;
1060 } /* End of jl_ren_conv_with_hinsi_name */
1061 
1062 /*:::DOC_START
1063  *
1064  *    Function Name: jl_fi_ren_conv
1065  *    Description  : Ϣʸ��ƣ��Ѵ���Ԥ�
1066  *    Parameter    :
1067  *         buf :      (InOut) �Хåե��ؤΥݥ���
1068  *	   yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1069  *	   bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1070  *	   bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1071  * 	   use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1072  *
1073  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1074  *
1075  *    Author      :  Hideyuki Kishiba
1076  *
1077  *    Revision history:
1078  *	16-May-96: �߾�:  ���Ѻѣƣɴط��ǡ���������
1079  *
1080  *:::DOC_END
1081  */
1082 int
jl_fi_ren_conv(buf,yomi,bun_no,bun_no2,use_maep)1083 jl_fi_ren_conv(buf, yomi, bun_no, bun_no2, use_maep)
1084 register struct wnn_buf *buf;
1085 register w_char *yomi;
1086 int bun_no, bun_no2;
1087 int use_maep;
1088 {
1089     int x;
1090 
1091     if(!buf) return(-1);
1092     LockMutex(&BUF_LOCK(buf));
1093     buf_wnn_errorno_set = 0;
1094 
1095     /* ���Ѻѣƣɴط��ǡ������������롣 05/16/96  H.Kishiba */
1096     buf->fi_rb.num = 0;
1097 
1098     if(bun_no < 0) {
1099         UnlockMutex(&BUF_LOCK(buf));
1100         return(-1);
1101     }
1102 
1103     x = ren_conv_sub((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
1104 		     0, 0, NULL, 1);
1105     UnlockMutex(&BUF_LOCK(buf));
1106     return x;
1107 } /* End of jl_fi_ren_conv */
1108 
1109 /*:::DOC_START
1110  *
1111  *    Function Name: ren_conv_sub
1112  *    Description  : Ϣʸ���Ѵ��Υ��֥롼����ؿ����Σ�
1113  *    Parameter    :
1114  *         buf :      (InOut) �Хåե��ؤΥݥ���
1115  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1116  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1117  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1118  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1119  *	   fuku :     (In) ʣ���ͥ���Ѵ��ե饰
1120  *	   nhinsi :   (In) �ʻ�����Ѵ����λ����ʻ��
1121  * 	   hlist :    (In) �ʻ�����Ѵ����λ����ʻ��ֹ�����ؤΥݥ���
1122  * 	   fi_flag :  (In) ���Ѥ����ƣɴط������ʼ������ʤ���
1123  *			   �������˥ե饰
1124  *
1125  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1126  *
1127  *    Author      :  Hideyuki Kishiba
1128  *
1129  *    Revision history:
1130  *
1131  *:::DOC_END
1132  */
1133 static int
ren_conv_sub(buf,yomi,bun_no,bun_no2,use_maep,fuku,nhinsi,hlist,fi_flag)1134 ren_conv_sub(buf, yomi, bun_no, bun_no2, use_maep, fuku, nhinsi, hlist, fi_flag)
1135 register struct wnn_buf *buf;
1136 w_char *yomi;
1137 register int bun_no, bun_no2;
1138 int use_maep, fuku, nhinsi, *hlist, fi_flag;
1139 {
1140     int x;
1141 
1142     if(bun_no2 >= buf->bun_suu || bun_no2 < 0) bun_no2 = buf->bun_suu;
1143     free_down(buf, bun_no, bun_no2);
1144     x = ren_conv1((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
1145 		  fuku, nhinsi, hlist, fi_flag);
1146     return x;
1147 } /* End of ren_conv_sub */
1148 
1149 /*:::DOC_START
1150  *
1151  *    Function Name: ren_conv1
1152  *    Description  : Ϣʸ���Ѵ��Υ��֥롼����ؿ����Σ�
1153  *    Parameter    :
1154  *         buf :      (InOut) �Хåե��ؤΥݥ���
1155  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1156  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1157  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1158  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1159  *         fuku :     (In) ʣ���ͥ���Ѵ��ե饰
1160  *         nhinsi :   (In) �ʻ�����Ѵ����λ����ʻ��
1161  *         hlist :    (In) �ʻ�����Ѵ����λ����ʻ��ֹ�����ؤΥݥ���
1162  *         fi_flag :  (In) ���Ѥ����ƣɴط������ʼ������ʤ���
1163  *                         �������˥ե饰
1164  *
1165  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1166  *
1167  *    Author      :  Hideyuki Kishiba
1168  *
1169  *    Revision history:
1170  *
1171  *:::DOC_END
1172  */
1173 static int
ren_conv1(buf,yomi,bun_no,bun_no2,use_maep,fuku,nhinsi,hlist,fi_flag)1174 ren_conv1(buf, yomi, bun_no, bun_no2, use_maep, fuku, nhinsi, hlist, fi_flag)
1175 register struct wnn_buf_mt *buf;
1176 w_char *yomi;
1177 register int bun_no, bun_no2;
1178 int use_maep, fuku, nhinsi, *hlist, fi_flag;
1179 {
1180     int dcnt;
1181     struct wnn_dai_bunsetsu *dp;
1182     int size;
1183     w_char yomi1[LENGTHBUNSETSU];
1184 
1185     if (yomi == NULL || *yomi == (w_char)0) return(0);
1186     if(bun_no2 >= buf->orig.bun_suu || bun_no2 < 0)
1187         bun_no2 = buf->orig.bun_suu;
1188 
1189     if (use_maep & WNN_USE_MAE && bun_no > 0) {
1190 	dumbhinsi = buf->orig.bun[bun_no - 1]->hinsi;
1191 	jl_get_yomi_body(buf, bun_no - 1, bun_no, yomi1);
1192 	mae_fzk = yomi1 + buf->orig.bun[bun_no - 1]->jirilen;
1193     } else {
1194 	dumbhinsi = WNN_BUN_SENTOU;
1195 	mae_fzk = (w_char *)0;
1196     }
1197     if(use_maep & WNN_USE_ATO && bun_no2 < buf->orig.bun_suu){
1198 	syuutanv = buf->orig.bun[bun_no2]->kangovect;
1199 	syuutanv1 = WNN_VECT_KANREN;
1200     }else{
1201 	syuutanv = WNN_VECT_KANREN;
1202 	syuutanv1 = WNN_VECT_NO;
1203 	if(bun_no2 < buf->orig.bun_suu){
1204 	    buf->orig.bun[bun_no2]->dai_top = 1;
1205 	}
1206     }
1207     if(!(buf->orig.env)) return(-1);
1208     LockMutex(&(envmt->env_lock));
1209     if(fuku == 0 && nhinsi == 0) {
1210 	if(fi_flag == 0) {
1211 	    /* Ϣʸ���Ѵ� */
1212 	    if((dcnt = js_kanren(buf->orig.env, yomi, dumbhinsi, mae_fzk,
1213 				 syuutanv, syuutanv1, WNN_VECT_BUNSETSU,
1214 				 &buf_rb)) < 0){
1215 		buf_wnn_errorno_copy(buf);
1216 		if_dead_disconnect_b(buf);
1217 		UnlockMutex(&(envmt->env_lock));
1218 		return(-1);
1219 	    }
1220 	} else {
1221 	    /* Ϣʸ��ƣ��Ѵ� */
1222 	    if((dcnt = js_fi_kanren(buf->orig.env, yomi, dumbhinsi, mae_fzk,
1223 				    syuutanv, syuutanv1, WNN_VECT_BUNSETSU,
1224 				    buf->orig.prev_bun, &buf_rb, &(buf->orig.fi_rb))) < 0){
1225                 buf_wnn_errorno_copy(buf);
1226                 if_dead_disconnect_b(buf);
1227                 UnlockMutex(&(envmt->env_lock));
1228                 return(-1);
1229             }
1230 	}
1231     } else {
1232 	/* �Ѵ��Ķ�����Ϣʸ���Ѵ� */
1233 	if((dcnt = js_henkan_with_data(buf->orig.env, fuku, nhinsi, hlist,
1234 				       WNN_KANREN, yomi, dumbhinsi, mae_fzk,
1235 				       syuutanv, syuutanv1, WNN_VECT_BUNSETSU, &buf_rb)) < 0) {
1236 	    buf_wnn_errorno_copy(buf);
1237             if_dead_disconnect_b(buf);
1238             UnlockMutex(&(envmt->env_lock));
1239             return(-1);
1240         }
1241     }
1242 
1243     dp = (struct wnn_dai_bunsetsu *)buf_rb.buf;
1244 
1245     free_bun(buf, bun_no, bun_no2);
1246 
1247     if(use_maep & WNN_USE_ATO && bun_no2 < buf->orig.bun_suu){
1248 	buf->orig.bun[bun_no2]->dai_top =
1249 	    (dp[dcnt-1].sbn[dp[dcnt-1].sbncnt-1].status_bkwd == WNN_CONNECT_BK)? 0:1;
1250     }
1251 
1252     size = insert_dai(buf, BUN, bun_no, bun_no2, dp, dcnt, 0, fuku, nhinsi, hlist);
1253     if(buf->orig.zenkouho_end_bun > bun_no && buf->orig.zenkouho_bun < bun_no2){
1254 	free_zenkouho(buf);
1255     }else if(buf->orig.zenkouho_bun >= bun_no2){
1256 	buf->orig.zenkouho_bun += size - bun_no2;
1257 	buf->orig.zenkouho_end_bun += size - bun_no2;
1258 
1259     }
1260     UnlockMutex(&(envmt->env_lock));
1261     return(buf->orig.bun_suu);
1262 } /* End of ren_conv1 */
1263 
1264 /*:::DOC_START
1265  *
1266  *    Function Name: jl_tan_conv
1267  *    Description  : ñʸ���Ѵ���Ԥ�
1268  *    Parameter    :
1269  *         buf :      (InOut) �Хåե��ؤΥݥ���
1270  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1271  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1272  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1273  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1274  *         ich_shop : (In) �ʾ�ʸ�᡿��ʸ����Ѵ��ե饰
1275  *
1276  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1277  *
1278  *    Author      :  Hideyuki Kishiba
1279  *
1280  *    Revision history:
1281  *	16-May-96: �߾�:  ���Ѻѣƣɴط��ǡ���������
1282  *
1283  *:::DOC_END
1284  */
1285 int
jl_tan_conv(buf,yomi,bun_no,bun_no2,use_maep,ich_shop)1286 jl_tan_conv(buf, yomi, bun_no, bun_no2, use_maep, ich_shop)
1287 register struct wnn_buf *buf;
1288 w_char *yomi;
1289 register int bun_no, bun_no2;
1290 int use_maep, ich_shop;
1291 {
1292     int x;
1293 
1294     if(!buf) return(-1);
1295     LockMutex(&BUF_LOCK(buf));
1296     buf_wnn_errorno_set = 0;
1297 
1298     /* ���Ѻѣƣɴط��ǡ������������롣 05/16/96  H.Kishiba */
1299     buf->fi_rb.num = 0;
1300 
1301     if(bun_no < 0) {
1302 	UnlockMutex(&BUF_LOCK(buf));
1303 	return(-1);
1304     }
1305 
1306     if(tan_conv_sub((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
1307 		    ich_shop, 0, 0, NULL) == -1) {
1308 	UnlockMutex(&BUF_LOCK(buf));
1309 	return(-1);
1310     }
1311     x = buf->bun_suu;
1312     UnlockMutex(&BUF_LOCK(buf));
1313     return x;
1314 } /* End of jl_tan_conv */
1315 
1316 /*:::DOC_START
1317  *
1318  *    Function Name: jl_tan_conv_hinsi_flag
1319  *    Description  : �Ѵ��˻��Ѥ����ʻ����ꤷ��ñʸ���Ѵ���Ԥ�
1320  *    Parameter    :
1321  *         buf :      (InOut) �Хåե��ؤΥݥ���
1322  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1323  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1324  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1325  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1326  *         ich_shop : (In) �ʾ�ʸ�᡿��ʸ����Ѵ��ե饰
1327  *	   hinsi_op : (In) �ʻ�����Ѵ����λ����ʻ�ե饰
1328  *
1329  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1330  *
1331  *    Author      :  Hideyuki Kishiba
1332  *
1333  *    Revision history:
1334  *	16-May-96: �߾�:  ���Ѻѣƣɴط��ǡ���������
1335  *
1336  *:::DOC_END
1337  */
1338 int
jl_tan_conv_hinsi_flag(buf,yomi,bun_no,bun_no2,use_maep,ich_shop,hinsi_op)1339 jl_tan_conv_hinsi_flag(buf, yomi, bun_no, bun_no2, use_maep, ich_shop, hinsi_op)
1340 register struct wnn_buf *buf;
1341 w_char *yomi;
1342 register int bun_no, bun_no2;
1343 int use_maep, ich_shop, hinsi_op;
1344 {
1345     int x, hno;
1346     w_char tmp[64];
1347 
1348     if(!buf) return(-1);
1349     LockMutex(&BUF_LOCK(buf));
1350     buf_wnn_errorno_set = 0;
1351 
1352     /* ���Ѻѣƣɴط��ǡ������������롣 05/16/96  H.Kishiba */
1353     buf->fi_rb.num = 0;
1354 
1355     if(bun_no < 0) {
1356         UnlockMutex(&BUF_LOCK(buf));
1357         return(-1);
1358     }
1359     if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5)) {
1360 	UnlockMutex(&BUF_LOCK(buf));
1361 	return(-1);
1362     }
1363     if(hinsi_op == WNN_ZIP)
1364         _Sstrcpy(tmp, WNN_HINSI_ZIPCODE);
1365     else if(hinsi_op == WNN_TEL)
1366         _Sstrcpy(tmp, WNN_HINSI_TELNO);
1367     else if(hinsi_op == WNN_TANKAN)
1368         _Sstrcpy(tmp, WNN_HINSI_TANKAN);
1369     else {
1370 	UnlockMutex(&BUF_LOCK(buf));
1371         return(-1);
1372     }
1373     if((hno = jl_hinsi_number_e(buf->env, tmp)) == -1) {
1374 	UnlockMutex(&BUF_LOCK(buf));
1375 	return(-1);
1376     }
1377 
1378     if(tan_conv_sub((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
1379 		    ich_shop, 0, 1, &hno) == -1) {
1380         UnlockMutex(&BUF_LOCK(buf));
1381         return(-1);
1382     }
1383     x = buf->bun_suu;
1384     UnlockMutex(&BUF_LOCK(buf));
1385     return x;
1386 } /* jl_tan_conv_hinsi_flag */
1387 
1388 /*:::DOC_START
1389  *
1390  *    Function Name: jl_tan_conv_with_hinsi_name
1391  *    Description  : �Ѵ��˻��Ѥ����ʻ����ꤷ��ñʸ���Ѵ���Ԥ�
1392  *    Parameter    :
1393  *         buf :      (InOut) �Хåե��ؤΥݥ���
1394  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1395  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1396  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1397  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1398  *         ich_shop : (In) �ʾ�ʸ�᡿��ʸ����Ѵ��ե饰
1399  *         nhinsi :   (In) �ʻ�����Ѵ����λ����ʻ��
1400  *         hlist :    (In) �ʻ�����Ѵ����λ����ʻ�̾����ؤΥݥ���
1401  *
1402  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1403  *
1404  *    Author      :  Hideyuki Kishiba
1405  *
1406  *    Revision history:
1407  *	16-May-96: �߾�:  ���Ѻѣƣɴط��ǡ���������
1408  *
1409  *:::DOC_END
1410  */
1411 int
jl_tan_conv_with_hinsi_name(buf,yomi,bun_no,bun_no2,use_maep,ich_shop,nhinsi,hname)1412 jl_tan_conv_with_hinsi_name(buf, yomi, bun_no, bun_no2, use_maep, ich_shop, nhinsi, hname)
1413 register struct wnn_buf *buf;
1414 w_char *yomi;
1415 register int bun_no, bun_no2;
1416 int use_maep, ich_shop, nhinsi;
1417 char **hname;
1418 {
1419     int i, x, hsize, *hno = NULL;
1420     w_char tmp[64];
1421 
1422     if(!buf) return(-1);
1423     LockMutex(&BUF_LOCK(buf));
1424     buf_wnn_errorno_set = 0;
1425 
1426     /* ���Ѻѣƣɴط��ǡ������������롣 05/16/96  H.Kishiba */
1427     buf->fi_rb.num = 0;
1428 
1429     if(bun_no < 0) {
1430         UnlockMutex(&BUF_LOCK(buf));
1431         return(-1);
1432     }
1433 /*    if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5) || nhinsi == 0) {
1434 	UnlockMutex(&BUF_LOCK(buf));
1435 	return(-1);
1436     } */
1437     if(nhinsi) {
1438 	hsize = abs(nhinsi);
1439 	hno = (int *)malloc(hsize * sizeof(int));
1440 	for(i = 0; i < hsize; i++) {
1441 	    _Sstrcpy(tmp, hname[i]);
1442 	    if((hno[i] = jl_hinsi_number_e(buf->env, tmp)) == -1) {
1443 		free((char *)hno);
1444 		UnlockMutex(&BUF_LOCK(buf));
1445 		return(-1);
1446 	    }
1447 	}
1448     }
1449 
1450     if(tan_conv_sub((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
1451 		    ich_shop, 0, nhinsi, hno) == -1) {
1452 	if(nhinsi) free((char *)hno);
1453         UnlockMutex(&BUF_LOCK(buf));
1454         return(-1);
1455     }
1456     if(nhinsi) free((char *)hno);
1457     x = buf->bun_suu;
1458     UnlockMutex(&BUF_LOCK(buf));
1459     return x;
1460 } /* jl_tan_conv_with_hinsi_name */
1461 
1462 /*:::DOC_START
1463  *
1464  *    Function Name: tan_conv_sub
1465  *    Description  : ñʸ���Ѵ��Υ��֥롼����ؿ����Σ�
1466  *    Parameter    :
1467  *         buf :      (InOut) �Хåե��ؤΥݥ���
1468  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1469  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1470  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1471  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1472  *         ich_shop : (In) �ʾ�ʸ�᡿��ʸ����Ѵ��ե饰
1473  *         fuku :     (In) ʣ���ͥ���Ѵ��ե饰
1474  *         nhinsi :   (In) �ʻ�����Ѵ����λ����ʻ��
1475  *         hlist :    (In) �ʻ�����Ѵ����λ����ʻ��ֹ�����ؤΥݥ���
1476  *
1477  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1478  *
1479  *    Author      :  Hideyuki Kishiba
1480  *
1481  *    Revision history:
1482  *
1483  *:::DOC_END
1484  */
1485 static int
tan_conv_sub(buf,yomi,bun_no,bun_no2,use_maep,ich_shop,fuku,nhinsi,hlist)1486 tan_conv_sub(buf, yomi, bun_no, bun_no2, use_maep, ich_shop, fuku, nhinsi, hlist)
1487 register struct wnn_buf *buf;
1488 w_char *yomi;
1489 register int bun_no, bun_no2;
1490 int use_maep, ich_shop, fuku, nhinsi, *hlist;
1491 {
1492     int x;
1493 
1494     if(bun_no2 >= buf->bun_suu || bun_no2 < 0) bun_no2 = buf->bun_suu;
1495     free_down(buf, bun_no, bun_no2);
1496     x = tan_conv1((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2, use_maep,
1497 		  ich_shop, fuku, nhinsi, hlist);
1498     return x;
1499 } /* End of tan_conv_sub */
1500 
1501 /*:::DOC_START
1502  *
1503  *    Function Name: tan_conv1
1504  *    Description  : ñʸ���Ѵ��Υ��֥롼����ؿ����Σ�
1505  *    Parameter    :
1506  *         buf :      (InOut) �Хåե��ؤΥݥ���
1507  *         yomi :     (In) �Ѵ��ɤ�ʸ����ؤΥݥ���
1508  *         bun_no :   (In) �������ʸ�����Ƭʸ���ֹ�
1509  *         bun_no2 :  (In) �������ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1510  *         use_maep : (In) �������³��ʻȤ����ݡ˥ե饰
1511  *	   ich_shop : (In) �ʾ�ʸ�᡿��ʸ����Ѵ��ե饰
1512  *         fuku :     (In) ʣ���ͥ���Ѵ��ե饰
1513  *         nhinsi :   (In) �ʻ�����Ѵ����λ����ʻ��
1514  *         hlist :    (In) �ʻ�����Ѵ����λ����ʻ��ֹ�����ؤΥݥ���
1515  *
1516  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1517  *
1518  *    Author      :  Hideyuki Kishiba
1519  *
1520  *    Revision history:
1521  *
1522  *:::DOC_END
1523  */
1524 static int
tan_conv1(buf,yomi,bun_no,bun_no2,use_maep,ich_shop,fuku,nhinsi,hlist)1525 tan_conv1(buf, yomi, bun_no, bun_no2, use_maep, ich_shop, fuku, nhinsi, hlist)
1526 register struct wnn_buf_mt *buf;
1527 w_char *yomi;
1528 register int bun_no, bun_no2;
1529 int use_maep, ich_shop, fuku, nhinsi, *hlist;
1530 {
1531     int dcnt;
1532     struct wnn_dai_bunsetsu *dp;
1533     struct wnn_sho_bunsetsu *sp;
1534     int ret;
1535     w_char yomi1[LENGTHBUNSETSU];
1536 
1537     if (yomi == NULL || *yomi == (w_char)0) return(0);
1538     if(bun_no2 >= buf->orig.bun_suu || bun_no2 < 0) bun_no2 = buf->orig.bun_suu;
1539 
1540     if (use_maep & WNN_USE_MAE && bun_no > 0) {
1541 	dumbhinsi = buf->orig.bun[bun_no - 1]->hinsi;
1542 	jl_get_yomi_body(buf, bun_no - 1, bun_no, yomi1);
1543 	mae_fzk = yomi1 + buf->orig.bun[bun_no - 1]->jirilen;
1544     } else {
1545 	dumbhinsi = WNN_BUN_SENTOU;
1546 	mae_fzk = (w_char *)0;
1547     }
1548     if(use_maep & WNN_USE_ATO && bun_no2 < buf->orig.bun_suu){
1549 	syuutanv = buf->orig.bun[bun_no2]->kangovect;
1550 	syuutanv1 = WNN_VECT_KANTAN;
1551     }else{
1552 	syuutanv = WNN_VECT_KANTAN;
1553 	syuutanv1 = WNN_VECT_NO;
1554 	if(bun_no2 < buf->orig.bun_suu){
1555 	    buf->orig.bun[bun_no2]->dai_top = 1;
1556 	}
1557     }
1558     if(!(buf->orig.env)) return(-1);
1559     LockMutex(&(envmt->env_lock));
1560     if(ich_shop == WNN_SHO){
1561 	if(fuku == 0 && nhinsi == 0) {
1562 	    /* ��ʸ��ñʸ���Ѵ� */
1563 	    if((dcnt = js_kantan_sho(buf->orig.env, yomi, dumbhinsi, mae_fzk,
1564 				     syuutanv, syuutanv1, &buf_rb)) < 0){
1565 		buf_wnn_errorno_copy(buf);
1566 		if_dead_disconnect_b(buf);
1567 		UnlockMutex(&(envmt->env_lock));
1568 		return(-1);
1569 	    }
1570 	} else {
1571 	    /* �Ѵ��Ķ����꾮ʸ��ñʸ���Ѵ� */
1572 	    if((dcnt = js_henkan_with_data(buf->orig.env, fuku, nhinsi, hlist,
1573 					   WNN_KANTAN_SHO, yomi, dumbhinsi, mae_fzk,
1574 					   syuutanv, syuutanv1, WNN_VECT_BUNSETSU, &buf_rb)) < 0) {
1575 		buf_wnn_errorno_copy(buf);
1576                 if_dead_disconnect_b(buf);
1577                 UnlockMutex(&(envmt->env_lock));
1578                 return(-1);
1579 	    }
1580 	}
1581 	sp = (struct wnn_sho_bunsetsu *)buf_rb.buf;
1582 	if(use_maep & WNN_USE_ATO && bun_no2 < buf->orig.bun_suu){
1583 	    buf->orig.bun[bun_no2]->dai_top =
1584 		(sp[dcnt-1].status_bkwd == WNN_CONNECT_BK)? 0:1;
1585 	}
1586 	free_bun(buf, bun_no, bun_no2);
1587 	ret = insert_sho(buf, BUN, bun_no, bun_no2, sp, dcnt, 0, fuku, nhinsi, hlist);
1588     } else {
1589 	if(fuku == 0 && nhinsi == 0) {
1590 	    /* ��ʸ��ñʸ���Ѵ� */
1591 	    if((dcnt = js_kantan_dai(buf->orig.env, yomi, dumbhinsi, mae_fzk,
1592 				     syuutanv, syuutanv1, &buf_rb)) < 0){
1593 		buf_wnn_errorno_copy(buf);
1594 		if_dead_disconnect_b(buf);
1595 		UnlockMutex(&(envmt->env_lock));
1596 		return(-1);
1597 	    }
1598 	} else {
1599 	    /* �Ѵ��Ķ�������ʸ��ñʸ���Ѵ� */
1600 	    if((dcnt = js_henkan_with_data(buf->orig.env, fuku, nhinsi, hlist,
1601 					   WNN_KANTAN_DAI, yomi, dumbhinsi, mae_fzk,
1602 					   syuutanv, syuutanv1, WNN_VECT_BUNSETSU, &buf_rb)) < 0) {
1603 		buf_wnn_errorno_copy(buf);
1604                 if_dead_disconnect_b(buf);
1605                 UnlockMutex(&(envmt->env_lock));
1606                 return(-1);
1607             }
1608 	}
1609 	dp = (struct wnn_dai_bunsetsu *)buf_rb.buf;
1610 	if(use_maep & WNN_USE_ATO && bun_no2 < buf->orig.bun_suu){
1611 	    buf->orig.bun[bun_no2]->dai_top =
1612 		(dp[dcnt-1].sbn[dp[dcnt-1].sbncnt-1].status_bkwd == WNN_CONNECT_BK)? 0:1;
1613 	}
1614 	free_bun(buf, bun_no, bun_no2);
1615 	ret = insert_dai(buf, BUN, bun_no, bun_no2, dp, dcnt, 0, fuku, nhinsi, hlist);
1616     }
1617     if(buf->orig.zenkouho_end_bun > bun_no && buf->orig.zenkouho_bun < bun_no2){
1618 	free_zenkouho(buf);
1619     }else if(buf->orig.zenkouho_bun >= bun_no2){
1620 	buf->orig.zenkouho_bun += ret - bun_no2;
1621 	buf->orig.zenkouho_end_bun += ret - bun_no2;
1622     }
1623     UnlockMutex(&(envmt->env_lock));
1624     return(ret);
1625 } /* End of tan_conv1 */
1626 
1627 /*:::DOC_START
1628  *
1629  *    Function Name: jl_nobi_conv
1630  *    Description  : ����Ѵ���Ԥ�
1631  *    Parameter    :
1632  *         buf :       (InOut) �Хåե��ؤΥݥ���
1633  *         bun_no :    (In) �Ѵ�ʸ�����Ƭʸ���ֹ�
1634  *         ichbn_len : (In) ���ʸ���ܤ�Ĺ��
1635  *         bun_no2 :   (In) �Ѵ�ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1636  *         use_maep :  (In) �������³��ʻȤ����ݡ˥ե饰
1637  *         ich_shop :  (In) ��ʸ���ܤ�ʾ�ʸ�᡿��ʸ����Ѵ�����ե饰
1638  *
1639  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1640  *
1641  *    Author      :  Hideyuki Kishiba
1642  *
1643  *    Revision history:
1644  *
1645  *:::DOC_END
1646  */
1647 int
jl_nobi_conv(buf,bun_no,ichbn_len,bun_no2,use_maep,ich_shop)1648 jl_nobi_conv(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop)
1649 register struct wnn_buf *buf;
1650 int ichbn_len, use_maep, ich_shop;
1651 register int bun_no, bun_no2;
1652 {
1653     int x;
1654 
1655     if(!buf) return(-1);
1656     LockMutex(&BUF_LOCK(buf));
1657     buf_wnn_errorno_set = 0;
1658     if(bun_no < 0) {
1659 	UnlockMutex(&BUF_LOCK(buf));
1660 	return(-1);
1661     }
1662 
1663     if(nobi_conv_sub(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop,
1664                      0, NULL, 0) == -1) {
1665         UnlockMutex(&BUF_LOCK(buf));
1666         return(-1);
1667     }
1668     x = buf->bun_suu;
1669     UnlockMutex(&BUF_LOCK(buf));
1670     return x;
1671 } /* End of jl_nobi_conv */
1672 
1673 /*:::DOC_START
1674  *
1675  *    Function Name: jl_nobi_conv_hinsi_flag
1676  *    Description  : �Ѵ��˻��Ѥ����ʻ����ꤷ�Ʊ���Ѵ���Ԥ�
1677  *    Parameter    :
1678  *         buf :       (InOut) �Хåե��ؤΥݥ���
1679  *         bun_no :    (In) �Ѵ�ʸ�����Ƭʸ���ֹ�
1680  *         ichbn_len : (In) ���ʸ���ܤ�Ĺ��
1681  *         bun_no2 :   (In) �Ѵ�ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1682  *         use_maep :  (In) �������³��ʻȤ����ݡ˥ե饰
1683  *         ich_shop :  (In) ��ʸ���ܤ�ʾ�ʸ�᡿��ʸ����Ѵ�����ե饰
1684  *	   hinsi_op :  (In) �ʻ�����Ѵ����λ����ʻ�ե饰
1685  *
1686  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1687  *
1688  *    Author      :  Hideyuki Kishiba
1689  *
1690  *    Revision history:
1691  *
1692  *:::DOC_END
1693  */
1694 int
jl_nobi_conv_hinsi_flag(buf,bun_no,ichbn_len,bun_no2,use_maep,ich_shop,hinsi_op)1695 jl_nobi_conv_hinsi_flag(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop, hinsi_op)
1696 register struct wnn_buf *buf;
1697 int ichbn_len, use_maep, ich_shop, hinsi_op;
1698 register int bun_no, bun_no2;
1699 {
1700     int x, hno;
1701     w_char tmp[64];
1702 
1703     if(!buf) return(-1);
1704     LockMutex(&BUF_LOCK(buf));
1705     buf_wnn_errorno_set = 0;
1706     if(bun_no < 0) {
1707         UnlockMutex(&BUF_LOCK(buf));
1708         return(-1);
1709     }
1710     if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5)) {
1711 	UnlockMutex(&BUF_LOCK(buf));
1712 	return(-1);
1713     }
1714     if(hinsi_op == WNN_ZIP)
1715         _Sstrcpy(tmp, WNN_HINSI_ZIPCODE);
1716     else if(hinsi_op == WNN_TEL)
1717         _Sstrcpy(tmp, WNN_HINSI_TELNO);
1718     else if(hinsi_op == WNN_TANKAN)
1719         _Sstrcpy(tmp, WNN_HINSI_TANKAN);
1720     else {
1721 	UnlockMutex(&BUF_LOCK(buf));
1722         return(-1);
1723     }
1724     if((hno = jl_hinsi_number_e(buf->env, tmp)) == -1) {
1725 	UnlockMutex(&BUF_LOCK(buf));
1726 	return(-1);
1727     }
1728 
1729     if(nobi_conv_sub(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop,
1730                      1, &hno, 0) == -1) {
1731         UnlockMutex(&BUF_LOCK(buf));
1732         return(-1);
1733     }
1734     x = buf->bun_suu;
1735     UnlockMutex(&BUF_LOCK(buf));
1736     return x;
1737 } /* jl_nobi_conv_hinsi_flag */
1738 
1739 /*:::DOC_START
1740  *
1741  *    Function Name: jl_nobi_conv_with_hinsi_name
1742  *    Description  : �Ѵ��˻��Ѥ����ʻ����ꤷ�Ʊ���Ѵ���Ԥ�
1743  *    Parameter    :
1744  *         buf :       (InOut) �Хåե��ؤΥݥ���
1745  *         bun_no :    (In) �Ѵ�ʸ�����Ƭʸ���ֹ�
1746  *         ichbn_len : (In) ���ʸ���ܤ�Ĺ��
1747  *         bun_no2 :   (In) �Ѵ�ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1748  *         use_maep :  (In) �������³��ʻȤ����ݡ˥ե饰
1749  *         ich_shop :  (In) ��ʸ���ܤ�ʾ�ʸ�᡿��ʸ����Ѵ�����ե饰
1750  *         nhinsi :    (In) �ʻ�����Ѵ����λ����ʻ��
1751  *         hname :     (In) �ʻ�����Ѵ����λ����ʻ�̾����ؤΥݥ���
1752  *
1753  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1754  *
1755  *    Author      :  Hideyuki Kishiba
1756  *
1757  *    Revision history:
1758  *
1759  *:::DOC_END
1760  */
1761 int
jl_nobi_conv_with_hinsi_name(buf,bun_no,ichbn_len,bun_no2,use_maep,ich_shop,nhinsi,hname)1762 jl_nobi_conv_with_hinsi_name(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop, nhinsi, hname)
1763 register struct wnn_buf *buf;
1764 int ichbn_len, use_maep, ich_shop, nhinsi;
1765 register int bun_no, bun_no2;
1766 char **hname;
1767 {
1768     int x, i, hsize, *hno = NULL;
1769     w_char tmp[64];
1770 
1771     if(!buf) return(-1);
1772     LockMutex(&BUF_LOCK(buf));
1773     buf_wnn_errorno_set = 0;
1774     if(bun_no < 0) {
1775         UnlockMutex(&BUF_LOCK(buf));
1776         return(-1);
1777     }
1778 /*    if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5) || nhinsi == 0) {
1779 	UnlockMutex(&BUF_LOCK(buf));
1780 	return(-1);
1781     } */
1782     if(nhinsi) {
1783 	hsize = abs(nhinsi);
1784 	hno = (int *)malloc(hsize * sizeof(int));
1785 	for(i = 0; i < hsize; i++) {
1786 	    _Sstrcpy(tmp, hname[i]);
1787 	    if((hno[i] = jl_hinsi_number_e(buf->env, tmp)) == -1) {
1788 		free((char *)hno);
1789 		UnlockMutex(&BUF_LOCK(buf));
1790 		return(-1);
1791 	    }
1792 	}
1793     }
1794 
1795     if(nobi_conv_sub(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop,
1796 		     nhinsi, hno, 0) == -1) {
1797 	if(nhinsi) free((char *)hno);
1798 	UnlockMutex(&BUF_LOCK(buf));
1799 	return(-1);
1800     }
1801     if(nhinsi) free((char *)hno);
1802     x = buf->bun_suu;
1803     UnlockMutex(&BUF_LOCK(buf));
1804     return x;
1805 } /* End of jl_nobi_conv_with_hinsi_name */
1806 
1807 /*:::DOC_START
1808  *
1809  *    Function Name: jl_fi_nobi_conv
1810  *    Description  : �ƣɱ���Ѵ���Ԥ�
1811  *    Parameter    :
1812  *         buf :       (InOut) �Хåե��ؤΥݥ���
1813  *         bun_no :    (In) �Ѵ�ʸ�����Ƭʸ���ֹ�
1814  *         ichbn_len : (In) ���ʸ���ܤ�Ĺ��
1815  *         bun_no2 :   (In) �Ѵ�ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1816  *         use_maep :  (In) �������³��ʻȤ����ݡ˥ե饰
1817  *         ich_shop :  (In) ��ʸ���ܤ�ʾ�ʸ�᡿��ʸ����Ѵ�����ե饰
1818  *
1819  *    Return value : -1==ERROR, else �Ѵ�ʸ���
1820  *
1821  *    Author      :  Hideyuki Kishiba
1822  *
1823  *    Revision history:
1824  *
1825  *:::DOC_END
1826  */
1827 int
jl_fi_nobi_conv(buf,bun_no,ichbn_len,bun_no2,use_maep,ich_shop)1828 jl_fi_nobi_conv(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop)
1829 register struct wnn_buf *buf;
1830 int ichbn_len, use_maep, ich_shop;
1831 register int bun_no, bun_no2;
1832 {
1833     int x;
1834 
1835     if(!buf) return(-1);
1836     LockMutex(&BUF_LOCK(buf));
1837     buf_wnn_errorno_set = 0;
1838     if(bun_no < 0) {
1839         UnlockMutex(&BUF_LOCK(buf));
1840         return(-1);
1841     }
1842 
1843     if(nobi_conv_sub(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop,
1844                      0, NULL, 1) == -1) {
1845         UnlockMutex(&BUF_LOCK(buf));
1846         return(-1);
1847     }
1848     x = buf->bun_suu;
1849     UnlockMutex(&BUF_LOCK(buf));
1850     return x;
1851 } /* End of jl_fi_nobi_conv */
1852 
1853 /*:::DOC_START
1854  *
1855  *    Function Name: nobi_conv_sub
1856  *    Description  : ����Ѵ��Υ��֥롼����ؿ�
1857  *    Parameter    :
1858  *         buf :       (InOut) �Хåե��ؤΥݥ���
1859  *         bun_no :    (In) �Ѵ�ʸ�����Ƭʸ���ֹ�
1860  *	   ichbn_len : (In) ���ʸ���ܤ�Ĺ��
1861  *         bun_no2 :   (In) �Ѵ�ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
1862  *         use_maep :  (In) �������³��ʻȤ����ݡ˥ե饰
1863  *	   ich_shop :  (In) ��ʸ���ܤ�ʾ�ʸ�᡿��ʸ����Ѵ�����ե饰
1864  *         nhinsi :    (In) �ʻ�����Ѵ����λ����ʻ��
1865  *         hlist :     (In) �ʻ�����Ѵ����λ����ʻ��ֹ�����ؤΥݥ���
1866  *         fi_flag :   (In) ���Ѥ����ƣɴط������ʼ������ʤ���
1867  *                         �������˥ե饰
1868  *
1869  *    Return value : 0==SUCCESS, -1==ERROR
1870  *
1871  *    Author      :  Hideyuki Kishiba
1872  *
1873  *    Revision history:
1874  *
1875  *:::DOC_END
1876  */
1877 static int
nobi_conv_sub(buf,bun_no,ichbn_len,bun_no2,use_maep,ich_shop,nhinsi,hlist,fi_flag)1878 nobi_conv_sub(buf, bun_no, ichbn_len, bun_no2, use_maep, ich_shop, nhinsi, hlist, fi_flag)
1879 register struct wnn_buf *buf;
1880 int ichbn_len, use_maep, ich_shop, nhinsi, *hlist, fi_flag;
1881 register int bun_no, bun_no2;
1882 {
1883     w_char yomi[LENGTHCONV], ytmp;
1884     int ret;
1885     int len1;
1886     register WNN_BUN *b1;  /* �ؽ������ޤ������褦���ѹ����ޤ�����H.T. */
1887 
1888     if(bun_no2 >= buf->bun_suu || bun_no2 < 0) bun_no2 = buf->bun_suu;
1889 
1890     len1 = jl_get_yomi_body((WNN_BUF_MT *)buf, bun_no, bun_no2, yomi);
1891     ytmp = yomi[ichbn_len];
1892     if(len1 < ichbn_len){
1893         ichbn_len = len1;
1894     }
1895     yomi[ichbn_len] = 0;
1896 
1897     if(buf->bun[bun_no]->nobi_top != 1){  /* need to add down_bnst */
1898         if(buf->bun[bun_no]) add_down_bnst((WNN_BUF_MT *)buf, bun_no,
1899                                            buf->bun[bun_no]);
1900         if(bun_no + 1 < buf->bun_suu){
1901             add_down_bnst((WNN_BUF_MT *)buf, bun_no, buf->bun[bun_no + 1]);
1902 	                /* ���� bun_no �� down_bnst �˲ä���褦���ѹ� */
1903         }
1904     }
1905     b1 = buf->down_bnst[bun_no];
1906     buf->down_bnst[bun_no] = NULL;
1907     free_down((WNN_BUF_MT *)buf, bun_no, bun_no2);
1908 
1909     if((ret = tan_conv1((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2,
1910 			use_maep & WNN_USE_MAE, ich_shop,
1911 			0, nhinsi, hlist)) == -1)
1912         return(-1);
1913 
1914     yomi[ichbn_len] = ytmp;
1915     if(ytmp){
1916         int maep;
1917         if(ich_shop){
1918             maep = use_maep & ~WNN_USE_MAE;
1919         }else{
1920             maep = use_maep | WNN_USE_MAE;
1921         }
1922         if(ren_conv1((WNN_BUF_MT *)buf, yomi + ichbn_len, ret, ret,
1923                      maep, 0, 0, NULL, fi_flag) == -1)
1924 	    return(-1);
1925     }
1926     buf->bun[bun_no]->nobi_top = 1;
1927     buf->down_bnst[bun_no] = b1;
1928     return(0);
1929 } /* End of nobi_conv_sub */
1930 
1931 int
jl_nobi_conv_e2(buf,env,bun_no,ichbn_len,bun_no2,use_maep,ich_shop)1932 jl_nobi_conv_e2(buf, env, bun_no, ichbn_len, bun_no2, use_maep, ich_shop)
1933 register struct wnn_buf *buf;
1934 struct wnn_env *env;
1935 int ichbn_len, use_maep, ich_shop;
1936 register int bun_no, bun_no2;
1937 {
1938     w_char yomi[LENGTHCONV], ytmp;
1939     int ret;
1940     int len1;
1941     int x;
1942 
1943     if(!buf) return(-1);
1944     LockMutex(&BUF_LOCK(buf));
1945     buf_wnn_errorno_set = 0;
1946     if(bun_no < 0) {
1947 	UnlockMutex(&BUF_LOCK(buf));
1948 	return(-1);
1949     }
1950     if(bun_no2 >= buf->bun_suu || bun_no2 < 0) bun_no2 = buf->bun_suu;
1951 
1952     len1 = jl_get_yomi_body((WNN_BUF_MT *)buf, bun_no, bun_no2, yomi);
1953     ytmp = yomi[ichbn_len];
1954     if(len1 < ichbn_len){
1955 	ichbn_len = len1;
1956     }
1957     yomi[ichbn_len] = 0;
1958 
1959     if(buf->bun[bun_no]->nobi_top != 1){  /* need to add down_bnst */
1960 	if(buf->bun[bun_no]) add_down_bnst((WNN_BUF_MT *)buf, bun_no,
1961 					   buf->bun[bun_no]);
1962 	if(bun_no + 1 < buf->bun_suu){
1963 	    if(ichbn_len < jl_yomi_len_body((WNN_BUF_MT *)buf, bun_no,
1964 					    bun_no + 1)){
1965 		add_down_bnst((WNN_BUF_MT *)buf, bun_no + 1,
1966 			      buf->bun[bun_no + 1]);
1967 		free_down((WNN_BUF_MT *)buf, bun_no + 2, bun_no2);
1968 	    }else{
1969 		add_down_bnst((WNN_BUF_MT *)buf, bun_no, buf->bun[bun_no + 1]);
1970 		free_down((WNN_BUF_MT *)buf, bun_no + 1, bun_no2);
1971 	    }
1972 	}
1973     }
1974 
1975     if((ret = tan_conv1((WNN_BUF_MT *)buf, yomi, bun_no, bun_no2,
1976 			use_maep & WNN_USE_MAE, ich_shop, 0, 0, NULL)) == -1){
1977 	UnlockMutex(&BUF_LOCK(buf));
1978 	return(-1);
1979     }
1980 
1981     buf->env = env;
1982 
1983     yomi[ichbn_len] = ytmp;
1984     if(ytmp){
1985 	int maep;
1986 	if(ich_shop){
1987 	    maep = use_maep & ~WNN_USE_MAE;
1988 	}else{
1989 	    maep = use_maep | WNN_USE_MAE;
1990 	}
1991 	if(ren_conv1((WNN_BUF_MT *)buf, yomi + ichbn_len, ret, ret,
1992 		     maep, 0, 0, NULL, 0) == -1){
1993 	    UnlockMutex(&BUF_LOCK(buf));
1994 	    return(-1);
1995 	}
1996     }
1997     buf->bun[bun_no]->nobi_top = 1;
1998     x = buf->bun_suu;
1999     UnlockMutex(&BUF_LOCK(buf));
2000 
2001     return x;
2002 }
2003 
2004 int
jl_kill(buf,bun_no,bun_no2)2005 jl_kill(buf, bun_no, bun_no2)
2006 struct wnn_buf *buf;
2007 register int bun_no, bun_no2;
2008 {
2009     int x;
2010 
2011     if(!buf) return(0);
2012     LockMutex(&BUF_LOCK(buf));
2013     buf_wnn_errorno_set = 0;
2014     if(bun_no < 0) {
2015 	UnlockMutex(&BUF_LOCK(buf));
2016 	return(0);
2017     }
2018     if(bun_no2 < bun_no || bun_no2 < 0) bun_no2 = buf->bun_suu;
2019     free_zenkouho((WNN_BUF_MT *)buf);     /* toriaezu */
2020     free_down((WNN_BUF_MT *)buf, bun_no, bun_no2);
2021     free_bun((WNN_BUF_MT *)buf, bun_no, bun_no2);
2022     bcopy((char *)&buf->bun[bun_no2], (char *)&buf->bun[bun_no],
2023 	 (buf->bun_suu - bun_no2) * sizeof(WNN_BUN *));
2024     bcopy((char *)&buf->down_bnst[bun_no2], (char *)&buf->down_bnst[bun_no],
2025 	 (buf->bun_suu - bun_no2) * sizeof(WNN_BUN *));
2026     buf->bun_suu -= bun_no2 - bun_no;
2027     x = buf->bun_suu;
2028     UnlockMutex(&BUF_LOCK(buf));
2029     return x;
2030 }
2031 
2032 int
jl_zenkouho(buf,bun_no,use_maep,uniq_level)2033 jl_zenkouho(buf, bun_no, use_maep, uniq_level)
2034 register struct wnn_buf *buf;
2035 int bun_no, use_maep, uniq_level;
2036 {
2037     int x;
2038 
2039     if(!buf) return(-1);
2040     LockMutex(&BUF_LOCK(buf));
2041     buf_wnn_errorno_set = 0;
2042     x = zen_conv_sho1(buf, bun_no, use_maep, uniq_level, 0, 0, NULL);
2043     UnlockMutex(&BUF_LOCK(buf));
2044     return x;
2045 }
2046 
2047 static int
zen_conv_sho1(buf,bun_no,use_maep,uniq_level,fuku,nhinsi,hlist)2048 zen_conv_sho1(buf, bun_no, use_maep, uniq_level, fuku, nhinsi, hlist)
2049 register struct wnn_buf *buf;
2050 int bun_no, use_maep, uniq_level, fuku, nhinsi, *hlist;
2051 {
2052     register struct wnn_buf_mt *buf_m = (WNN_BUF_MT *)buf;
2053     int cnt;
2054     w_char yomi[LENGTHBUNSETSU], yomi1[LENGTHBUNSETSU];
2055     struct wnn_sho_bunsetsu *sp;
2056     register int k;
2057     int x;
2058     int nobi_top;
2059 
2060     jl_get_yomi_body(buf_m, bun_no, bun_no + 1, yomi);
2061     if (use_maep & WNN_USE_MAE && bun_no > 0) {
2062 	dumbhinsi = buf->bun[bun_no - 1]->hinsi;
2063 	jl_get_yomi_body(buf_m, bun_no - 1, bun_no, yomi1);
2064 	mae_fzk = yomi1 + buf->bun[bun_no - 1]->jirilen;
2065     } else {
2066 	dumbhinsi = WNN_BUN_SENTOU;
2067 	mae_fzk = (w_char *)0;
2068     }
2069     if(use_maep & WNN_USE_ATO && bun_no + 1 < buf->bun_suu){
2070 	syuutanv = buf->bun[bun_no+1]->kangovect;
2071 	syuutanv1 = WNN_VECT_KANZEN;
2072 	buf->zenkouho_endvect = syuutanv;
2073     }else{
2074 	syuutanv = WNN_VECT_KANZEN;
2075 	syuutanv1 = WNN_VECT_NO;
2076 	if(bun_no + 1 < buf->bun_suu){
2077 	    buf->bun[bun_no + 1]->dai_top = 1;
2078 	}
2079 	buf->zenkouho_endvect = -1;
2080     }
2081 
2082     if(!(buf->env)) return(-1);
2083     LockMutex(&(envmt->env_lock));
2084     if(fuku == 0 && nhinsi == 0) {
2085 	if(buf->bun[bun_no]->fukugou == 0 && buf->bun[bun_no]->num_hinsi == 0) {
2086 	    if((cnt = js_kanzen_sho(buf->env, yomi, dumbhinsi, mae_fzk,
2087 				    syuutanv, syuutanv1, &buf_rb)) < 0){
2088 		buf_wnn_errorno_copy(buf_m);
2089 		if_dead_disconnect_b(buf_m);
2090 		UnlockMutex(&(envmt->env_lock));
2091 		return(-1);
2092 	    }
2093 	} else {
2094 	    fuku = buf->bun[bun_no]->fukugou;
2095 	    nhinsi = buf->bun[bun_no]->num_hinsi;
2096 	    hlist = buf->bun[bun_no]->hinsi_list;
2097 	    if((cnt = js_henkan_with_data(buf->env, fuku, nhinsi, hlist,
2098 			  WNN_KANZEN_SHO, yomi, dumbhinsi, mae_fzk, syuutanv,
2099 			  syuutanv1, WNN_VECT_BUNSETSU, &buf_rb)) < 0){
2100 		buf_wnn_errorno_copy(buf_m);
2101 		if_dead_disconnect_b(buf_m);
2102 		UnlockMutex(&(envmt->env_lock));
2103 		return(-1);
2104 	    }
2105 	}
2106     } else {
2107 	if((cnt = js_henkan_with_data(buf->env, fuku, nhinsi, hlist,
2108 		      WNN_KANZEN_SHO, yomi, dumbhinsi, mae_fzk, syuutanv,
2109 		      syuutanv1, WNN_VECT_BUNSETSU, &buf_rb)) < 0){
2110 	    buf_wnn_errorno_copy(buf_m);
2111 	    if_dead_disconnect_b(buf_m);
2112 	    UnlockMutex(&(envmt->env_lock));
2113 	    return(-1);
2114 	}
2115     }
2116 
2117     sp = (struct wnn_sho_bunsetsu *)buf_rb.buf;
2118     free_zenkouho(buf_m);
2119     nobi_top = buf->bun[bun_no]->nobi_top;
2120     /* ��ʸ�ἡ������ä����ȡ��ʻ�����Ѵ��ʾ�ʸ��ˤ���������� (cnt) ��
2121        0 �ξ����μ�����ꥹ�Ȥ�ɽ�������Τǡ������å����ɲä���������
2122        ���������褦�ˤ��롣06/05/96  H.Kishiba */
2123     if((buf->bun[bun_no]->from_zenkouho & 1) == BUN || cnt == 0){
2124 	set_sho(buf->bun[bun_no], &buf->zenkouho[0]);
2125 	buf->zenkouho_suu = 1;
2126 				/* Connection information of Old bunsetsu
2127 				 * May not be correct.
2128 				 */
2129 	k = get_c_jikouho(sp, cnt, buf->bun[bun_no]);
2130 	if(k >= 0){
2131 	    buf->zenkouho[0]->dai_top = (sp[k].status == WNN_CONNECT)? 0:1;
2132 	    buf->zenkouho[0]->dai_end = (sp[k].status_bkwd == WNN_CONNECT_BK)? 0:1;
2133 	}
2134 	if(uniq_level || k < 0){
2135 	    insert_sho(buf_m, ZENKOUHO, -1, -1, sp, cnt, uniq_level, fuku, nhinsi, hlist);
2136 	}else{
2137 	    insert_sho(buf_m, ZENKOUHO, -1, -1, sp, k, uniq_level, fuku, nhinsi, hlist);
2138 	    insert_sho(buf_m, ZENKOUHO, -1, -1, sp + k + 1, cnt - k - 1,
2139 		       uniq_level, fuku, nhinsi, hlist);
2140 	}
2141 	buf->c_zenkouho = 0;
2142     }else{
2143 	insert_sho(buf_m, ZENKOUHO, -1, -1, sp, cnt, uniq_level, fuku, nhinsi, hlist);
2144 	k = get_c_jikouho_from_zenkouho(buf_m, buf->bun[bun_no]);
2145 	if(k < 0){
2146 	    k = 0;	/* Only when the kouho has been removed from dict. */
2147 	}
2148 	buf->c_zenkouho = k;
2149     }
2150     buf->zenkouho_bun = bun_no;
2151     buf->zenkouho_end_bun = bun_no + 1;
2152     buf->zenkouho_daip = SHO;
2153     for(k = 0 ; k < buf->zenkouho_suu; k++){
2154 	/* ������ꥹ�Ȥ���Ƭ�θ�����Ф��Ƥ�ɬ�����ӥåȤ���Ȥ��褦�ˤ���
2155 	   ��ʸ��Ĺ�ǽ����Ѻ�ͥ��� */
2156 	if(k == 0 ||
2157 	   (buf->zenkouho[k]->ima && buf->zenkouho[k]->dic_no != -1)){
2158 	    add_down_bnst(buf_m, bun_no, buf->zenkouho[k]);
2159 	}
2160 	/*
2161 	 * ʸ�῭�Ф�/�̤��Ԥä��弡������ä����ˤϡ��������ʸ�����
2162 	 * �ˤ�ʸ�῭�Ф�/�̤�ξ����Ĥ��Ƥ�����ʸ���ڤ�ؽ��ǻ��Ѥ��롣
2163 	 */
2164 	if (nobi_top) buf->zenkouho[k]->nobi_top = 1;
2165     }
2166     x = buf->c_zenkouho;
2167     UnlockMutex(&(envmt->env_lock));
2168     return x;
2169 }
2170 
2171 int
jl_zenkouho_hinsi_flag(buf,bun_no,use_maep,uniq_level,hinsi_op)2172 jl_zenkouho_hinsi_flag(buf, bun_no, use_maep, uniq_level, hinsi_op)
2173 register struct wnn_buf *buf;
2174 int bun_no, use_maep, uniq_level, hinsi_op;
2175 {
2176     int x, hno;
2177     w_char tmp[64];
2178 
2179     if(!buf) return(-1);
2180     LockMutex(&BUF_LOCK(buf));
2181     buf_wnn_errorno_set = 0;
2182     if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5)) {
2183 	UnlockMutex(&BUF_LOCK(buf));
2184 	return(-1);
2185     }
2186     if(hinsi_op == WNN_ZIP)
2187         _Sstrcpy(tmp, WNN_HINSI_ZIPCODE);
2188     else if(hinsi_op == WNN_TEL)
2189         _Sstrcpy(tmp, WNN_HINSI_TELNO);
2190     else if(hinsi_op == WNN_TANKAN)
2191         _Sstrcpy(tmp, WNN_HINSI_TANKAN);
2192     else {
2193 	UnlockMutex(&BUF_LOCK(buf));
2194         return(-1);
2195     }
2196     if((hno = jl_hinsi_number_e(buf->env, tmp)) == -1) {
2197 	UnlockMutex(&BUF_LOCK(buf));
2198 	return(-1);
2199     }
2200     x = zen_conv_sho1(buf, bun_no, use_maep, uniq_level, 0, 1, &hno);
2201     UnlockMutex(&BUF_LOCK(buf));
2202     return x;
2203 }
2204 
2205 int
jl_zenkouho_with_hinsi_name(buf,bun_no,use_maep,uniq_level,nhinsi,hname)2206 jl_zenkouho_with_hinsi_name(buf, bun_no, use_maep, uniq_level, nhinsi, hname)
2207 register struct wnn_buf *buf;
2208 int bun_no, use_maep, uniq_level, nhinsi;
2209 char **hname;
2210 {
2211     int x, i, hsize, *hno = NULL;
2212     w_char tmp[64];
2213 
2214     if(!buf) return(-1);
2215     LockMutex(&BUF_LOCK(buf));
2216     buf_wnn_errorno_set = 0;
2217 /*    if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5) || nhinsi == 0) {
2218 	UnlockMutex(&BUF_LOCK(buf));
2219 	return(-1);
2220     } */
2221     if(nhinsi){
2222 	hsize = abs(nhinsi);
2223 	hno = (int *)malloc(hsize * sizeof(int));
2224 	for(i = 0; i < hsize; i++) {
2225 	    _Sstrcpy(tmp, hname[i]);
2226 	    if((hno[i] = jl_hinsi_number_e(buf->env, tmp)) == -1) {
2227 		free((char *)hno);
2228 		UnlockMutex(&BUF_LOCK(buf));
2229 		return(-1);
2230 	    }
2231 	}
2232     }
2233     x = zen_conv_sho1(buf, bun_no, use_maep, uniq_level, 0, nhinsi, hno);
2234     if(nhinsi) free((char *)hno);
2235     UnlockMutex(&BUF_LOCK(buf));
2236     return x;
2237 }
2238 
2239 int
jl_zenkouho_dai(buf,bun_no,bun_no2,use_maep,uniq_level)2240 jl_zenkouho_dai(buf, bun_no, bun_no2, use_maep, uniq_level)
2241 register struct wnn_buf *buf;
2242 int bun_no, bun_no2, use_maep, uniq_level;
2243 {
2244     int x;
2245 
2246     if(!buf) return(-1);
2247     LockMutex(&BUF_LOCK(buf));
2248     buf_wnn_errorno_set = 0;
2249     x = zen_conv_dai1(buf, bun_no, bun_no2, use_maep, uniq_level, 0, 0, NULL);
2250     UnlockMutex(&BUF_LOCK(buf));
2251     return x;
2252 }
2253 
2254 static int
zen_conv_dai1(buf,bun_no,bun_no2,use_maep,uniq_level,fuku,nhinsi,hlist)2255 zen_conv_dai1(buf, bun_no, bun_no2, use_maep, uniq_level, fuku, nhinsi, hlist)
2256 register struct wnn_buf *buf;
2257 int bun_no, bun_no2, use_maep, uniq_level, fuku, nhinsi, *hlist;
2258 {
2259     register struct wnn_buf_mt *buf_m = (WNN_BUF_MT *)buf;
2260     int cnt;
2261     w_char yomi[LENGTHBUNSETSU], yomi1[LENGTHBUNSETSU];
2262     struct wnn_dai_bunsetsu *dp;
2263     int tmp;
2264     register int k;
2265     int x;
2266     int nobi_top;
2267 
2268     if(bun_no2 > (tmp = dai_end(buf_m, bun_no)) ||
2269 	bun_no2 < 0) bun_no2 = tmp;
2270     jl_get_yomi_body(buf_m, bun_no, bun_no2, yomi);
2271     if (use_maep & WNN_USE_MAE && bun_no > 0) {
2272 	dumbhinsi = buf->bun[bun_no - 1]->hinsi;
2273 	jl_get_yomi_body(buf_m, bun_no - 1, bun_no, yomi1);
2274 	mae_fzk = yomi1 + buf->bun[bun_no - 1]->jirilen;
2275     } else {
2276 	dumbhinsi = WNN_BUN_SENTOU;
2277 	mae_fzk = (w_char *)0;
2278     }
2279     if(use_maep & WNN_USE_ATO && bun_no2 < buf->bun_suu){
2280 	syuutanv = buf->bun[bun_no2]->kangovect;
2281 	syuutanv1 = WNN_VECT_KANZEN;
2282 	buf->zenkouho_endvect = syuutanv;
2283     }else{
2284 	syuutanv = WNN_VECT_KANZEN;
2285 	syuutanv1 = WNN_VECT_NO;
2286 	if(bun_no2 < buf->bun_suu){
2287 	    buf->bun[bun_no2]->dai_top = 1;
2288 	}
2289 	buf->zenkouho_endvect = -1;
2290     }
2291     if(!(buf->env)) return(-1);
2292     LockMutex(&(envmt->env_lock));
2293     if(fuku == 0 && nhinsi == 0) {
2294 	if(buf->bun[bun_no]->fukugou == 0 && buf->bun[bun_no]->num_hinsi == 0) {
2295 	    if((cnt = js_kanzen_dai(buf->env, yomi, dumbhinsi, mae_fzk,
2296 				    syuutanv, syuutanv1, &buf_rb)) < 0){
2297 		buf_wnn_errorno_copy(buf_m);
2298 		if_dead_disconnect_b(buf_m);
2299 		UnlockMutex(&(envmt->env_lock));
2300 		return(-1);
2301 	    }
2302 	} else {
2303 	    fuku = buf->bun[bun_no]->fukugou;
2304 	    nhinsi = buf->bun[bun_no]->num_hinsi;
2305 	    hlist = buf->bun[bun_no]->hinsi_list;
2306 	    if((cnt = js_henkan_with_data(buf->env, fuku, nhinsi, hlist,
2307 			  WNN_KANZEN_DAI, yomi, dumbhinsi, mae_fzk, syuutanv,
2308 			  syuutanv1, WNN_VECT_BUNSETSU, &buf_rb)) < 0) {
2309 		buf_wnn_errorno_copy(buf_m);
2310                 if_dead_disconnect_b(buf_m);
2311                 UnlockMutex(&(envmt->env_lock));
2312                 return(-1);
2313             }
2314 	}
2315     } else {
2316 	if((cnt = js_henkan_with_data(buf->env, fuku, nhinsi, hlist,
2317 		      WNN_KANZEN_DAI, yomi, dumbhinsi, mae_fzk, syuutanv,
2318 		      syuutanv1, WNN_VECT_BUNSETSU, &buf_rb)) < 0) {
2319 	    buf_wnn_errorno_copy(buf_m);
2320 	    if_dead_disconnect_b(buf_m);
2321 	    UnlockMutex(&(envmt->env_lock));
2322 	    return(-1);
2323 	}
2324     }
2325 
2326     dp = (struct wnn_dai_bunsetsu *)buf_rb.buf;
2327 
2328     free_zenkouho(buf_m);
2329 		/* Wander if it is OK, that is, only when all the
2330 		 * zenkouho's are got from zenkouho_dai, we need not move
2331 		 * the current dai-bunsetsu to the top of zenkouho's
2332 		 */
2333     for(k = bun_no; k < bun_no2; k++){
2334 	if(buf->bun[k]->from_zenkouho != ZENKOUHO_DAI)break;
2335     }
2336     if (k >= bun_no2) k--;
2337     nobi_top = buf->bun[k]->nobi_top;
2338     if(k != bun_no2){		/* move the current to the top. */
2339 	make_space_for(buf_m, ZENKOUHO, buf->zenkouho_suu, buf->zenkouho_suu,
2340 		       bun_no2 - bun_no);
2341 	set_dai(&buf->bun[bun_no], &buf->zenkouho[0], bun_no2 - bun_no);
2342 	buf->zenkouho_dai[0] = 0;
2343 	buf->zenkouho_dai[1] = bun_no2 - bun_no;
2344 	buf->zenkouho_dai_suu = 1;
2345 	buf->zenkouho_suu = bun_no2 - bun_no;
2346 	k = get_c_jikouho_dai(dp, cnt, buf->bun, bun_no);
2347 	if(k >= 0){
2348 	    buf->zenkouho[0]->dai_top =
2349 		(dp[k].sbn->status == WNN_CONNECT)? 0:1;
2350 	    buf->zenkouho[bun_no2-bun_no-1]->dai_end =
2351 		(dp[k].sbn[dp[k].sbncnt-1].status_bkwd == WNN_CONNECT_BK)? 0:1;
2352 	    /* KURI *//* USO*?*/
2353 	} else if (cnt == 0) {
2354 	    /* �֡��פϸ������ 0 �ʤΤǡ�dai_top, dai_end ��
2355 	       ����Ū�� 1 �ˤ��� */
2356 	    buf->zenkouho[0]->dai_top = 1;
2357 	    buf->zenkouho[bun_no2-bun_no-1]->dai_end = 1;
2358 	}
2359 	if(uniq_level || k < 0){
2360 	    insert_dai(buf_m, ZENKOUHO, -1, -1, dp, cnt, uniq_level, fuku, nhinsi, hlist);
2361 	}else{
2362 	    insert_dai(buf_m, ZENKOUHO, -1, -1, dp, k, uniq_level, fuku, nhinsi, hlist);
2363 	    insert_dai(buf_m, ZENKOUHO, -1, -1, dp + k + 1, cnt - k - 1,
2364 		       uniq_level, fuku, nhinsi, hlist);
2365 	}
2366 	buf->c_zenkouho = 0;
2367     }else{
2368 	insert_dai(buf_m, ZENKOUHO, -1, -1, dp, cnt, uniq_level, fuku, nhinsi, hlist);
2369 	k = get_c_jikouho_from_zenkouho_dai(buf_m, buf->bun[bun_no]);
2370 	if(k < 0){
2371 	    k = 0;	/* Only when the kouho has been removed from dict. */
2372 	}
2373 	buf->c_zenkouho = k;
2374     }
2375     buf->zenkouho_bun = bun_no;
2376     buf->zenkouho_end_bun = bun_no2;
2377     buf->zenkouho_daip = DAI;
2378     for(k = 0 ; k < buf->zenkouho_suu; k++){
2379         /* ������ꥹ�Ȥ���Ƭ�θ�����Ф��Ƥ�ɬ�����ӥåȤ���Ȥ��褦�ˤ���
2380            ��ʸ��Ĺ�ǽ����Ѻ�ͥ��� */
2381         if(k == 0 ||
2382 	   (buf->zenkouho[k]->ima && buf->zenkouho[k]->dic_no != -1)) {
2383 	    add_down_bnst(buf_m, bun_no, buf->zenkouho[k]);
2384 	}
2385 	/*
2386 	 * ʸ�῭�Ф�/�̤��Ԥä��弡������ä����ˤϡ��������ʸ�����
2387 	 * �ˤ�ʸ�῭�Ф�/�̤�ξ����Ĥ��Ƥ�����ʸ���ڤ�ؽ��ǻ��Ѥ��롣
2388 	 */
2389 	if (nobi_top) buf->zenkouho[k]->nobi_top = 1;
2390     }
2391     x = buf->c_zenkouho;
2392     UnlockMutex(&(envmt->env_lock));
2393     return x;
2394 }
2395 
2396 int
jl_zenkouho_dai_hinsi_flag(buf,bun_no,bun_no2,use_maep,uniq_level,hinsi_op)2397 jl_zenkouho_dai_hinsi_flag(buf, bun_no, bun_no2, use_maep, uniq_level, hinsi_op)
2398 register struct wnn_buf *buf;
2399 int bun_no, bun_no2, use_maep, uniq_level, hinsi_op;
2400 {
2401     int x, hno;
2402     w_char tmp[64];
2403 
2404     if(!buf) return(-1);
2405     LockMutex(&BUF_LOCK(buf));
2406     buf_wnn_errorno_set = 0;
2407     if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5)) {
2408         UnlockMutex(&BUF_LOCK(buf));
2409         return(-1);
2410     }
2411     if(hinsi_op == WNN_ZIP)
2412         _Sstrcpy(tmp, WNN_HINSI_ZIPCODE);
2413     else if(hinsi_op == WNN_TEL)
2414         _Sstrcpy(tmp, WNN_HINSI_TELNO);
2415     else if(hinsi_op == WNN_TANKAN)
2416         _Sstrcpy(tmp, WNN_HINSI_TANKAN);
2417     else {
2418         UnlockMutex(&BUF_LOCK(buf));
2419         return(-1);
2420     }
2421     if((hno = jl_hinsi_number_e(buf->env, tmp)) == -1) {
2422         UnlockMutex(&BUF_LOCK(buf));
2423         return(-1);
2424     }
2425     x = zen_conv_dai1(buf, bun_no, bun_no2, use_maep, uniq_level, 0, 1, &hno);
2426     UnlockMutex(&BUF_LOCK(buf));
2427     return x;
2428 }
2429 
2430 int
jl_zenkouho_dai_with_hinsi_name(buf,bun_no,bun_no2,use_maep,uniq_level,nhinsi,hname)2431 jl_zenkouho_dai_with_hinsi_name(buf, bun_no, bun_no2, use_maep, uniq_level, nhinsi, hname)
2432 register struct wnn_buf *buf;
2433 int bun_no, bun_no2, use_maep, uniq_level, nhinsi;
2434 char **hname;
2435 {
2436     int x, i, hsize, *hno = NULL;
2437     w_char tmp[64];
2438 
2439     if(!buf) return(-1);
2440     LockMutex(&BUF_LOCK(buf));
2441     buf_wnn_errorno_set = 0;
2442 /*    if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5) || nhinsi == 0) {
2443         UnlockMutex(&BUF_LOCK(buf));
2444         return(-1);
2445 	} */
2446     if(nhinsi){
2447         hsize = abs(nhinsi);
2448         hno = (int *)malloc(hsize * sizeof(int));
2449         for(i = 0; i < hsize; i++) {
2450             _Sstrcpy(tmp, hname[i]);
2451             if((hno[i] = jl_hinsi_number_e(buf->env, tmp)) == -1) {
2452                 free((char *)hno);
2453                 UnlockMutex(&BUF_LOCK(buf));
2454                 return(-1);
2455             }
2456         }
2457     }
2458     x = zen_conv_dai1(buf, bun_no, bun_no2, use_maep, uniq_level, 0, nhinsi, hno);
2459     if(nhinsi) free((char *)hno);
2460     UnlockMutex(&BUF_LOCK(buf));
2461     return x;
2462 }
2463 
2464 int
jl_set_jikouho(buf,offset)2465 jl_set_jikouho(buf, offset)
2466 register struct wnn_buf *buf;
2467 register int offset;
2468 {
2469     if(!buf) return(-1);
2470     LockMutex(&BUF_LOCK(buf));
2471     buf_wnn_errorno_set = 0;
2472     if(buf->zenkouho_suu <= 0) {
2473 	UnlockMutex(&BUF_LOCK(buf));
2474 	return(-1);
2475     }
2476     if(buf->zenkouho_daip == DAI){
2477 	UnlockMutex(&BUF_LOCK(buf));
2478 	return(-1);
2479     }
2480     offset = (offset + buf->zenkouho_suu) % buf->zenkouho_suu;
2481     if(buf->zenkouho_bun+1 < buf->bun_suu && buf->zenkouho_endvect != -1)
2482 	buf->bun[buf->zenkouho_bun+1]->dai_top = buf->zenkouho[offset]->dai_end;
2483     free_sho((WNN_BUF_MT *)buf, &buf->bun[buf->zenkouho_bun]);
2484     set_sho(buf->zenkouho[offset], &buf->bun[buf->zenkouho_bun]);
2485     buf->c_zenkouho = offset;
2486     UnlockMutex(&BUF_LOCK(buf));
2487     return(offset);
2488 }
2489 
2490 
2491 int
jl_set_jikouho_dai(buf,offset)2492 jl_set_jikouho_dai(buf, offset)
2493 register struct wnn_buf *buf;
2494 int offset;
2495 {
2496     register int st, end, bun, k;
2497 
2498     if(!buf) return(-1);
2499     LockMutex(&BUF_LOCK(buf));
2500     buf_wnn_errorno_set = 0;
2501     if(buf->zenkouho_suu <= 0) {
2502 	UnlockMutex(&BUF_LOCK(buf));
2503 	return(-1);
2504     }
2505     if(buf->zenkouho_daip == SHO){
2506 	UnlockMutex(&BUF_LOCK(buf));
2507 	return(-1);
2508     }
2509     offset = (offset + buf->zenkouho_dai_suu) % buf->zenkouho_dai_suu;
2510     if(buf->zenkouho_end_bun < buf->bun_suu && buf->zenkouho_endvect != -1)
2511 	buf->bun[buf->zenkouho_end_bun]->dai_top =
2512 		buf->zenkouho[buf->zenkouho_dai[offset+1]-1]->dai_end;
2513     free_bun((WNN_BUF_MT *)buf, buf->zenkouho_bun, buf->zenkouho_end_bun);
2514     st = buf->zenkouho_dai[offset];
2515     end = buf->zenkouho_dai[offset + 1];
2516     make_space_for((WNN_BUF_MT *)buf, BUN, buf->zenkouho_bun,
2517 		   buf->zenkouho_end_bun, end - st);
2518     for(bun = buf->zenkouho_bun, k = st; k < end;){
2519 	set_sho(buf->zenkouho[k++], &buf->bun[bun++]);
2520     }
2521     buf->zenkouho_end_bun = buf->zenkouho_bun + end - st;
2522     buf->c_zenkouho = offset;
2523     UnlockMutex(&BUF_LOCK(buf));
2524     return(offset);
2525 }
2526 
2527 /*:::DOC_START
2528  *
2529  *    Function Name: do_autolearning
2530  *    Description  : ��ư�ؽ���Ԥ�
2531  *		     js_auto_word_add()��Ƥ�
2532  *    Parameter    :
2533  *         buf :      (In) wnn_buf��¤�ΤؤΥݥ���
2534  *         type :     (In) �ؽ����륿����(��������/ʸ���ڤ�)
2535  *         yomi :     (In) �ɤ�
2536  *         kanji :    (In) ����
2537  *         hinsi :    (In) �ʻ�
2538  *
2539  *    Return value : 0==SUCCESS, -1==ERROR
2540  *
2541  *    Author      :  Seiji KUWARI
2542  *
2543  *    Revision history:
2544  *	15-May-96: �߾�: js_autolearning_word_add() �����顼�Ǥ� env ��
2545  *			 �ؽ�������ѹ����ʤ�
2546  *
2547  *:::DOC_END
2548  */
2549 static int
do_autolearning(env,type,yomi,kanji,hinsi)2550 do_autolearning(env, type, yomi, kanji, hinsi)
2551 struct wnn_env *env;
2552 int type;
2553 w_char *yomi, *kanji;
2554 int hinsi;
2555 {
2556     int ret;
2557 
2558     if ((ret = js_autolearning_word_add(env, type, yomi, kanji, NULL, hinsi,
2559 					0)) == -1) {
2560 	if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
2561 	    jl_disconnect_body(env);
2562 	}
2563 	return(-1);
2564     }
2565     return(ret);
2566 }
2567 
2568 #ifdef KOREAN
2569 /* ñ���ؽ�
2570  * ñ��������������ϡ��������δ���ʸ����Ȥ��碌�Ƽ�����Ͽ���롣
2571  * ����ʸ��פǡ�����ʸ�פ�����ˤ��äơ��ֽ�פ���ñ���ξ��ϡ�����ʸ���
2572  * ������Ͽ���롣
2573  * ���ϡ��ʻ��̾��Ȥ�����Ͽ���Ƥ��롣
2574  */
2575 static int
tankan_auto_learning(buf,k,hinsi)2576 tankan_auto_learning(buf, k, hinsi)
2577 register struct wnn_buf *buf;
2578 int k;
2579 int hinsi;
2580 {
2581     int i, j;
2582     w_char tmp[LENGTHYOMI];
2583     w_char yomi[LENGTHYOMI];
2584     w_char kanji[LENGTHKANJI];
2585 
2586     for (i = k; i > 0; i--) {
2587 	if (buf->bun[i]->dic_no == -1) {
2588 	    i++;
2589 	    break;
2590 	}
2591 	wnn_area(buf->bun[i], tmp, WNN_KANJI);
2592 	for (j = 0; j < buf->bun[i]->kanjilen; j++) {
2593 	    if (!ishanja(tmp[j])) {
2594 		i++;
2595 		goto _find;;
2596 	    }
2597 	}
2598     }
2599 _find:
2600 
2601     yomi[0] = kanji[0] = 0;
2602     for ( ; i <= k; i++) {
2603 	wnn_area(buf->bun[i], tmp, WNN_YOMI);
2604 	wnn_Strncat(yomi, tmp, buf->bun[i]->jirilen);
2605 	wnn_area(buf->bun[i], tmp, WNN_KANJI);
2606 	wnn_Strncat(kanji, tmp, buf->bun[i]->kanjilen);
2607     }
2608 
2609     return(do_autolearning(buf->env, WNN_MUHENKAN_LEARNING, yomi, kanji,
2610 			   hinsi));
2611 }
2612 
2613 /* �ϥ���ؽ�
2614  * �Ѵ�����������Ȥ��ƴ��������Ф줿�����ϥ������ꤷ�����ˤ��Υ�
2615  * �������Ͽ���롣
2616  * �ʻ�ϥϥ���Ȥ�����Ͽ���Ƥ���
2617  */
2618 static int
hangul_auto_learning(buf,k,hinsi,bun_no2)2619 hangul_auto_learning(buf, k, hinsi, bun_no2)
2620 register struct wnn_buf *buf;
2621 int k;
2622 int hinsi;
2623 int bun_no2;
2624 {
2625     int i, j;
2626     int find;
2627     w_char tmp[LENGTHYOMI];
2628     w_char yomi[LENGTHYOMI];
2629     w_char kanji[LENGTHKANJI];
2630 
2631     yomi[0] = kanji[0] = 0;
2632     find = 0;
2633     for (i = k; i < bun_no2; i++) {
2634 	wnn_area(buf->bun[i], tmp, WNN_KANJI);
2635 	for (j = 0; j < buf->bun[i]->kanjilen; j++) {
2636 	    if (!ishangul(tmp[j])) {
2637 		if (tmp[j] != ' ' && tmp[j] != JSPACE)
2638 		    goto _find_hangul;
2639 		tmp[j] = 0;
2640 		find = 1;
2641 		break;
2642 	    }
2643 	}
2644 	wnn_Strncat(kanji, tmp, j);
2645 	wnn_area(buf->bun[i], tmp, WNN_YOMI);
2646 	wnn_Strncat(yomi, tmp, j);
2647 	if (find == 1)	break;
2648     }
2649 _find_hangul:
2650 
2651     return(do_autolearning(buf->env, WNN_MUHENKAN_LEARNING, yomi, kanji,
2652 			   hinsi));
2653 }
2654 
2655 /* ��°��ؽ�
2656  * ��Ω��ܥϥ������ꤷ�����ˡ����Υϥ���ʸ������μ�Ω�����³
2657  * ��ǽ����°��Ȥ�����Ͽ���롣
2658  * ���ϡ�����ʸ��Ρ���°����ʻ�Ȥ�����Ͽ���Ƥ��롣
2659  */
2660 static int
fuzokugo_auto_learning(buf,k,hinsi,bun_no2)2661 fuzokugo_auto_learning(buf, k, hinsi, bun_no2)
2662 register struct wnn_buf *buf;
2663 int k;
2664 int hinsi;
2665 int bun_no2;
2666 {
2667     int i, j;
2668     int find;
2669     w_char tmp[LENGTHYOMI];
2670     w_char yomi[LENGTHYOMI];
2671     w_char kanji[LENGTHKANJI];
2672 
2673     if (k <= 0 || buf->bun[k-1]->dic_no == -1)
2674 	return (0);
2675     wnn_area(buf->bun[k-1], tmp, WNN_KANJI);
2676     for (j = 0; j < buf->bun[k-1]->kanjilen; j++) {
2677 	if (!ishanja(tmp[j]))
2678 	    return(0);
2679     }
2680 
2681     yomi[0] = kanji[0] = 0;
2682     find = 0;
2683     for (i = k; i < bun_no2; i++) {
2684 	wnn_area(buf->bun[i], tmp, WNN_KANJI);
2685 	for (j = 0; j < buf->bun[i]->kanjilen; j++) {
2686 	    if (!ishangul(tmp[j])) {
2687 		if (tmp[j] != ' ' && tmp[j] != JSPACE)
2688 		    goto _find_fzk;
2689 		tmp[j] = 0;
2690 		find = 1;
2691 		break;
2692 	    }
2693 	}
2694 	wnn_Strncat(kanji, tmp, j);
2695 	wnn_area(buf->bun[i], tmp, WNN_YOMI);
2696 	wnn_Strncat(yomi, tmp, j);
2697 	if (find == 1)	break;
2698     }
2699 _find_fzk:
2700 
2701     return(do_autolearning(buf->env, WNN_BUNSETSUGIRI_LEARNING, yomi, kanji,
2702 			   hinsi));
2703 }
2704 #endif /* KOREAN */
2705 
2706 static int
muhenkan_auto_learning(buf,wb)2707 muhenkan_auto_learning(buf, wb)
2708 struct wnn_buf *buf;
2709 register WNN_BUN *wb;
2710 {
2711     int hinsi;
2712     w_char yomi[LENGTHYOMI];
2713     w_char kanji[LENGTHKANJI];
2714 
2715     wnn_area(wb, yomi, WNN_YOMI);
2716     wnn_area(wb, kanji, WNN_KANJI);
2717     yomi[wb->jirilen] = (w_char)0;
2718     kanji[wb->real_kanjilen] = (w_char)0;
2719     if(wb->entry == WNN_IKEIJI_ENTRY)
2720         hinsi = wb->hinsi;
2721     else
2722         hinsi = wnn_meisi;
2723     return(do_autolearning(buf->env, WNN_MUHENKAN_LEARNING, yomi, kanji,
2724 			   hinsi));
2725 }
2726 
2727 static int
bunsetsugiri_auto_learning(buf,wb,bun_no,bun_no2)2728 bunsetsugiri_auto_learning(buf, wb, bun_no, bun_no2)
2729 register struct wnn_buf *buf;
2730 register WNN_BUN *wb;
2731 int bun_no, bun_no2;
2732 {
2733     register int i;
2734     register WNN_BUN *wb1;
2735     w_char yomi[LENGTHYOMI];
2736     w_char kanji[LENGTHKANJI];
2737     int yomilen, kanjilen, fuzokugolen, found_dai_top;
2738 
2739     wnn_area(wb, yomi, WNN_YOMI);
2740     wnn_area(wb, kanji, WNN_KANJI);
2741     yomilen = wb->yomilen;
2742     kanjilen = wb->kanjilen;
2743     wb1 = buf->bun[bun_no+1];
2744     wnn_area(wb1, &yomi[yomilen], WNN_YOMI);
2745     wnn_area(wb1, &kanji[kanjilen], WNN_KANJI);
2746     yomilen += wb1->yomilen;
2747     kanjilen += wb1->kanjilen;
2748     fuzokugolen = wb1->yomilen - wb1->jirilen;
2749     yomi[yomilen - fuzokugolen] = (w_char)0;
2750     kanji[kanjilen - fuzokugolen] = (w_char)0;
2751     return(do_autolearning(buf->env, WNN_BUNSETSUGIRI_LEARNING, yomi, kanji,
2752 			   wb1->hinsi));
2753 }
2754 
2755 static int
rendaku_learning(buf,mode,wb1,bun_no,bun_no2)2756 rendaku_learning(buf, mode, wb1, bun_no, bun_no2)
2757 register struct wnn_buf *buf;
2758 register WNN_BUN *wb1;
2759 int mode, bun_no, bun_no2;
2760 {
2761     register int i;
2762     register WNN_BUN *wb;
2763     w_char yomi[LENGTHYOMI];
2764     w_char kanji[LENGTHKANJI];
2765     int yomilen, kanjilen, fuzokugolen, found_dai_top;
2766 
2767     wb = buf->bun[bun_no];
2768     wnn_area(wb, yomi, WNN_YOMI);
2769     wnn_area(wb, kanji, WNN_KANJI);
2770     yomilen = wb->yomilen;
2771     kanjilen = wb->kanjilen;
2772     wnn_area(wb1, &yomi[yomilen], WNN_YOMI);
2773     wnn_area(wb1, &kanji[kanjilen], WNN_KANJI);
2774     yomilen += wb1->yomilen;
2775     kanjilen += wb1->kanjilen;
2776     fuzokugolen = wb1->yomilen - wb1->jirilen;
2777     yomi[yomilen - fuzokugolen] = (w_char)0;
2778     kanji[kanjilen - fuzokugolen] = (w_char)0;
2779     if (mode != WNN_DIC_RW) {
2780 	if (js_temporary_word_add(buf->env, yomi, kanji, NULL, wnn_meisi, 0) == -1) {
2781 	    if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
2782 		jl_disconnect_body(buf->env);
2783 	    }
2784 	    return(-1);
2785 	}
2786 	return(0);
2787     }
2788     return(do_autolearning(buf->env, WNN_BUNSETSUGIRI_LEARNING, yomi, kanji,
2789 			   wnn_meisi));
2790 }
2791 
2792 /*:::DOC_START
2793  *
2794  *    Function Name: jl_update_hindo
2795  *    Description  : ����ʸ�ᤫ�����پ���ʺ��ӥåȡ����١ˤι�����
2796  *		     jlib ��Ƚ�ǤǤ���ؽ�������Ԥ�
2797  *    Parameter    :
2798  *         buf :      (In) �Хåե��ؤΥݥ���
2799  *         bun_no :   (In) ���ꤷ��ʸ�����Ƭʸ���ֹ�
2800  *         bun_no2 :  (In) ���ꤷ��ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
2801  *
2802  *    Return value : 0==SUCCESS, -1==ERROR
2803  *
2804  *    Author      :  Hideyuki Kishiba
2805  *
2806  *    Revision history:
2807  *
2808  *:::DOC_END
2809  */
2810 int
jl_update_hindo(buf,bun_no,bun_no2)2811 jl_update_hindo(buf, bun_no, bun_no2)
2812 register struct wnn_buf *buf;
2813 int bun_no, bun_no2;
2814 {
2815     register int k;
2816     register WNN_BUN *wb;
2817 
2818     if(!buf) return(-1);
2819     LockMutex(&BUF_LOCK(buf));
2820     buf_wnn_errorno_set = 0;
2821     if(bun_no < 0 || !(buf->env)) {
2822 	UnlockMutex(&BUF_LOCK(buf));
2823 	return(-1);
2824     }
2825     if(bun_no2 >= buf->bun_suu || bun_no2 < 0) bun_no2 = buf->bun_suu;
2826 
2827     LockMutex(&(envmt->env_lock));
2828 
2829     if(
2830        /* ���ӥåȤ���Ȥ��٤�����κ��ӥåȤ���Ȥ� */
2831        set_ima_off(buf, bun_no, bun_no2, 0) == -1 ||
2832        /* jlib ���Ƚ�ǤǤ���ؽ�������Ԥ� */
2833        optimize_in_lib(buf, bun_no, bun_no2) == -1) {
2834 	buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
2835 	if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD) goto ERROR_RET;
2836     }
2837 
2838     /* ���ꤷ������κ��ӥåȡ����٤�夲�� */
2839     for(k = bun_no; k < bun_no2; k++) {
2840         if(buf->bun[k]->hindo_updated != 1) continue;
2841         buf->bun[k]->hindo_updated = 2;
2842         wb = buf->bun[k];
2843 	if(js_hindo_set(buf->env, wb->dic_no, wb->entry,
2844 			WNN_IMA_ON, WNN_HINDO_INC) == -1){
2845 	    buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
2846 	    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD) goto ERROR_RET;
2847 	}
2848     }
2849 
2850     /* �ؽ�����ư�����ֳ�������ã�����顢��ư�����֤�Ԥ� */
2851     kakutei_count ++;
2852     if(buf->env->autosave > 0 && kakutei_count >= buf->env->autosave) {
2853 	jl_dic_save_all_e_body(buf->env);
2854 	kakutei_count = 0;
2855     }
2856 
2857     UnlockMutex(&(envmt->env_lock));
2858     UnlockMutex(&BUF_LOCK(buf));
2859     return(0);
2860 
2861  ERROR_RET:
2862     jl_disconnect_body(buf->env);
2863     UnlockMutex(&(envmt->env_lock));
2864     UnlockMutex(&BUF_LOCK(buf));
2865     return(-1);
2866 } /* End of jl_update_hindo */
2867 
2868 /*:::DOC_START
2869  *
2870  *    Function Name: jl_optimize_fi
2871  *    Description  : ����ʸ�ᤫ�����پ���ʺ��ӥåȡ����١ˤι����ȡ�
2872  *                   Wnn5 ���ɲä����ؽ������ȣƣɳؽ�������Ԥ�
2873  *    Parameter    :
2874  *         buf :      (In) �Хåե��ؤΥݥ���
2875  *         bun_no :   (In) ���ꤷ��ʸ�����Ƭʸ���ֹ�
2876  *         bun_no2 :  (In) ���ꤷ��ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
2877  *
2878  *    Return value : 0==SUCCESS, -1==ERROR
2879  *
2880  *    Author      :  Hideyuki Kishiba
2881  *
2882  *    Revision history:
2883  *
2884  *:::DOC_END
2885  */
2886 int
jl_optimize_fi(buf,bun_no,bun_no2)2887 jl_optimize_fi(buf, bun_no, bun_no2)
2888 register struct wnn_buf *buf;
2889 int bun_no, bun_no2;
2890 {
2891     if(!buf) return(-1);
2892     LockMutex(&BUF_LOCK(buf));
2893     buf_wnn_errorno_set = 0;
2894     if(bun_no < 0 || !(buf->env)) {
2895         UnlockMutex(&BUF_LOCK(buf));
2896         return(-1);
2897     }
2898     if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5)) {
2899 	UnlockMutex(&BUF_LOCK(buf));
2900 	return(jl_update_hindo(buf, bun_no, bun_no2));
2901     }
2902     if(bun_no2 >= buf->bun_suu || bun_no2 < 0) bun_no2 = buf->bun_suu;
2903 
2904     LockMutex(&(envmt->env_lock));
2905 
2906     if(
2907        /* ���ӥåȤ���Ȥ��٤�����ȣƣ���³�ط��κ��ӥåȤ���Ȥ� */
2908        set_ima_off(buf, bun_no, bun_no2, 1) == -1 ||
2909        /* jlib ���Ƚ�ǤǤ���ؽ�������Ԥ� */
2910        optimize_in_lib(buf, bun_no, bun_no2) == -1 ||
2911        /* server ���Ƚ�Ǥ��� Wnn5 �ؽ������ȣƣɳؽ�������Ԥ� */
2912        optimize_in_server(buf, bun_no, bun_no2) == -1) {
2913 	buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
2914 	if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD) goto ERROR_RET;
2915     }
2916 
2917     /* �ؽ�����ư�����ֳ�������ã�����顢��ư�����֤�Ԥ� */
2918     kakutei_count ++;
2919     if(buf->env->autosave > 0 && kakutei_count >= buf->env->autosave) {
2920 	jl_dic_save_all_e_body(buf->env);
2921 	kakutei_count = 0;
2922     }
2923 
2924     UnlockMutex(&(envmt->env_lock));
2925     UnlockMutex(&BUF_LOCK(buf));
2926     return(0);
2927 ERROR_RET:
2928     jl_disconnect_body(buf->env);
2929     UnlockMutex(&(envmt->env_lock));
2930     UnlockMutex(&BUF_LOCK(buf));
2931     return(-1);
2932 } /* End of jl_optimize_fi */
2933 
2934 /*:::DOC_START
2935  *
2936  *    Function Name: jl_reset_prev_bun
2937  *    Description  : ������ʸ��������������
2938  *    Parameter    :
2939  *         buf :      (In) �Хåե��ؤΥݥ���
2940  *
2941  *    Return value : 0==SUCCESS, -1==ERROR
2942  *
2943  *    Author      :  Hideyuki Kishiba
2944  *
2945  *    Revision history:
2946  *
2947  *:::DOC_END
2948  */
2949 int
jl_reset_prev_bun(buf)2950 jl_reset_prev_bun(buf)
2951 register struct wnn_buf *buf;
2952 {
2953     int i;
2954 
2955     if(!buf) return(-1);
2956     LockMutex(&BUF_LOCK(buf));
2957     buf_wnn_errorno_set = 0;
2958     if(!(buf->env)) {
2959         UnlockMutex(&BUF_LOCK(buf));
2960         return(-1);
2961     }
2962 
2963     for(i = 0; i < WNN_PREV_BUN_SUU; i++) buf->prev_bun[i].dic_no = -2;
2964 
2965     UnlockMutex(&BUF_LOCK(buf));
2966     return(0);
2967 } /* End of jl_reset_prev_bun */
2968 
2969 /*:::DOC_START
2970  *
2971  *    Function Name: set_ima_off
2972  *    Description  : �Ѵ��˻��Ѥ���ʤ��ä�����κ��ӥåȤ���Ȥ����ƣ��Ѵ����
2973  *		     ���Ѥ����ƣ���³�ط��κ��ӥåȤ��٤���Ȥ�
2974  *    Parameter    :
2975  *         buf :      (In) �Хåե��ؤΥݥ���
2976  *         bun_no :   (In) ���ꤷ��ʸ�����Ƭʸ���ֹ�
2977  *         bun_no2 :  (In) ���ꤷ��ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
2978  *         fi_flag :  (In) �ƣɳؽ��ʤ��ʤ�������˥ե饰
2979  *
2980  *    Return value : 0==SUCCESS, -1==ERROR
2981  *
2982  *    Author      :  Hideyuki Kishiba
2983  *
2984  *    Revision history:
2985  *
2986  *:::DOC_END
2987  */
2988 static int
set_ima_off(buf,bun_no,bun_no2,fi_flag)2989 set_ima_off(buf, bun_no, bun_no2, fi_flag)
2990 register struct wnn_buf *buf;
2991 int bun_no, bun_no2, fi_flag;
2992 {
2993     register int k;
2994     register WNN_BUN *wb;
2995 
2996     /* ����κ��ӥåȤ���Ȥ� */
2997     for(k = bun_no; k < bun_no2; k++){
2998         if(buf->bun[k]->hindo_updated == 1) continue;
2999         for(wb = buf->down_bnst[k]; wb; wb = wb->down){
3000             if(wb->bug == 1) break;
3001             wb->bug = 1;
3002             if(wb->dic_no != -1){
3003                 if(js_hindo_set(buf->env, wb->dic_no, wb->entry,
3004                                 WNN_IMA_OFF, WNN_HINDO_NOP) == -1) {
3005                     buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
3006                     if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3007 		        return(-1);
3008                 }
3009             }
3010         }
3011     }
3012     free_down((WNN_BUF_MT *)buf, bun_no, bun_no2);
3013 
3014     /* �ƣ���³�ط��κ��ӥåȤ���Ȥ� */
3015     if(fi_flag) {
3016 	if(js_set_fi_priority(buf->env, &(buf->fi_rb)) == -1) {
3017 	    buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
3018 	    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3019 	        return(-1);
3020 	}
3021 	/* �ƣ���³�ط�������¤�Τν���� */
3022 	buf->fi_rb.num = 0;
3023     }
3024 
3025     return(0);
3026 } /* End of set_ima_off */
3027 
3028 /*:::DOC_START
3029  *
3030  *    Function Name: optimize_in_lib
3031  *    Description  : jlib ��ǹԤ��ؽ���������
3032  *    Parameter    :
3033  *         buf :      (In) �Хåե��ؤΥݥ���
3034  *         bun_no :   (In) ���ꤷ��ʸ�����Ƭʸ���ֹ�
3035  *         bun_no2 :  (In) ���ꤷ��ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
3036  *
3037  *    Return value : 0==SUCCESS, -1==ERROR
3038  *
3039  *    Author      :  Hideyuki Kishiba
3040  *
3041  *    Revision history:
3042  *
3043  *:::DOC_END
3044  */
3045 static int
optimize_in_lib(buf,bun_no,bun_no2)3046 optimize_in_lib(buf, bun_no, bun_no2)
3047 register struct wnn_buf *buf;
3048 int bun_no, bun_no2;
3049 {
3050     register int k;
3051     register WNN_BUN *wb;
3052 
3053     for(k = bun_no; k < bun_no2; k++){
3054         if(buf->bun[k]->hindo_updated == 1) continue;
3055         buf->bun[k]->hindo_updated = 1;
3056         wb = buf->bun[k];
3057 
3058 #ifdef KOREAN
3059 	if(!strncmp(js_get_lang(buf->env), WNN_K_LANG, 5)) {
3060 	    /* ñ���ؽ� */
3061 	    if ((wb->hinsi == kwnn_tankan) &&       /* Tankan */
3062 		(buf->env->muhenkan_mode != WNN_DIC_RDONLY)) {
3063 		if (tankan_auto_learning(buf, k, kwnn_meisi) == -1) {
3064 		    buf_wnn_errorno_copy(buf);
3065 		    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3066 		        return(-1);
3067 		}
3068 	    }
3069 	    /* �ְ�äƴ������Ѵ������Τ�ϥ�����Ȥ��Ƽ������Ͽ */
3070 	    if ((wb->from_zenkouho & 1) == ZENKOUHO &&
3071 		wb->hinsi == kwnn_hangul && wb->dic_no == -1 &&
3072 		                                /* Hangul */
3073 		(buf->env->muhenkan_mode != WNN_DIC_RDONLY) ) {
3074 		if (hangul_auto_learning(buf, k, kwnn_hangul, bun_no2) == -1) {
3075 		    buf_wnn_errorno_copy(buf);
3076 		    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3077 		        return(-1);
3078                 }
3079             }
3080 	    /* ��°��ؽ� */
3081 	    if (k > 0 && wb->hinsi == kwnn_hangul && wb->dic_no == -1 &&
3082 		                               /* Hangul */
3083 		(buf->env->bunsetsugiri_mode != WNN_DIC_RDONLY)) {
3084 		if (fuzokugo_auto_learning(buf, k, kwnn_fuzokugo, bun_no2) == -1) {
3085 		    buf_wnn_errorno_copy(buf);
3086 		    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3087 		        return(-1);
3088 		}
3089 	    }
3090 	} else
3091 #endif /* KOREAN */
3092 	{
3093 	    /* �Ҥ餬�ʳؽ����������ʳؽ����۷����ؽ� */
3094 	    if (((wb->dic_no == -1) &&
3095 		 (buf->env->muhenkan_mode != WNN_DIC_RDONLY) &&
3096 		 ((wb->entry == WNN_KATAKANA) || (wb->entry == WNN_HIRAGANA))&&
3097 		 (wb->jirilen >= WNN_KATAKANA_LEARNING_LEN)) ||
3098 		wb->entry == WNN_IKEIJI_ENTRY) {
3099 		int entry;
3100 
3101 		if ((entry = muhenkan_auto_learning(buf, wb)) == -1) {
3102 		    buf_wnn_errorno_copy(buf);
3103 		    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3104 		        return(-1);
3105 		}
3106 		wb->dic_no = WNN_MUHENKAN_DIC;
3107 		wb->entry = entry;
3108 	    }
3109 
3110 	    /* ��ʸ��ؽ� */
3111 	    if (wb->dai_top && ((k + 1) < bun_no2) &&
3112 		!buf->bun[k + 1]->dai_top) {
3113                 if (rendaku_learning(buf, buf->env->bunsetsugiri_mode,
3114                                      buf->bun[k + 1], k, k+1) == -1) {
3115                     buf_wnn_errorno_copy(buf);
3116                     if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3117 		        return(-1);
3118                 }
3119 	    } else
3120 	    /* Ϣ���ؽ� */
3121 	    if ((k > bun_no) && (wb->hinsi == wnn_rendaku) &&
3122 		(buf->bun[k-1]->yomilen == buf->bun[k-1]->jirilen)) {
3123 		if (rendaku_learning(buf, buf->env->bunsetsugiri_mode, wb, k-1, k)
3124 		    == -1) {
3125 		    buf_wnn_errorno_copy(buf);
3126 		    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3127 		        return(-1);
3128 		}
3129 	    } else
3130 	    /* ��Ƭ��(��)�ؽ� */
3131 	    if (((k + 1) < bun_no2) && (wb->hinsi == wnn_settou)) {
3132 		if (rendaku_learning(buf, buf->env->bunsetsugiri_mode,
3133 				     buf->bun[k + 1], k, k+1)
3134 		    == -1) {
3135 		    buf_wnn_errorno_copy(buf);
3136 		    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3137 		        return(-1);
3138 		}
3139 	    } else
3140 	    /* ʸ���ڤ�ؽ� */
3141 	    if (wb->nobi_top &&
3142 		(buf->env->bunsetsugiri_mode != WNN_DIC_RDONLY) &&
3143 		((k + 1) < bun_no2) &&
3144 		(buf->bun[k+1]->hinsi != wnn_rendaku &&
3145 		 buf->bun[k]->hinsi != wnn_settou)) {
3146 		if (bunsetsugiri_auto_learning(buf, wb, k, bun_no2) == -1) {
3147 		    buf_wnn_errorno_copy(buf);
3148 		    if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD)
3149 		        return(-1);
3150 		}
3151 	    }
3152 	}
3153     }
3154     return(0);
3155 } /* End of optimize_in_lib */
3156 
3157 /*:::DOC_START
3158  *
3159  *    Function Name: optimize_in_server
3160  *    Description  : jserver ��ǹԤ��ؽ���������
3161  *    Parameter    :
3162  *         buf :     (In) �Хåե��ؤΥݥ���
3163  *         bun_no :  (In) ���ꤷ��ʸ�����Ƭʸ���ֹ�
3164  *         bun_no2 : (In) ���ꤷ��ʸ��κǽ�ʸ���ľ���ʸ���ֹ�
3165  *
3166  *    Return value : 0==SUCCESS, -1==ERROR
3167  *
3168  *    Author      :  Hideyuki Kishiba
3169  *
3170  *    Revision history:
3171  *
3172  *:::DOC_END
3173  */
3174 static int
optimize_in_server(buf,bun_no,bun_no2)3175 optimize_in_server(buf, bun_no, bun_no2)
3176 register struct wnn_buf *buf;
3177 int bun_no, bun_no2;
3178 {
3179     register int k, j;
3180     register WNN_BUN *wb;
3181 
3182     int nkouho, *dic, *entry, *ima, *hindo, *kmoji;
3183     w_char **kouho, *tmp;
3184     struct wnn_prev_bun *prev;
3185 
3186     /* ���ܸ�Τߤ��ݡ��� */
3187     if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5)) return(0);
3188 
3189     /* ������ʸ�����ʬ����������˲ä��� */
3190     nkouho = bun_no2 - bun_no + WNN_PREV_BUN_SUU;
3191 
3192     if ( (dic = (int *)malloc(nkouho * sizeof(int))) == NULL )
3193       return(-1);
3194 
3195     if ( (entry = (int *)malloc(nkouho * sizeof(int))) == NULL ) {
3196       free(dic);
3197       return(-1);
3198     }
3199     if ( (ima = (int *)malloc(nkouho * sizeof(int))) == NULL ) {
3200       free(dic);
3201       free(entry);
3202       return(-1);
3203     }
3204     if ( (hindo = (int *)malloc(nkouho * sizeof(int))) == NULL ) {
3205       free(dic);
3206       free(entry);
3207       free(ima);
3208       return(-1);
3209     }
3210     if ( (kmoji = (int *)malloc(nkouho * sizeof(int))) == NULL ) {
3211       free(dic);
3212       free(entry);
3213       free(ima);
3214       free(hindo);
3215       return(-1);
3216     }
3217     if ( (kouho = (w_char **)malloc(nkouho * sizeof(w_char *))) == NULL ) {
3218       free(dic);
3219       free(entry);
3220       free(ima);
3221       free(hindo);
3222       free(kmoji);
3223       return(-1);
3224     }
3225     if ( (tmp = (w_char *)malloc(nkouho * sizeof(w_char) * LENGTHKANJI)) == NULL ) {
3226       free(dic);
3227       free(entry);
3228       free(ima);
3229       free(hindo);
3230       free(kmoji);
3231       free(kouho);
3232       return(-1);
3233     }
3234     for(k = 0; k < nkouho; k++) {
3235 	kouho[k] = tmp;
3236 	tmp += LENGTHKANJI;
3237     }
3238 
3239     /* ������ʸ���������ʸ����������� */
3240     prev = buf->prev_bun;
3241     for(j = 0, k = WNN_PREV_BUN_SUU - 1; j < WNN_PREV_BUN_SUU; j++, k--) {
3242 	dic[j] = prev[k].dic_no;
3243 	entry[j] = prev[k].entry;
3244 	ima[j] = WNN_HINDO_NOP;
3245 	hindo[j] = WNN_HINDO_NOP;
3246 	kmoji[j] = prev[k].real_kanjilen;
3247 	wnn_Strcpy(kouho[j], prev[k].kouho);
3248     }
3249 
3250     for(k = WNN_PREV_BUN_SUU; k < nkouho; k++) {
3251 	wb = buf->bun[(k - WNN_PREV_BUN_SUU) + bun_no];
3252 	dic[k] = wb->dic_no;		/* �����ֹ� */
3253 	entry[k] = wb->entry;		/* ����ȥ��ֹ� */
3254 	if(wb->hindo_updated == 1) {
3255 	    ima[k] = WNN_IMA_ON;	/* ���ӥåȤ�������ˡ */
3256 	    hindo[k] = WNN_HINDO_INC;	/* ���٤�������ˡ */
3257 	    wb->hindo_updated = 2;
3258 	} else {
3259 	    ima[k] = WNN_HINDO_NOP;	/* ���ӥåȤ�������ˡ */
3260 	    hindo[k] = WNN_HINDO_NOP;	/* ���٤�������ˡ */
3261 	}
3262 	kmoji[k] = wb->real_kanjilen;	/* ����ʸ��������°��ʤ���*/
3263 	wnn_area(wb, kouho[k], WNN_KANJI); /* ����ʸ�������°�줢���*/
3264     }
3265 
3266     /* ľ�����국��ʸ���������ʸ��������ʤ��Ȥ��ϡ�
3267        ����ʸ���ʬ�Ť�ʸ������õ�����Τ�ľ�����국��ʸ�����
3268        ʸ������Ф��Ƥ����褦�ˤ��� */
3269     for(j = WNN_PREV_BUN_SUU - 1, k = WNN_PREV_BUN_SUU - (bun_no2 - bun_no) - 1;
3270 	k >= 0; j--, k--) {
3271 	prev[j].dic_no = prev[k].dic_no;
3272 	prev[j].entry = prev[k].entry;
3273 	prev[j].real_kanjilen = prev[k].real_kanjilen;
3274 	wnn_Strcpy(prev[j].kouho, prev[k].kouho);
3275 	prev[j].jirilen = prev[k].jirilen;
3276         prev[j].hinsi = prev[k].hinsi;
3277     }
3278     /* ����γ�������ľ������������������ */
3279     for(j = 0, k = nkouho - WNN_PREV_BUN_SUU - 1;
3280 	j < WNN_PREV_BUN_SUU && k >= 0;
3281 	j++, k--) {
3282 	wb = buf->bun[k + bun_no];
3283 	prev[j].dic_no = wb->dic_no;
3284 	prev[j].entry = wb->entry;
3285 	prev[j].real_kanjilen = wb->real_kanjilen;
3286 	wnn_area(wb, prev[j].kouho, WNN_KANJI);
3287 	prev[j].jirilen = wb->jirilen;
3288 	prev[j].hinsi = wb->hinsi;
3289     }
3290 
3291     /* Wnn5 �ؽ��ܣƣɳؽ� */
3292     k = js_optimize_fi(buf->env, nkouho, dic, entry, ima, hindo, kmoji, kouho);
3293 
3294     if(k == -1) {
3295 	buf_wnn_errorno_copy((WNN_BUF_MT *)buf)
3296 	if (buf_wnn_errorno_eql == WNN_JSERVER_DEAD) {
3297 	  free(dic);
3298 	  free(entry);
3299 	  free(ima);
3300 	  free(hindo);
3301 	  free(kmoji);
3302 	  free(kouho[0]);
3303 	  free(kouho);
3304 	  return(-1);
3305 	}
3306     }
3307     free(dic);
3308     free(entry);
3309     free(ima);
3310     free(hindo);
3311     free(kmoji);
3312     free(kouho[0]);
3313     free(kouho);
3314     return(0);
3315 } /* End of optimize_in_server */
3316 
3317 
3318 static w_char *
wnn_area(bp,area,kanjip)3319 wnn_area(bp, area, kanjip)
3320 WNN_BUN *bp;
3321 w_char *area;
3322 int kanjip;
3323 {
3324     register WNN_BUN *bp1;
3325     register w_char *c, *end;
3326 
3327     for(bp1 = bp; bp1; bp1 = bp1->next){
3328 	if(bp1 != bp) c = (w_char *)bp1;
3329 	else c = bp1->yomi;
3330 	end = (w_char *)&bp1->next;
3331 	for(;c < end;){
3332 	    if(!kanjip){
3333 		if((*area++ = *c++) == 0){ area--; goto out;}
3334 	    }else{
3335 		if(*c++ == 0) kanjip--;
3336 	    }
3337 	}
3338     }
3339  out:
3340     return(area);
3341 }
3342 
3343 static int
dai_end(buf,bun_no)3344 dai_end(buf, bun_no)
3345 register struct wnn_buf_mt *buf;
3346 register int bun_no;
3347 {
3348     bun_no++;
3349     for(;bun_no < buf->orig.bun_suu && !buf->orig.bun[bun_no]->dai_top; bun_no++);
3350     return(bun_no);
3351 }
3352 
3353 #define dai_end_zenkouho(buf, bun_no) (buf->zenkouho_dai[bun_no + 1])
3354 
3355 #ifdef	CONVERT_by_STROKE
3356 /* ɮ�� (Bi Xing) */
3357 void
jl_get_zenkouho_yomi(buf,zen_num,area)3358 jl_get_zenkouho_yomi(buf, zen_num, area)
3359 register struct wnn_buf *buf;
3360 int zen_num;
3361 w_char *area;
3362 {
3363     register int k, end;
3364 
3365     if(!buf) return;
3366     LockMutex(&BUF_LOCK(buf));
3367     buf_wnn_errorno_set = 0;
3368     if(buf->zenkouho_daip==SHO){
3369 	wnn_area(buf->zenkouho[zen_num], area, WNN_YOMI);
3370     }else{
3371 	end = dai_end_zenkouho(buf, zen_num);
3372 	for(k = buf->zenkouho_dai[zen_num]; k < end; k++){
3373 	    area = wnn_area(buf->zenkouho[k], area, WNN_KANJI);
3374 	}
3375     }
3376     UnlockMutex(&BUF_LOCK(buf));
3377 }
3378 #endif
3379 
3380 void
jl_get_zenkouho_kanji(buf,zen_num,area)3381 jl_get_zenkouho_kanji(buf, zen_num, area)
3382 register struct wnn_buf *buf;
3383 int zen_num;
3384 w_char *area;
3385 {
3386     register int k, end;
3387 
3388     if(!buf) return;
3389     LockMutex(&BUF_LOCK(buf));
3390     buf_wnn_errorno_set = 0;
3391     if(buf->zenkouho_daip==SHO){
3392 	wnn_area(buf->zenkouho[zen_num], area, WNN_KANJI);
3393     }else{
3394 	end = dai_end_zenkouho(buf, zen_num);
3395 	for(k = buf->zenkouho_dai[zen_num]; k < end; k++){
3396 	    area = wnn_area(buf->zenkouho[k], area, WNN_KANJI);
3397 	}
3398     }
3399     UnlockMutex(&BUF_LOCK(buf));
3400 }
3401 
3402 static int
wnn_get_area_body(buf,bun_no,bun_no2,area,kanjip)3403 wnn_get_area_body(buf, bun_no, bun_no2, area, kanjip)
3404 struct wnn_buf_mt *buf;
3405 register int bun_no, bun_no2;
3406 w_char *area;
3407 int kanjip;
3408 {
3409     register int k;
3410     w_char *area1 = area;
3411     int x;
3412 
3413     if(bun_no < 0) {
3414 	return(0);
3415     }
3416     if(bun_no2 >= buf->orig.bun_suu || bun_no2 < 0) bun_no2 = buf->orig.bun_suu;
3417 
3418     for(k = bun_no; k < bun_no2; k++){
3419 	area = wnn_area(buf->orig.bun[k], area, kanjip);
3420     }
3421     x = area - area1;
3422     return x;
3423 }
3424 
3425 int
wnn_get_area(buf,bun_no,bun_no2,area,kanjip)3426 wnn_get_area(buf, bun_no, bun_no2, area, kanjip)
3427 struct wnn_buf *buf;
3428 register int bun_no, bun_no2;
3429 w_char *area;
3430 int kanjip;
3431 {
3432     int x;
3433 
3434     if(!buf) return(0);
3435     LockMutex(&BUF_LOCK(buf));
3436     x = wnn_get_area_body((WNN_BUF_MT *)buf, bun_no, bun_no2, area, kanjip);
3437     UnlockMutex(&BUF_LOCK(buf));
3438     return x;
3439 }
3440 
3441 #define JISHO 1
3442 #define HINDO 2
3443 #define FI_JISHO 3	/* Hideyuki Kishiba (Jul. 7, 1994) */
3444 #define FI_HINDO 4	/* New type for FI-Wnn */
3445 
3446 /*********************************/
3447 static int
jl_dic_add_e_body(env,dic_name,hindo_name,rev,prio,rw,hrw,pwd_dic,pwd_hindo,error_handler,message_handler)3448 jl_dic_add_e_body(env,dic_name,hindo_name,rev, prio,rw, hrw, pwd_dic, pwd_hindo, error_handler, message_handler)
3449 register struct wnn_env_int *env;
3450 char *dic_name;
3451 char *hindo_name;
3452 int prio;
3453 int rw, hrw, rev;
3454 char *pwd_dic, *pwd_hindo;
3455 int  (*error_handler)(), (*message_handler)();
3456 {
3457     char tmp[256];
3458     char pwd[WNN_PASSWD_LEN], hpwd[WNN_PASSWD_LEN];
3459     int fid, hfid = -1;
3460     register int ret;
3461 
3462     if(file_exist(env, dic_name) == -1) {
3463     	/* failed, try to access compressed dictionary,
3464 	   but this may cause error */
3465 	char t_dic_name[1024]; char *t_dic_ext = ".gz";
3466 	char t_dic_name2[1024]; char *t_dic_ext2 = ".Z";
3467         strcpy(t_dic_name, dic_name); strcat(t_dic_name, t_dic_ext);
3468         strcpy(t_dic_name2, dic_name); strcat(t_dic_name2, t_dic_ext2);
3469         if( (file_exist(env, t_dic_name) == -1) &&
3470             (file_exist(env, t_dic_name2) == -1) ) {
3471 	    env_wnn_errorno_copy(env);
3472 	    if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
3473 		jl_disconnect_body(env);
3474 		return(-1);
3475 	    }
3476 	    if((int)error_handler == WNN_NO_CREATE ||
3477 	       (rw == WNN_DIC_RDONLY)){
3478 		LockMutex(&msg_lock);
3479 		sprintf(tmp, "%s \"%s\" %s",
3480 			msg_get(wnn_msg_cat, 200, NULL, env->orig.lang, NULL),
3481 			dic_name,
3482 			msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL));
3483 		        /*
3484 			  "����ե����� \"%s\" ��̵���衣",
3485 			 */
3486 		message_out(message_handler, tmp);
3487 		UnlockMutex(&msg_lock);
3488 		env_wnn_errorno_set = WNN_NO_EXIST;
3489 		return(-1);
3490 	    }
3491 	    LockMutex(&msg_lock);
3492 	    sprintf(tmp, "%s \"%s\" %s%s",
3493 		    msg_get(wnn_msg_cat, 200, NULL, env->orig.lang, NULL),
3494 		    dic_name,
3495 		    msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL),
3496 		    msg_get(wnn_msg_cat, 202, NULL, env->orig.lang, NULL));
3497 
3498 	            /*
3499 		      "����ե����� \"%s\" ��̵���衣���?(Y/N)",
3500 		     */
3501 	    UnlockMutex(&msg_lock);
3502 	    if((int)error_handler == WNN_CREATE ||
3503 	       call_error_handler(error_handler, tmp, env)){
3504 		if(create_file(env, dic_name,JISHO, rw,
3505 			       pwd_dic,
3506 			       (hindo_name && *hindo_name)? "": pwd_hindo,
3507 			       error_handler, message_handler) == -1) {
3508 		    env_wnn_errorno_copy(env);
3509 		    return(-1);
3510 		}
3511 	    }else{
3512 		env_wnn_errorno_set = WNN_NO_EXIST;
3513 		return(-1);
3514 	    }
3515 	}
3516     }
3517 
3518     if((fid = file_read(env, dic_name)) == -1) {
3519 	    env_wnn_errorno_copy(env);
3520 	    if_dead_disconnect(env);
3521 	    return(-1);
3522     }
3523     if(hindo_name && *hindo_name){
3524 	if(file_exist(env, hindo_name) == -1) {
3525 	    env_wnn_errorno_copy(env);
3526 	    if(env_wnn_errorno_eql == WNN_JSERVER_DEAD)	{
3527 		jl_disconnect_body(env);
3528 		return(-1);
3529 	    }
3530 	    if((int)error_handler == WNN_NO_CREATE ||
3531 	       (hrw == WNN_DIC_RDONLY)){
3532 		LockMutex(&msg_lock);
3533 		sprintf(tmp, "%s \"%s\" %s",
3534 			msg_get(wnn_msg_cat, 203, NULL, env->orig.lang, NULL),
3535 			hindo_name,
3536 			msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL));
3537 			/*
3538 			"���٥ե����� \"%s\" ��̵���衣",
3539 			*/
3540 		message_out(message_handler, tmp);
3541 		UnlockMutex(&msg_lock);
3542 		env_wnn_errorno_set = WNN_NO_EXIST;
3543 		return(-1);
3544 	    }
3545 	    LockMutex(&msg_lock);
3546 	    sprintf(tmp, "%s \"%s\" %s%s",
3547 		    msg_get(wnn_msg_cat, 203, NULL, env->orig.lang, NULL),
3548 		    hindo_name,
3549 		    msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL),
3550 		    msg_get(wnn_msg_cat, 202, NULL, env->orig.lang, NULL));
3551 		    /*
3552 		    "���٥ե����� \"%s\" ��̵���衣���?(Y/N)",
3553 		    */
3554 	    UnlockMutex(&msg_lock);
3555 	    if((int)error_handler == WNN_CREATE ||
3556 	       call_error_handler(error_handler, tmp, env)){
3557 		if(create_file(env, hindo_name, HINDO, fid,
3558 			       "", pwd_hindo, error_handler,
3559 			       message_handler) == -1) {
3560 		    env_wnn_errorno_copy(env);
3561 		    return(-1);
3562 		}
3563 	    }else{
3564 		env_wnn_errorno_set = WNN_NO_EXIST;
3565 		return(-1);
3566 	    }
3567 	}
3568 	if((hfid = file_read(env, hindo_name)) == -1){
3569 	    env_wnn_errorno_copy(env);
3570 	    if_dead_disconnect(env);
3571 	    return(-1);
3572 	}
3573     }
3574 
3575     /* Hideyuki Kishiba (Dec. 3, 1994)
3576        ���롼�׼���ξ��� read write���ޡ�������ξ��� read only ��
3577        dic_add ��Ԥ� */
3578     if(rw == WNN_DIC_GROUP) rw = WNN_DIC_RW;
3579     else if(rw == WNN_DIC_MERGE) rw = WNN_DIC_RDONLY;
3580 
3581     if(get_pwd(pwd_dic, pwd, env) == -1)return(-1);
3582     if(get_pwd(pwd_hindo, hpwd, env) == -1)return(-1);
3583     if((ret = js_dic_add(env, fid, hfid, rev, prio, rw, hrw, pwd, hpwd)) < 0) {
3584 	env_wnn_errorno_copy(env);
3585 	if(env_wnn_errorno_eql == WNN_JSERVER_DEAD){
3586 	    jl_disconnect_body(env);
3587 	    return(-1);
3588 	}else if(env_wnn_errorno_eql == WNN_HINDO_NO_MATCH){
3589 	    if((int)error_handler == WNN_NO_CREATE){
3590 		return(-1);
3591 	    }
3592 	    LockMutex(&msg_lock);
3593 	    sprintf(tmp,
3594 		    msg_get(wnn_msg_cat, 204, NULL, env->orig.lang, NULL),
3595 		    hindo_name);
3596 		    /*
3597 		    "���٥ե����� \"%s\" �����ꤵ�줿��������٥ե�����ǤϤ���ޤ������ľ���ޤ���?(Y/N)",
3598 		    */
3599 	    UnlockMutex(&msg_lock);
3600 	    if(!((int)error_handler == WNN_CREATE ||
3601 		 call_error_handler(error_handler, tmp, env))){
3602 		return(-1);
3603 	    }
3604 	    if(file_discard(env, hfid) == -1) {
3605 		env_wnn_errorno_copy(env);
3606 		if_dead_disconnect(env);
3607 		return(-1);
3608 	    }
3609 	    if(file_remove(env->orig.js_id, hindo_name, hpwd) == -1) {
3610 		env_wnn_errorno_copy(env);
3611 	        if_dead_disconnect(env);
3612 		return(-1);
3613 	    }
3614 	    if(create_file(env,hindo_name, HINDO, fid, NULL, pwd_hindo, WNN_CREATE, message_handler) == -1) {
3615 		env_wnn_errorno_copy(env);
3616 		return(-1);
3617 	    }
3618 	    if((hfid = file_read(env, hindo_name)) == -1) {
3619 		env_wnn_errorno_copy(env);
3620 		if_dead_disconnect(env);
3621 		return(-1);
3622 	    }
3623 	    if((ret = js_dic_add(env, fid, hfid, rev, prio, rw, hrw, pwd, hpwd))< 0) {
3624 		env_wnn_errorno_copy(env);
3625 		if_dead_disconnect(env);
3626 		return(-1);
3627 	    }
3628 	}
3629     }
3630     return(ret);
3631 }
3632 
3633 int
jl_dic_add_e(env,dic_name,hindo_name,rev,prio,rw,hrw,pwd_dic,pwd_hindo,error_handler,message_handler)3634 jl_dic_add_e(env,dic_name,hindo_name,rev, prio,rw, hrw, pwd_dic, pwd_hindo, error_handler, message_handler)
3635 register struct wnn_env *env;
3636 char *dic_name;
3637 char *hindo_name;
3638 int prio;
3639 int rw, hrw, rev;
3640 char *pwd_dic, *pwd_hindo;
3641 int  (*error_handler)(), (*message_handler)();
3642 {
3643     int x;
3644 
3645     if(!env) return(-1);
3646     LockMutex(&ENV_LOCK(env));
3647     env_wnn_errorno_set = 0;
3648     x = jl_dic_add_e_body((WNN_ENV_INT *)env, dic_name, hindo_name, rev, prio,
3649 			  rw, hrw, pwd_dic, pwd_hindo, error_handler,
3650 			  message_handler);
3651     UnlockMutex(&ENV_LOCK(env));
3652     return x;
3653 }
3654 
3655 int
jl_dic_add(buf,dic_name,hindo_name,rev,prio,rw,hrw,pwd_dic,pwd_hindo,error_handler,message_handler)3656 jl_dic_add(buf, dic_name, hindo_name, rev, prio, rw, hrw, pwd_dic, pwd_hindo, error_handler, message_handler)
3657 register struct wnn_buf *buf;
3658 char *dic_name;
3659 char *hindo_name;
3660 int prio;
3661 int rw, hrw, rev;
3662 char *pwd_dic, *pwd_hindo;
3663 int  (*error_handler)(), (*message_handler)();
3664 {
3665     int x;
3666 
3667     if(!buf || !(buf->env)) return(-1);
3668     LockMutex(&BUF_LOCK(buf));
3669     LockMutex(&(envmt->env_lock));
3670     buf_wnn_errorno_set = 0;
3671     x = jl_dic_add_e_body((WNN_ENV_INT *)buf->env, dic_name, hindo_name, rev,
3672 			  prio, rw, hrw, pwd_dic, pwd_hindo, error_handler,
3673 			  message_handler);
3674     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
3675     UnlockMutex(&(envmt->env_lock));
3676     UnlockMutex(&BUF_LOCK(buf));
3677     return x;
3678 }
3679 
3680 /*:::DOC_START
3681  *
3682  *    Function Name: jl_fi_dic_add_e_body
3683  *    Description  : jl_fi_dic_add[_e] �Υ��֥롼����ؿ�
3684  *    Parameter    :
3685  *         env :             (In) �Ķ��ؤΥݥ���
3686  *         dic_name :        (In) �ƣɴط�����ե�����̾
3687  *         hindo_name :      (In) �ƣɴط����٥ե�����̾
3688  *	   suflag :          (In) �����ƥ༭����桼������
3689  *	   rw :              (In) ����������ǽ����Բ�ǽ
3690  *	   hrw :             (In) ���ٹ�������ǽ����Բ�ǽ
3691  *	   pwd_dic :         (In) �ƣɴط�����ե�����Υѥ����
3692  *	   pwd_hindo :       (In) �ƣɴط����٥ե�����Υѥ����
3693  *	   error_handler :   (In) ���顼�ϥ�ɥ��
3694  *	   message_handler : (In) ��å������ϥ�ɥ顼
3695  *
3696  *    Return value : -1==ERROR, else ��Ͽ�����ֹ�
3697  *
3698  *    Author      :  Hideyuki Kishiba
3699  *
3700  *    Revision history:
3701  *
3702  *:::DOC_END
3703  */
3704 static int
jl_fi_dic_add_e_body(env,dic_name,hindo_name,suflag,rw,hrw,pwd_dic,pwd_hindo,error_handler,message_handler)3705 jl_fi_dic_add_e_body(env, dic_name, hindo_name, suflag, rw, hrw, pwd_dic, pwd_hindo, error_handler, message_handler)
3706 register struct wnn_env_int *env;
3707 char *dic_name;
3708 char *hindo_name;
3709 int suflag;
3710 int rw, hrw;
3711 char *pwd_dic, *pwd_hindo;
3712 int  (*error_handler)(), (*message_handler)();
3713 {
3714     char tmp[256];
3715     char pwd[WNN_PASSWD_LEN], hpwd[WNN_PASSWD_LEN];
3716     int fid, hfid = -1;
3717     register int ret;
3718 
3719     if(file_exist(env, dic_name) == -1) {
3720 	/* �ƣɴط�����ե����뤬¸�ߤ��ʤ� */
3721 	env_wnn_errorno_copy(env);
3722 	if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
3723 	    /* jserver �����Ǥ��� */
3724 	    jl_disconnect_body(env);
3725 	    return(-1);
3726 	}
3727 	if((int)error_handler == WNN_NO_CREATE) {
3728 	    LockMutex(&msg_lock);
3729 	    sprintf(tmp, "%s \"%s\" %s",
3730 		    msg_get(wnn_msg_cat, 200, NULL, env->orig.lang, NULL),
3731 		    dic_name,
3732 		    msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL));
3733 		    /*
3734 		    "����ե����� \"%s\" ��̵���衣",
3735 		    */
3736 	    message_out(message_handler, tmp);
3737 	    UnlockMutex(&msg_lock);
3738 	    env_wnn_errorno_set = WNN_NO_EXIST;
3739 	    return(-1);
3740 	}
3741 	LockMutex(&msg_lock);
3742 	sprintf(tmp, "%s \"%s\" %s%s",
3743 		msg_get(wnn_msg_cat, 200, NULL, env->orig.lang, NULL),
3744 		dic_name,
3745 		msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL),
3746 		msg_get(wnn_msg_cat, 202, NULL, env->orig.lang, NULL));
3747 		/*
3748 		"����ե����� \"%s\" ��̵���衣���?(Y/N)",
3749 		*/
3750 	UnlockMutex(&msg_lock);
3751 	if((int)error_handler == WNN_CREATE ||
3752 	   call_error_handler(error_handler, tmp, env)){
3753 	    /* �ƣɴط�����κ��� */
3754 	    if(create_file(env, dic_name, FI_JISHO, -1, /* -1 is dummy */
3755 			      pwd_dic,
3756 			      (hindo_name && *hindo_name)? "": pwd_hindo,
3757 			      error_handler, message_handler) == -1) {
3758 		env_wnn_errorno_copy(env);
3759 		return(-1);
3760 	    }
3761 	}else{
3762 	    env_wnn_errorno_set = WNN_NO_EXIST;
3763 	    return(-1);
3764 	}
3765     }
3766     /* �ƣɴط�������ɤ߹��� */
3767     if((fid = file_read(env, dic_name)) == -1) {
3768 	    env_wnn_errorno_copy(env);
3769 	    if_dead_disconnect(env);
3770 	    return(-1);
3771     }
3772     if(hindo_name && *hindo_name){
3773 	if(file_exist(env, hindo_name) == -1) {
3774 	    /* �ƣɴط����٥ե����뤬¸�ߤ��ʤ� */
3775 	    env_wnn_errorno_copy(env);
3776 	    if(env_wnn_errorno_eql == WNN_JSERVER_DEAD)	{
3777 		/* jserver �����Ǥ��� */
3778 		jl_disconnect_body(env);
3779 		return(-1);
3780 	    }
3781 	    if((int)error_handler == WNN_NO_CREATE ||
3782 	       (hrw == WNN_DIC_RDONLY)){
3783 		LockMutex(&msg_lock);
3784 		sprintf(tmp, "%s \"%s\" %s",
3785 			msg_get(wnn_msg_cat, 203, NULL, env->orig.lang, NULL),
3786 			hindo_name,
3787 			msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL));
3788 			/*
3789 			"���٥ե����� \"%s\" ��̵���衣",
3790 			*/
3791 		message_out(message_handler, tmp);
3792 		UnlockMutex(&msg_lock);
3793 		env_wnn_errorno_set = WNN_NO_EXIST;
3794 		return(-1);
3795 	    }
3796 	    LockMutex(&msg_lock);
3797 	    sprintf(tmp, "%s \"%s\" %s%s",
3798 		    msg_get(wnn_msg_cat, 203, NULL, env->orig.lang, NULL),
3799 		    hindo_name,
3800 		    msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL),
3801 		    msg_get(wnn_msg_cat, 202, NULL, env->orig.lang, NULL));
3802 		    /*
3803 		    "���٥ե����� \"%s\" ��̵���衣���?(Y/N)",
3804 		    */
3805 	    UnlockMutex(&msg_lock);
3806 	    if((int)error_handler == WNN_CREATE ||
3807 	       call_error_handler(error_handler, tmp, env)){
3808 		/* �ƣɴط����٥ե�����κ��� */
3809 		if(create_file(env, hindo_name, FI_HINDO, fid,
3810 			       "", pwd_hindo, error_handler,
3811 			       message_handler) == -1) {
3812 		    env_wnn_errorno_copy(env);
3813 		    return(-1);
3814 		}
3815 	    }else{
3816 		env_wnn_errorno_set = WNN_NO_EXIST;
3817 		return(-1);
3818 	    }
3819 	}
3820 	/* �ƣɴط����٥ե�������ɤ߹��� */
3821 	if((hfid = file_read(env, hindo_name)) == -1){
3822 	    env_wnn_errorno_copy(env);
3823 	    if_dead_disconnect(env);
3824 	    return(-1);
3825 	}
3826     }
3827 
3828     /* �ѥ���ɤμ��� */
3829     if(get_pwd(pwd_dic, pwd, env) == -1)return(-1);
3830     if(get_pwd(pwd_hindo, hpwd, env) == -1)return(-1);
3831 
3832     /* �ƣɴط���������٤������������å� */
3833     if((ret = js_fi_dic_add(env, fid, hfid, suflag, rw, hrw, pwd, hpwd)) < 0) {
3834 	env_wnn_errorno_copy(env);
3835 	if(env_wnn_errorno_eql == WNN_JSERVER_DEAD){
3836 	    /* jserver �����Ǥ��� */
3837 	    jl_disconnect_body(env);
3838 	    return(-1);
3839 	}else if(env_wnn_errorno_eql == WNN_HINDO_NO_MATCH){
3840 	    /* ��������٤���������̵�� */
3841 	    if((int)error_handler == WNN_NO_CREATE){
3842 		return(-1);
3843 	    }
3844 	    LockMutex(&msg_lock);
3845 	    sprintf(tmp,
3846 		    msg_get(wnn_msg_cat, 204, NULL, env->orig.lang, NULL),
3847 		    hindo_name);
3848 		    /*
3849 		    "���٥ե����� \"%s\" �����ꤵ�줿��������٥ե�����ǤϤ���ޤ������ľ���ޤ���?(Y/N)",
3850 		    */
3851 	    UnlockMutex(&msg_lock);
3852 	    if(!((int)error_handler == WNN_CREATE ||
3853 		 call_error_handler(error_handler, tmp, env))){
3854 		return(-1);
3855 	    }
3856 	    /* ���٥ե�����Υ������ */
3857 	    if(file_discard(env, hfid) == -1) {
3858 		env_wnn_errorno_copy(env);
3859 		if_dead_disconnect(env);
3860 		return(-1);
3861 	    }
3862 	    /* ���٥ե�����Υǥ���������κ�� */
3863 	    if(file_remove(env->orig.js_id, hindo_name, hpwd) == -1) {
3864 		env_wnn_errorno_copy(env);
3865 	        if_dead_disconnect(env);
3866 		return(-1);
3867 	    }
3868 	    /* �ƣɴط����٥ե�����κ��� */
3869 	    if(create_file(env,hindo_name, FI_HINDO, fid, NULL, pwd_hindo, WNN_CREATE, message_handler) == -1) {
3870 		env_wnn_errorno_copy(env);
3871 		return(-1);
3872 	    }
3873 	    /* �ƣɴط����٥ե�������ɤ߹��� */
3874 	    if((hfid = file_read(env, hindo_name)) == -1) {
3875 		env_wnn_errorno_copy(env);
3876 		if_dead_disconnect(env);
3877 		return(-1);
3878 	    }
3879 	    /* �ƣɴط���������٤������������å� */
3880 	    if((ret = js_fi_dic_add(env, fid, hfid, suflag, rw, hrw, pwd, hpwd))< 0) {
3881 		env_wnn_errorno_copy(env);
3882 		if_dead_disconnect(env);
3883 		return(-1);
3884 	    }
3885 	}
3886     }
3887     return(ret);
3888 } /* End of jl_fi_dic_add_e_body */
3889 
3890 /*:::DOC_START
3891  *
3892  *    Function Name: jl_fi_dic_add_e
3893  *    Description  : �Ķ��ˣƣɼ�����ɲä���
3894  *    Parameter    :
3895  *         env :             (In) �Ķ��ؤΥݥ���
3896  *         dic_name :        (In) �ƣɴط�����ե�����̾
3897  *         hindo_name :      (In) �ƣɴط����٥ե�����̾
3898  *	   suflag :          (In) �����ƥ༭����桼������
3899  *	   rw :              (In) ����������ǽ����Բ�ǽ
3900  *	   hrw :             (In) ���ٹ�������ǽ����Բ�ǽ
3901  *	   pwd_dic :         (In) �ƣɴط�����ե�����Υѥ����
3902  *	   pwd_hindo :       (In) �ƣɴط����٥ե�����Υѥ����
3903  *	   error_handler :   (In) ���顼�ϥ�ɥ��
3904  *	   message_handler : (In) ��å������ϥ�ɥ顼
3905  *
3906  *    Return value : -1==ERROR, else ��Ͽ�����ֹ�
3907  *
3908  *    Author      :  Hideyuki Kishiba
3909  *
3910  *    Revision history:
3911  *
3912  *:::DOC_END
3913  */
3914 int
jl_fi_dic_add_e(env,dic_name,hindo_name,suflag,rw,hrw,pwd_dic,pwd_hindo,error_handler,message_handler)3915 jl_fi_dic_add_e(env, dic_name, hindo_name, suflag ,rw, hrw, pwd_dic, pwd_hindo, error_handler, message_handler)
3916 register struct wnn_env *env;
3917 char *dic_name;
3918 char *hindo_name;
3919 int suflag;
3920 int rw, hrw;
3921 char *pwd_dic, *pwd_hindo;
3922 int  (*error_handler)(), (*message_handler)();
3923 {
3924     int x;
3925 
3926     if(!env) return(-1);
3927     LockMutex(&ENV_LOCK(env));
3928     env_wnn_errorno_set = 0;
3929     /* ���֥롼����ؿ��Υ����� */
3930     x = jl_fi_dic_add_e_body((WNN_ENV_INT *)env, dic_name, hindo_name, suflag,
3931 			  rw, hrw, pwd_dic, pwd_hindo, error_handler,
3932 			  message_handler);
3933     UnlockMutex(&ENV_LOCK(env));
3934     return x;
3935 } /* End of jl_fi_dic_add_e */
3936 
3937 /*:::DOC_START
3938  *
3939  *    Function Name: jl_fi_dic_add
3940  *    Description  : �Хåե��ˣƣɼ�����ɲä���
3941  *    Parameter    :
3942  *         buf :             (In) �Хåե��ؤΥݥ���
3943  *         dic_name :        (In) �ƣɴط�����ե�����̾
3944  *         hindo_name :      (In) �ƣɴط����٥ե�����̾
3945  *	   suflag :          (In) �����ƥ༭����桼������
3946  *	   rw :              (In) ����������ǽ����Բ�ǽ
3947  *	   hrw :             (In) ���ٹ�������ǽ����Բ�ǽ
3948  *	   pwd_dic :         (In) �ƣɴط�����ե�����Υѥ����
3949  *	   pwd_hindo :       (In) �ƣɴط����٥ե�����Υѥ����
3950  *	   error_handler :   (In) ���顼�ϥ�ɥ��
3951  *	   message_handler : (In) ��å������ϥ�ɥ顼
3952  *
3953  *    Return value : -1==ERROR, else ��Ͽ�����ֹ�
3954  *
3955  *    Author      :  Hideyuki Kishiba
3956  *
3957  *    Revision history:
3958  *
3959  *:::DOC_END
3960  */
3961 int
jl_fi_dic_add(buf,dic_name,hindo_name,suflag,rw,hrw,pwd_dic,pwd_hindo,error_handler,message_handler)3962 jl_fi_dic_add(buf, dic_name, hindo_name, suflag, rw, hrw, pwd_dic, pwd_hindo, error_handler, message_handler)
3963 register struct wnn_buf *buf;
3964 char *dic_name;
3965 char *hindo_name;
3966 int suflag;
3967 int rw, hrw;
3968 char *pwd_dic, *pwd_hindo;
3969 int  (*error_handler)(), (*message_handler)();
3970 {
3971     int x;
3972 
3973     if(!buf || !(buf->env)) return(-1);
3974     LockMutex(&BUF_LOCK(buf));
3975     LockMutex(&(envmt->env_lock));
3976     buf_wnn_errorno_set = 0;
3977     /* ���֥롼����ؿ��Υ����� */
3978     x = jl_fi_dic_add_e_body((WNN_ENV_INT *)buf->env, dic_name, hindo_name,
3979 			  suflag, rw, hrw, pwd_dic, pwd_hindo, error_handler,
3980 			  message_handler);
3981     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
3982     UnlockMutex(&(envmt->env_lock));
3983     UnlockMutex(&BUF_LOCK(buf));
3984     return x;
3985 } /* End of jl_fi_dic_add */
3986 
3987 static int
jl_dic_delete_e_body(env,dic_no)3988 jl_dic_delete_e_body(env, dic_no)
3989 register struct wnn_env_int *env;
3990 register int dic_no;
3991 {
3992     WNN_DIC_INFO dic;
3993 
3994     if(js_dic_info(env,dic_no,&dic) < 0){
3995 	env_wnn_errorno_copy(env);
3996 	if_dead_disconnect(env);
3997 	return(-1);
3998     }
3999     if(js_dic_delete(env, dic_no) < 0) {
4000 	env_wnn_errorno_copy(env);
4001 	if_dead_disconnect(env);
4002 	return(-1);
4003     }
4004     /*	dic Body	*/
4005     if (file_discard(env,dic.body) < 0) {
4006 	env_wnn_errorno_copy(env);
4007 	if_dead_disconnect(env);
4008 	return(-1);
4009     }
4010     /*	dic hindo	*/
4011     if(dic.hindo != -1){
4012 	if (file_discard(env,dic.hindo) < 0){
4013 	    env_wnn_errorno_copy(env);
4014 	    if_dead_disconnect(env);
4015 	    return(-1);
4016 	}
4017     }
4018     return(0);
4019 }
4020 
4021 int
jl_dic_delete_e(env,dic_no)4022 jl_dic_delete_e(env, dic_no)
4023 register struct wnn_env *env;
4024 register int dic_no;
4025 {
4026     int x;
4027 
4028     if(!env) return(-1);
4029     LockMutex(&ENV_LOCK(env));
4030     env_wnn_errorno_set = 0;
4031     x = jl_dic_delete_e_body((WNN_ENV_INT *)env, dic_no);
4032     UnlockMutex(&ENV_LOCK(env));
4033     return x;
4034 }
4035 
4036 int
jl_dic_delete(buf,dic_no)4037 jl_dic_delete(buf, dic_no)
4038 register struct wnn_buf *buf;
4039 register int dic_no;
4040 {
4041     int x;
4042 
4043     if(!buf || !(buf->env)) return(-1);
4044     LockMutex(&BUF_LOCK(buf));
4045     LockMutex(&(envmt->env_lock));
4046     buf_wnn_errorno_set = 0;
4047     x = jl_dic_delete_e_body((WNN_ENV_INT *)buf->env, dic_no);
4048     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
4049     UnlockMutex(&(envmt->env_lock));
4050     UnlockMutex(&BUF_LOCK(buf));
4051     return x;
4052 }
4053 
4054 static int
get_pwd(pwd_dic,pwd,env)4055 get_pwd(pwd_dic, pwd, env)
4056 register char *pwd_dic, *pwd;
4057 ARGS *env;
4058 {
4059     FILE *fp;
4060 
4061     if(pwd_dic && *pwd_dic){
4062 	if((fp = fopen(pwd_dic, "r")) == NULL){
4063 	    env_wnn_errorno_set = WNN_CANT_OPEN_PASSWD_FILE;
4064 	    return(-1);
4065 	}
4066 	fgets(pwd, WNN_PASSWD_LEN, fp);
4067 	fclose(fp);
4068     }else {
4069 	pwd[0] = 0;
4070     }
4071     return(0);
4072 }
4073 
4074 static int
create_pwd_file(env,pwd_file,error_handler,message_handler)4075 create_pwd_file(env, pwd_file, error_handler, message_handler)
4076 register struct wnn_env_int *env;
4077 char *pwd_file;
4078 int  (*error_handler)(), (*message_handler)();
4079 {
4080     FILE *fp;
4081     char gomi[256];
4082 
4083     if(pwd_file == NULL || *pwd_file == 0) return(0);
4084     if(access(pwd_file, F_OK) != -1) return(0);
4085     LockMutex(&msg_lock);
4086     sprintf(gomi, "%s \"%s\" %s%s",
4087 	    msg_get(wnn_msg_cat, 205, NULL, env->orig.lang, NULL),
4088 	    pwd_file,
4089 	    msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL),
4090 	    msg_get(wnn_msg_cat, 202, NULL, env->orig.lang, NULL));
4091 	    /*
4092 	    "password_file \"%s\" ��̵���衣���?(Y/N)",
4093 	    */
4094     UnlockMutex(&msg_lock);
4095     /* error_handler != WNN_CREATE �Υ����å���ȴ���Ƥ����Τ��ɲ� */
4096     if((int)error_handler != WNN_CREATE && call_error_handler(error_handler,gomi, env) == 0){
4097 	env_wnn_errorno_set = WNN_NO_EXIST;
4098 	return(-1);
4099     }
4100     if((fp = fopen(pwd_file, "w")) == NULL){
4101 	env_wnn_errorno_set = WNN_CANT_OPEN_PASSWD_FILE;
4102 	message_out(message_handler, wnn_perror_lang(env->orig.lang, env));
4103 	return(-1);
4104     }
4105 #ifdef SYSVR2
4106     srand(time(0)+getuid());
4107     fprintf(fp,"%d\n",rand());
4108 #else
4109     srandom(time(0)+getuid());
4110     fprintf(fp,"%d\n",random());
4111 #endif
4112     fclose(fp);
4113 #define	MODE_PWD (0000000 | 0000400)
4114     chmod(pwd_file,MODE_PWD);
4115     return(0);
4116 }
4117 
4118 
4119 /**	jl_fuzokugo_set	**/
4120 static int
jl_fuzokugo_set_e_body(env,fname)4121 jl_fuzokugo_set_e_body(env,fname)
4122 struct wnn_env_int *env;
4123 char *fname;
4124 {
4125     register int fid, orgfid;
4126     int	ret;
4127 
4128     orgfid = js_fuzokugo_get(env);
4129     /* If orgfid == -1, it must be
4130        because no fuzokugo_file is set to the env
4131        */
4132     if((fid=file_read(env,fname)) == -1) {
4133 	env_wnn_errorno_copy(env);
4134 	if_dead_disconnect(env);
4135 	return(-1);
4136     }
4137     if ((ret = js_fuzokugo_set(env,fid)) < 0) {
4138 	env_wnn_errorno_copy(env);
4139 	if_dead_disconnect(env);
4140 	return(ret);
4141     }
4142     if(fid != orgfid && orgfid != -1){
4143 	js_file_discard(env, orgfid);
4144     }
4145     return(ret);
4146 }
4147 
4148 int
jl_fuzokugo_set_e(env,fname)4149 jl_fuzokugo_set_e(env,fname)
4150 struct wnn_env *env;
4151 char *fname;
4152 {
4153     int x;
4154     if(!env) return(-1);
4155     LockMutex(&ENV_LOCK(env));
4156     env_wnn_errorno_set = 0;
4157     x = jl_fuzokugo_set_e_body((WNN_ENV_INT *)env,fname);
4158     UnlockMutex(&ENV_LOCK(env));
4159     return x;
4160 }
4161 
4162 int
jl_fuzokugo_set(buf,fname)4163 jl_fuzokugo_set(buf, fname)
4164 register struct wnn_buf *buf;
4165 char *fname;
4166 {
4167     int x;
4168     if(!buf || !(buf->env)) return(-1);
4169     LockMutex(&BUF_LOCK(buf));
4170     LockMutex(&(envmt->env_lock));
4171     buf_wnn_errorno_set = 0;
4172     x = jl_fuzokugo_set_e_body((WNN_ENV_INT *)buf->env, fname);
4173     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
4174     UnlockMutex(&(envmt->env_lock));
4175     UnlockMutex(&BUF_LOCK(buf));
4176     return x;
4177 }
4178 
4179 /**	jl_fuzokugo_get	**/
4180 static int
jl_fuzokugo_get_e_body(env,fname)4181 jl_fuzokugo_get_e_body(env, fname)
4182 register struct wnn_env_int *env;
4183 char *fname;
4184 {
4185     WNN_FILE_INFO_STRUCT file;
4186     int fid;
4187     char *c;
4188 
4189     fname[0] = 0;
4190     if((fid = js_fuzokugo_get(env)) < 0) {
4191 	env_wnn_errorno_copy(env);
4192 	if_dead_disconnect(env);
4193 	return(-1);
4194     }
4195     if (js_file_info(env,fid,&file) < 0) {
4196 	env_wnn_errorno_copy(env);
4197 	if_dead_disconnect(env);
4198 	return(-1);
4199     }
4200     LockMutex(&envs_lock);
4201     c = find_file_name_from_id(env, fid);
4202     if(c == NULL){
4203 	c = file.name;
4204     }
4205     strcpy(fname, c);
4206     UnlockMutex(&envs_lock);
4207     return(fid);
4208 }
4209 
4210 int
jl_fuzokugo_get_e(env,fname)4211 jl_fuzokugo_get_e(env, fname)
4212 register struct wnn_env *env;
4213 char *fname;
4214 {
4215     int x;
4216 
4217     if(!env) return(-1);
4218     LockMutex(&ENV_LOCK(env));
4219     env_wnn_errorno_set = 0;
4220     x = jl_fuzokugo_get_e_body((WNN_ENV_INT *)env, fname);
4221     UnlockMutex(&ENV_LOCK(env));
4222     return x;
4223 }
4224 
4225 int
jl_fuzokugo_get(buf,fname)4226 jl_fuzokugo_get(buf, fname)
4227 register struct wnn_buf *buf;
4228 char *fname;
4229 {
4230     int x;
4231 
4232     if(!buf || !(buf->env)) return(-1);
4233     LockMutex(&BUF_LOCK(buf));
4234     LockMutex(&(envmt->env_lock));
4235     buf_wnn_errorno_set = 0;
4236     x = jl_fuzokugo_get_e_body((WNN_ENV_INT *)buf->env, fname);
4237     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
4238     UnlockMutex(&(envmt->env_lock));
4239     UnlockMutex(&BUF_LOCK(buf));
4240     return x;
4241 }
4242 
4243 /**	jl_dic_save	**/
4244 static int
jl_dic_save_e_body(env,dic_no)4245 jl_dic_save_e_body(env,dic_no)
4246 register struct wnn_env_int *env;
4247 int	dic_no;
4248 {
4249     WNN_DIC_INFO dic;
4250     WNN_FILE_INFO_STRUCT file;
4251     char *c;
4252 
4253     if(js_dic_info(env,dic_no,&dic) < 0) {
4254 	env_wnn_errorno_copy(env);
4255 	if_dead_disconnect(env);
4256 	return(-1);
4257     }
4258     /*	dic Body	*/
4259     LockMutex(&envs_lock);
4260     c = find_file_name_from_id(env, dic.body);
4261     if(c == NULL){
4262 	if(dic.localf){
4263 	    c = dic.fname;
4264 	}else{
4265 	    UnlockMutex(&envs_lock);
4266 	    env_wnn_errorno_set=WNN_FILE_NOT_READ_FROM_CLIENT;
4267 	    return(-1);
4268 	}
4269     }
4270     if(c[0] != C_LOCAL){
4271 	if (js_file_write(env,dic.body,c) < 0) {
4272 	    env_wnn_errorno_copy(env);
4273 	    if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
4274 		UnlockMutex(&envs_lock);
4275 		jl_disconnect_if_server_dead_body(env);
4276 		return(-1);
4277 	    }
4278 	}
4279     }else{
4280 	if (js_file_receive(env,dic.body,c + 1) < 0) {
4281 	    env_wnn_errorno_copy(env);
4282 	    if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
4283 		UnlockMutex(&envs_lock);
4284 		jl_disconnect_if_server_dead_body(env);
4285 		return(-1);
4286 	    }
4287 	}
4288     }
4289  /*	dic hindo	*/
4290     if(dic.hindo != -1){
4291 	if (js_file_info(env,dic.hindo,&file) < 0) {
4292 	    UnlockMutex(&envs_lock);
4293 	    env_wnn_errorno_copy(env);
4294 	    if_dead_disconnect(env);
4295 	    return(-1);
4296 	}
4297 	c = find_file_name_from_id(env, file.fid);
4298 	if(c == NULL){
4299 	    if(dic.hlocalf){
4300 		c = dic.hfname;
4301 	    }else{
4302 		UnlockMutex(&envs_lock);
4303 		env_wnn_errorno_set=WNN_FILE_NOT_READ_FROM_CLIENT;
4304 		return(-1);
4305 	    }
4306 	}
4307 	if(c[0] != C_LOCAL){
4308 	    if (js_file_write(env,dic.hindo,c) < 0) {
4309 		UnlockMutex(&envs_lock);
4310 		env_wnn_errorno_copy(env);
4311 		if_dead_disconnect(env);
4312 		return(-1);
4313 	    }
4314 	}else{
4315 	    if (js_file_receive(env,dic.hindo,c + 1) < 0) {
4316 		UnlockMutex(&envs_lock);
4317 		env_wnn_errorno_copy(env);
4318 		if_dead_disconnect(env);
4319 		return(-1);
4320 	    }
4321 	}
4322     }
4323     UnlockMutex(&envs_lock);
4324     return(0);
4325 }
4326 
4327 int
jl_dic_save_e(env,dic_no)4328 jl_dic_save_e(env,dic_no)
4329 register struct wnn_env *env;
4330 int     dic_no;
4331 {
4332     int x;
4333 
4334     if(!env) return(-1);
4335     LockMutex(&ENV_LOCK(env));
4336     env_wnn_errorno_set = 0;
4337     x = jl_dic_save_e_body((WNN_ENV_INT *)env,dic_no);
4338     UnlockMutex(&ENV_LOCK(env));
4339     return x;
4340 }
4341 
4342 int
jl_dic_save(buf,dic_no)4343 jl_dic_save(buf, dic_no)
4344 register struct wnn_buf *buf;
4345 int     dic_no;
4346 {
4347     int x;
4348 
4349     if(!buf || !(buf->env)) return(-1);
4350     LockMutex(&BUF_LOCK(buf));
4351     LockMutex(&(envmt->env_lock));
4352     buf_wnn_errorno_set = 0;
4353     x = jl_dic_save_e_body((WNN_ENV_INT *)buf->env, dic_no);
4354     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
4355     UnlockMutex(&(envmt->env_lock));
4356     UnlockMutex(&BUF_LOCK(buf));
4357     return x;
4358 }
4359 
4360 static int
jl_dic_save_all_e_body(env)4361 jl_dic_save_all_e_body(env)
4362 struct wnn_env_int *env;
4363 {
4364     register WNN_DIC_INFO *dic;
4365     register int k;
4366     char *c;
4367     register int cnt;
4368     register unsigned long dmask = 0;
4369 
4370     /* �ƥ�ݥ�꼭��ʳ��μ����������� */
4371     dmask |= WNN_DIC_ALL_MASK & ~WNN_DIC_TEMPORARY_MASK;
4372 
4373     if((cnt = js_fi_dic_list(env, dmask, &dicrb)) == -1) {
4374 	env_wnn_errorno_copy(env);
4375 	if_dead_disconnect(env);
4376 	return(-1);
4377     }
4378     dic = (WNN_DIC_INFO *)dicrb.buf;
4379     LockMutex(&envs_lock);
4380     for(k = 0 ; k < cnt ; k++, dic++){
4381 	if((c = find_file_name_from_id(env, dic->body)) == NULL){
4382 	    if(dic->localf){
4383 		c = dic->fname;
4384 	    }else{
4385 		env_wnn_errorno_set=WNN_FILE_NOT_READ_FROM_CLIENT;
4386 	    }
4387 	}
4388 	if(c){
4389 	    if(c[0] != C_LOCAL){
4390 		if (js_file_write(env,dic->body,c) < 0) {
4391 		    env_wnn_errorno_copy(env);
4392 		    if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
4393 			UnlockMutex(&envs_lock);
4394 			jl_disconnect_if_server_dead_body(env);
4395 			return(-1);
4396 		    }
4397 		}
4398 	    }else{
4399 		if (js_file_receive(env,dic->body,c + 1) < 0) {
4400 		    env_wnn_errorno_copy(env);
4401 		    if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
4402 			UnlockMutex(&envs_lock);
4403 			jl_disconnect_if_server_dead_body(env);
4404 			return(-1);
4405 		    }
4406 		}
4407 	    }
4408 	}
4409  /*	dic hindo	*/
4410 	if(dic->hindo != -1){
4411 	    c = find_file_name_from_id(env, dic->hindo);
4412 	    if(c == NULL){
4413 		if(dic->hlocalf){
4414 		    c = dic->hfname;
4415 		}else{
4416 		    env_wnn_errorno_set=WNN_FILE_NOT_READ_FROM_CLIENT;
4417 		}
4418 	    }
4419 	    if(c){
4420 		if(c[0] != C_LOCAL){
4421 		    if (js_file_write(env,dic->hindo,c) < 0) {
4422 			env_wnn_errorno_copy(env);
4423 			if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
4424 			    UnlockMutex(&envs_lock);
4425 			    if_dead_disconnect(env);
4426 			    return(-1);
4427 			}
4428 		    }
4429 		}else{
4430 		    if (js_file_receive(env,dic->hindo,c + 1) < 0) {
4431 			env_wnn_errorno_copy(env);
4432 			if (env_wnn_errorno_eql == WNN_JSERVER_DEAD) {
4433 			    UnlockMutex(&envs_lock);
4434 			    if_dead_disconnect(env);
4435 			    return(-1);
4436 			}
4437 		    }
4438 		}
4439 	    }
4440 	}
4441     }
4442     UnlockMutex(&envs_lock);
4443     env_wnn_errorno_copy(env);
4444     if(env_wnn_errorno_eql)
4445         return(-1);
4446     else
4447         return(0);
4448 }
4449 
4450 int
jl_dic_save_all_e(env)4451 jl_dic_save_all_e(env)
4452 struct wnn_env *env;
4453 {
4454     int x;
4455 
4456     if(!env) return(-1);
4457     LockMutex(&ENV_LOCK(env));
4458     env_wnn_errorno_set = 0;
4459     x = jl_dic_save_all_e_body((WNN_ENV_INT *)env);
4460     UnlockMutex(&ENV_LOCK(env));
4461     return x;
4462 }
4463 
4464 int
jl_dic_save_all(buf)4465 jl_dic_save_all(buf)
4466 register struct wnn_buf *buf;
4467 {
4468     int x;
4469 
4470     if(!buf || !(buf->env)) return(-1);
4471     LockMutex(&BUF_LOCK(buf));
4472     LockMutex(&(envmt->env_lock));
4473     buf_wnn_errorno_set = 0;
4474     x = jl_dic_save_all_e_body((WNN_ENV_INT *)buf->env);
4475     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
4476     UnlockMutex(&(envmt->env_lock));
4477     UnlockMutex(&BUF_LOCK(buf));
4478     return x;
4479 }
4480 
4481 /*
4482  *
4483  * bun manipulate  routines
4484  *
4485  */
4486 
4487 static void
free_sho(buf,wbp)4488 free_sho(buf, wbp)
4489 register struct wnn_buf_mt *buf;
4490 WNN_BUN **wbp;
4491 {
4492     register WNN_BUN *wb, *wb1;
4493     wb = *wbp;
4494 
4495     if(--wb->ref_cnt <= 0){
4496 	for(wb1 = wb; wb;){
4497 	    if((wb1 == wb) && (wb->hinsi_list != NULL)) {
4498 		free((char *)(wb->hinsi_list));
4499 		wb->hinsi_list = NULL;
4500 	    }
4501 	    wb->free_next = buf->orig.free_heap;
4502 	    buf->orig.free_heap = wb;
4503 	    wb = wb->next;
4504 	}
4505     }
4506     *wbp = NULL;
4507 }
4508 
4509 static void
free_zenkouho(buf)4510 free_zenkouho(buf)
4511 register struct wnn_buf_mt *buf;
4512 {
4513     register int k;
4514 
4515     for(k = 0 ; k < buf->orig.zenkouho_suu; k++){
4516 	free_sho(buf, &buf->orig.zenkouho[k]);
4517     }
4518     buf->orig.zenkouho_suu = 0;
4519     buf->orig.zenkouho_dai_suu = 0;
4520     buf->orig.c_zenkouho = -1;
4521     buf->orig.zenkouho_bun = -1;
4522     buf->orig.zenkouho_end_bun = -1;
4523 }
4524 
4525 static void
free_bun(buf,bun_no,bun_no2)4526 free_bun(buf, bun_no, bun_no2)
4527 struct wnn_buf_mt *buf;
4528 register int bun_no, bun_no2;
4529 {
4530     register int k;
4531 
4532     for(k = bun_no; k < bun_no2; k++){
4533 	free_sho(buf, &buf->orig.bun[k]);
4534     }
4535 }
4536 
4537 static void
free_down(buf,bun_no,bun_no2)4538 free_down(buf, bun_no, bun_no2)
4539 struct wnn_buf_mt *buf;
4540 int bun_no, bun_no2;
4541 {
4542     register WNN_BUN **wbp, **wbp1;
4543     int k;
4544 
4545     for(k = bun_no; k < bun_no2; k++){
4546 	for(wbp = &buf->orig.down_bnst[k]; *wbp; wbp = wbp1){
4547 	    wbp1 = &(*wbp)->down;
4548 	    free_sho(buf, wbp);
4549 	}
4550     }
4551 }
4552 
4553 static
4554 WNN_BUN *
get_new_bun(buf)4555 get_new_bun(buf)
4556 register struct wnn_buf_mt *buf;
4557 {
4558     register WNN_BUN *wb;
4559 
4560 
4561     if(buf->orig.free_heap == NULL){
4562 	if(alloc_heap(buf, INCREMENT) == -1)return(NULL);
4563     }
4564     wb = buf->orig.free_heap;
4565     buf->orig.free_heap = wb->free_next;
4566     wb->free_next = NULL;
4567     wb->daihyoka = -1;
4568     return(wb);
4569 }
4570 
4571 static
4572 WNN_BUN *
get_sho(buf,sb,zenp,daip,fuku,nhinsi,hlist)4573 get_sho(buf, sb, zenp, daip, fuku, nhinsi, hlist)
4574 struct wnn_buf_mt *buf;
4575 struct wnn_sho_bunsetsu *sb;
4576 int zenp, daip, fuku, nhinsi, *hlist;
4577 {
4578     register w_char *c, *end, *s;
4579     register WNN_BUN *wb;
4580     WNN_BUN *wb1;
4581     int where = 1;
4582     int len;
4583 
4584     if((wb = get_new_bun(buf)) == NULL) return(NULL);
4585 
4586     wb->jirilen = sb->jiriend - sb->start + 1;
4587     wb->dic_no = sb->dic_no;
4588     wb->entry = sb->entry;
4589     wb->kangovect = sb->kangovect;
4590     wb->hinsi = sb->hinsi;
4591     wb->hindo = sb->hindo;
4592     wb->ima = sb->ima;
4593     wb->hindo_updated = 0;
4594     wb->bug = 0;
4595     wb->dai_top = 0;
4596     wb->nobi_top = 0;
4597     wb->ref_cnt = 1;
4598     wb->hyoka = sb->hyoka;
4599     wb->down = NULL;
4600     wb->from_zenkouho = daip << 1 | zenp;
4601     len = wnn_Strlen(sb->fuzoku);
4602     wb->yomilen = wnn_Strlen(sb->yomi) + len;
4603     wb->real_kanjilen = wnn_Strlen(sb->kanji);
4604     wb->kanjilen = wb->real_kanjilen + len;
4605     wb->fukugou = fuku;
4606     wb->num_hinsi = nhinsi;
4607     if(nhinsi) {
4608 	int hsize = abs(nhinsi) * sizeof(int);
4609 	if((wb->hinsi_list = (int *)malloc(hsize)) == NULL) return(NULL);
4610 	bcopy(hlist, wb->hinsi_list, hsize);
4611     } else
4612         wb->hinsi_list = NULL;
4613 /*
4614     wb->dai_top = (sb->status == WNN_CONNECT)? 0:1;
4615 ��ʸ�����Ƭ�ʳ��ξ�ʸ��˴ؤ��Ƥϡ�status �Ϥ����ø����ͤ����äƤ��롣
4616 */
4617     s = sb->yomi;
4618 
4619     for(wb1 = wb; ;){
4620 	if(wb1 == wb) c = wb1->yomi;
4621 	else c = (w_char *)wb1;
4622 	end = (w_char *)&wb1->next;
4623 
4624 	for(; c < end;) {
4625 	    if((*c++ = *s++) == 0){
4626 		if(where == 1){
4627 		    where = 3;
4628 		    c--;
4629 		    s = sb->fuzoku;
4630 		}else if(where == 3){
4631 		    where = 0;
4632 		    s = sb->kanji;
4633 		}else if(where == 0){
4634 		    where = 4;
4635 		    c--;
4636 		    s = sb->fuzoku;
4637 		}else{
4638 		    goto out;
4639 		}
4640 	    }
4641 	}
4642 	wb1->next = get_new_bun(buf);
4643 	wb1 = wb1->next;
4644     }
4645     out:
4646     wb1->next = NULL;
4647     return(wb);
4648 }
4649 
4650 static void
make_space_for(buf,zenp,bun_no,bun_no2,cnt)4651 make_space_for(buf, zenp, bun_no, bun_no2, cnt)
4652 register struct wnn_buf_mt *buf;
4653 int bun_no, bun_no2, zenp;
4654 int cnt;
4655 {
4656     switch(zenp){
4657     case BUN:
4658 	make_space_for_bun(buf,bun_no, bun_no2, cnt);
4659 	break;
4660     case ZENKOUHO:
4661 	make_space_for_zenkouho(buf,bun_no, bun_no2, cnt);
4662     }
4663 }
4664 
4665 static void
make_space_for_bun(buf,bun_no,bun_no2,cnt)4666 make_space_for_bun(buf, bun_no, bun_no2, cnt)
4667 register struct wnn_buf_mt *buf;
4668 int bun_no, bun_no2;
4669 int cnt;
4670 {
4671     int newsize;
4672     register int k;
4673 
4674     newsize = buf->orig.bun_suu + cnt - (bun_no2 - bun_no);
4675 
4676 #define Realloc(a, b) realloc((char *)(a), (unsigned)(b))
4677 
4678     if(newsize > buf->orig.msize_bun){
4679 	buf->orig.bun = (WNN_BUN **)Realloc(buf->orig.bun, newsize * sizeof(WNN_BUN *));
4680 	buf->orig.down_bnst = (WNN_BUN **)Realloc(buf->orig.down_bnst, newsize * sizeof(WNN_BUN *));
4681 	buf->orig.msize_bun = newsize;
4682     }
4683 
4684 
4685     for(k = buf->orig.bun_suu; k < newsize; k++){
4686 	buf->orig.down_bnst[k] = NULL;
4687     }
4688     bcopy((char *)&buf->orig.bun[bun_no2], (char *)&buf->orig.bun[bun_no + cnt],
4689 	  (buf->orig.bun_suu - bun_no2) * sizeof(WNN_BUN *));
4690     bcopy((char *)&buf->orig.down_bnst[bun_no2], (char *)&buf->orig.down_bnst[bun_no + cnt],
4691 	  (buf->orig.bun_suu - bun_no2) * sizeof(WNN_BUN *));
4692     if(bun_no2 < bun_no + cnt){
4693 	bzero((char *)&buf->orig.down_bnst[bun_no2], (bun_no + cnt - bun_no2) * sizeof(WNN_BUN *));
4694     }
4695     buf->orig.bun_suu = newsize;
4696 }
4697 
4698 static void
make_space_for_zenkouho(buf,bun_no,bun_no2,cnt)4699 make_space_for_zenkouho(buf, bun_no, bun_no2, cnt)
4700 struct wnn_buf_mt *buf;
4701 int bun_no, bun_no2;
4702 register int cnt;
4703 {
4704     register int newsize;
4705 
4706     newsize = buf->orig.zenkouho_suu + cnt - (bun_no2 - bun_no);
4707 
4708     if(newsize > buf->orig.msize_zenkouho){
4709 	buf->orig.zenkouho = (WNN_BUN **)Realloc(buf->orig.zenkouho, newsize * sizeof(WNN_BUN *));
4710 	buf->orig.zenkouho_dai = (int *)Realloc(buf->orig.zenkouho_dai, (1 + newsize) * sizeof(int *));
4711 	buf->orig.msize_zenkouho = newsize;
4712     }
4713     bcopy((char *)&buf->orig.zenkouho[bun_no2],
4714 	  (char *)&buf->orig.zenkouho[bun_no + cnt],
4715 	  (buf->orig.zenkouho_suu - bun_no2) * sizeof(WNN_BUN *));
4716     buf->orig.zenkouho_suu = newsize;
4717 }
4718 
4719 
4720 static int
insert_sho(buf,zenp,bun_no,bun_no2,sp,cnt,uniq_level,fuku,nhinsi,hlist)4721 insert_sho(buf, zenp, bun_no, bun_no2, sp, cnt, uniq_level, fuku, nhinsi, hlist)
4722 struct wnn_buf_mt *buf;
4723 int bun_no, bun_no2;
4724 register struct wnn_sho_bunsetsu *sp;
4725 int cnt;
4726 int zenp;			/* daip */
4727 int uniq_level;			/* uniq is only supported when bun_no = -1
4728 				   and zenp == ZENKOUHO */
4729 int fuku, nhinsi, *hlist;
4730 {
4731     register WNN_BUN **b;
4732     register int k;
4733 
4734     if(bun_no == -1){
4735 	bun_no = bun_no2 = (zenp == BUN)? buf->orig.bun_suu: buf->orig.zenkouho_suu;
4736     }
4737 
4738     /* It will make too big space when uniq_level > 0, but That's OK! */
4739     make_space_for(buf, zenp, bun_no, bun_no2, cnt);
4740 
4741     b = ((zenp == BUN)? buf->orig.bun: buf->orig.zenkouho) + bun_no;
4742     for(k = bun_no ; k < bun_no + cnt ; k++, sp++){
4743 	/* �ʻ�����Ѵ��κݤϡ�find_same_kouho() ���ơ�
4744 	   ������ꥹ�ȤΥ��֥���ɤ� */
4745 	if(uniq_level && ((k < bun_no + cnt - 2) || nhinsi)){
4746 	    if(find_same_kouho(sp, buf->orig.zenkouho, b,uniq_level))continue;
4747 	}
4748 	*b = get_sho(buf, sp, zenp, SHO, fuku, nhinsi, hlist);
4749 	(*b)->dai_top = (sp->status == WNN_CONNECT)? 0:1;
4750 	if(zenp != BUN){
4751 	    if(buf->orig.zenkouho_endvect != -1){
4752 		(*b)->dai_end = (sp->status_bkwd == WNN_CONNECT_BK)? 0:1;
4753 	    }else{
4754 		(*b)->dai_end = 1;
4755 	    }
4756 	}
4757 	b++;
4758     }
4759     if(uniq_level && zenp == ZENKOUHO){
4760 	buf->orig.zenkouho_suu = b - buf->orig.zenkouho;
4761     }
4762     return(cnt + bun_no);
4763 }
4764 
4765 	/* for zenkouho, assume bun_no = bun_no2 = zenkouho_suu */
4766 static int
insert_dai(buf,zenp,bun_no,bun_no2,dp,dcnt,uniq_level,fuku,nhinsi,hlist)4767 insert_dai(buf, zenp, bun_no, bun_no2, dp, dcnt, uniq_level, fuku, nhinsi, hlist)
4768 struct wnn_buf_mt *buf;
4769 int bun_no, bun_no2;
4770 struct wnn_dai_bunsetsu *dp;
4771 int dcnt;
4772 int zenp;
4773 int uniq_level;
4774 int fuku, nhinsi, *hlist;
4775 {
4776     register WNN_BUN **b, **b0;
4777     register int k, l, m;
4778     register int cnt = 0;
4779     struct wnn_sho_bunsetsu *sp, *sp1;
4780 
4781     if(bun_no == -1){
4782 	bun_no = bun_no2 = (zenp == BUN)? buf->orig.bun_suu: buf->orig.zenkouho_suu;
4783     }
4784 
4785     for(k = 0; k < dcnt ; k++){
4786 	cnt += dp[k].sbncnt;
4787     }
4788     make_space_for(buf, zenp, bun_no, bun_no2, cnt);
4789 				/* zenkouho_dai_suu must not be initialized */
4790 
4791     b = ((zenp == BUN)? buf->orig.bun: buf->orig.zenkouho) + bun_no;
4792 
4793     for(k = 0, m = buf->orig.zenkouho_dai_suu ; k < dcnt; k++){
4794 	/* �ʻ�����Ѵ��κݤϡ�find_same_kouho_dai() ���ơ�
4795 	   ������ꥹ�ȤΥ��֥���ɤ� */
4796 	if(uniq_level && ((k < dcnt - 2) || nhinsi)){
4797 	    if(find_same_kouho_dai(&dp[k], buf, m, uniq_level))
4798 		continue;
4799 	}
4800 	sp = dp[k].sbn;
4801 	if(zenp == ZENKOUHO){
4802 	    buf->orig.zenkouho_dai[m++] = b - buf->orig.zenkouho;
4803 	}
4804 	b0 = b;
4805 	sp1 = sp;
4806 	for(l = 0 ; l < dp[k].sbncnt; l++){
4807 	    *b = get_sho(buf, sp, zenp, DAI, fuku, nhinsi, hlist);
4808 	    if(zenp == ZENKOUHO){
4809 		if (l == dp[k].sbncnt -1){
4810 		    if(buf->orig.zenkouho_endvect != -1){
4811 			(*b)->dai_end = (sp->status_bkwd == WNN_CONNECT_BK)? 0:1;
4812 		    }else{
4813 			(*b)->dai_end = 0;
4814 		    }
4815 		}else{
4816 		    (*b)->dai_end = 0;
4817 		}
4818 	    }
4819 	    b++;
4820 	    sp++;
4821 	}
4822 	(*b0)->dai_top = (sp1->status == WNN_CONNECT)? 0:1;
4823 	(*b0)->daihyoka = dp[k].hyoka;
4824     }
4825     if(zenp == ZENKOUHO){
4826 	buf->orig.zenkouho_dai[m] = b - buf->orig.zenkouho;
4827 	buf->orig.zenkouho_suu = b - buf->orig.zenkouho;
4828 	buf->orig.zenkouho_dai_suu = m;
4829     }
4830     return(cnt + bun_no);
4831 }
4832 
4833 static void
set_sho(b,p)4834 set_sho(b, p)
4835 register WNN_BUN *b;
4836 register WNN_BUN **p;
4837 {
4838     b->ref_cnt++;
4839     *p = b;
4840 }
4841 
4842 static void
set_dai(b,p,n)4843 set_dai(b, p, n)
4844 register WNN_BUN **b;
4845 register WNN_BUN **p;
4846 register int n;
4847 {
4848     for(;n;n--){
4849 	(*b)->ref_cnt++;
4850 	*p++ = *b++;
4851     }
4852 }
4853 
4854 static int
get_c_jikouho_from_zenkouho(buf,dest)4855 get_c_jikouho_from_zenkouho(buf, dest)
4856 struct wnn_buf_mt *buf;
4857 WNN_BUN *dest;
4858 {
4859     register int k;
4860     w_char area[LENGTHKANJI];
4861     w_char area1[LENGTHKANJI];
4862     register WNN_BUN *b;
4863 
4864     wnn_area(dest, area, WNN_KANJI);
4865     for(k = 0; k < buf->orig.zenkouho_suu; k++){
4866 	b = buf->orig.zenkouho[k];
4867 	if(b->entry == dest->entry && b->dic_no == dest->dic_no){
4868 	    wnn_area(b, area1, WNN_KANJI);
4869 	    if(wnn_Strcmp(area, area1) == 0){
4870 		return(k);
4871 	    }
4872 	}
4873     }
4874     return(-1);
4875 }
4876 
4877 static int
get_c_jikouho_from_zenkouho_dai(buf,dest)4878 get_c_jikouho_from_zenkouho_dai(buf, dest)
4879 struct wnn_buf_mt *buf;
4880 WNN_BUN *dest;
4881 {
4882     register int k;
4883     w_char area[LENGTHKANJI];
4884     w_char area1[LENGTHKANJI];
4885     register WNN_BUN *b;
4886     register int l;
4887 
4888     wnn_area(dest, area, WNN_KANJI);
4889     for(k = 0; k < buf->orig.zenkouho_dai_suu; k++){
4890 	b = buf->orig.zenkouho[buf->orig.zenkouho_dai[k]];
4891 	for(l = 0 ; l < buf->orig.zenkouho_dai[k + 1]; l++, dest++, b++){
4892 	    if(b->entry != dest->entry || b->dic_no != dest->dic_no) break;
4893 	    wnn_area(b, area1, WNN_KANJI);
4894 	    if(wnn_Strcmp(area, area1) != 0){
4895 		break;
4896 	    }
4897 	}
4898 	if(l == buf->orig.zenkouho_dai[k + 1]){
4899 	    return(k);
4900 	}
4901     }
4902     return(-1);
4903 }
4904 
4905 
4906 static int
get_c_jikouho(sp,cnt,dest)4907 get_c_jikouho(sp, cnt, dest)
4908 struct wnn_sho_bunsetsu *sp;
4909 int cnt;
4910 WNN_BUN *dest;
4911 {
4912     register int k;
4913     register int len;
4914     w_char area[LENGTHKANJI];
4915 
4916     wnn_area(dest, area, WNN_KANJI);
4917     for(k = 0; k < cnt; k++,sp++){
4918 	if(sp->entry == dest->entry && sp->dic_no == dest->dic_no
4919 	   && sp->kangovect == dest->kangovect){
4920 	    if(wnn_Strncmp(area, sp->kanji, len = wnn_Strlen(sp->kanji)) == 0 &&
4921 	       wnn_Strcmp(area + len, sp->fuzoku) == 0){
4922 		return(k);
4923 	    }
4924 	}
4925     }
4926     return(-1);
4927 }
4928 
4929 static int
get_c_jikouho_dai(dp,cnt,dest,bun_no)4930 get_c_jikouho_dai(dp, cnt, dest, bun_no)
4931 struct wnn_dai_bunsetsu *dp;
4932 int cnt;
4933 WNN_BUN **dest;
4934 int bun_no;
4935 {
4936     register int k, l;
4937     register int len;
4938     w_char area[LENGTHKANJI];
4939     register struct wnn_sho_bunsetsu *sp;
4940 
4941     for(k = 0; k < cnt; k++,dp++){
4942 	sp = dp->sbn;
4943 	for(l = 0 ; l < dp->sbncnt; l++, sp++){
4944 	    if(sp->entry != (dest[bun_no + l])->entry ||
4945 	       sp->kangovect != (dest[bun_no + l])->kangovect ||
4946 	       sp->dic_no != (dest[bun_no + l])->dic_no){
4947 		break;
4948 	    }
4949 	    wnn_area(dest[bun_no + l], area, WNN_KANJI);
4950 	    if(wnn_Strncmp(area, sp->kanji, len = wnn_Strlen(sp->kanji)) != 0 ||
4951 	       wnn_Strcmp(area + len, sp->fuzoku) != 0){
4952 		break;
4953 	    }
4954 	}
4955 	if(l == dp->sbncnt) return(k);
4956     }
4957     return(-1);
4958 }
4959 
4960 
4961 static int
find_same_kouho(sp,st,end,level)4962 find_same_kouho(sp, st, end, level)
4963 struct wnn_sho_bunsetsu *sp;
4964 register WNN_BUN **st, **end;
4965 int level;
4966 {
4967     register int len;
4968     w_char area[LENGTHKANJI];
4969     register WNN_BUN *b;
4970 
4971     if(level == WNN_UNIQ){
4972 	for(; st < end; st++){
4973 	    b = *st;
4974 	    if(sp->hinsi == b->hinsi){
4975 		wnn_area(b, area, WNN_KANJI);
4976 		if(wnn_Strncmp(area, sp->kanji, len = wnn_Strlen(sp->kanji)) == 0 &&
4977 		   wnn_Strcmp(area + len, sp->fuzoku) == 0){
4978 		    return(1);
4979 		}
4980 	    }
4981 	}
4982     }else{ /* level = WNN_UNIQ_KNJ */
4983 	for(; st < end; st++){
4984 	    b = *st;
4985 	    wnn_area(b, area, WNN_KANJI);
4986 	    if(wnn_Strncmp(area, sp->kanji, len = wnn_Strlen(sp->kanji)) == 0 &&
4987 	       wnn_Strcmp(area + len, sp->fuzoku) == 0){
4988 		return(1);
4989 	    }
4990 	}
4991     }
4992     return(0);
4993 }
4994 
4995 static int
find_same_kouho_dai(dp,buf,top,level)4996 find_same_kouho_dai(dp, buf, top, level)
4997 struct wnn_dai_bunsetsu *dp;
4998 struct wnn_buf_mt *buf;
4999 int top;
5000 int level;
5001 {
5002     int len;
5003     register int k, l;
5004     w_char area[LENGTHKANJI];
5005     WNN_BUN *b;
5006     register struct wnn_sho_bunsetsu *sp;
5007 
5008     for(k = 0 ; k < top ; k++){
5009 	for(l = 0,sp = dp->sbn ; l < dp->sbncnt; l++, sp++){
5010 	    b = buf->orig.zenkouho[buf->orig.zenkouho_dai[k] + l];
5011 	    if(sp->end - sp->start + 1 != b->yomilen) break;/* From: tsuiki */
5012 	    if(level != WNN_UNIQ_KNJ){
5013 		if(sp->hinsi != b->hinsi) break;
5014 	    }
5015 	    wnn_area(b, area, WNN_KANJI);
5016 	    if(wnn_Strncmp(area, sp->kanji, len = wnn_Strlen(sp->kanji)) != 0 ||
5017 	       wnn_Strcmp(area + len, sp->fuzoku) != 0){
5018 		break;
5019 	    }
5020 	}
5021 	if(l == dp->sbncnt)
5022 	    return(1);
5023     }
5024     return(0);
5025 }
5026 
5027 int
wnn_cnt_free(buf)5028 wnn_cnt_free(buf)
5029 struct wnn_buf *buf;
5030 {
5031     register int n;
5032     register WNN_BUN *b;
5033 
5034     for(n = 0, b = buf->free_heap;b;n++, b = b->free_next);
5035     return(n);
5036 }
5037 
5038 static struct wnn_jdata *
jl_word_info_e_body(env,dic_no,entry)5039 jl_word_info_e_body(env, dic_no, entry)
5040 register struct wnn_env_int *env;
5041 int dic_no, entry;
5042 {
5043     struct wnn_jdata *x;
5044 
5045     if (js_word_info(env,dic_no, entry, &wordrb) < 0) {
5046 	env_wnn_errorno_copy(env);
5047 	if_dead_disconnect(env);
5048 	return(NULL);
5049     }
5050     x = (struct wnn_jdata *)(wordrb.buf);
5051     return x;
5052 }
5053 
5054 struct wnn_jdata *
jl_word_info_e(env,dic_no,entry)5055 jl_word_info_e(env, dic_no, entry)
5056 register struct wnn_env *env;
5057 int dic_no, entry;
5058 {
5059     struct wnn_jdata *x;
5060 
5061     if(!env) return(NULL);
5062     LockMutex(&ENV_LOCK(env));
5063     env_wnn_errorno_set = 0;
5064     x = jl_word_info_e_body((WNN_ENV_INT *)env, dic_no, entry);
5065     UnlockMutex(&ENV_LOCK(env));
5066     return x;
5067 }
5068 
5069 struct wnn_jdata *
jl_word_info(buf,dic_no,entry)5070 jl_word_info(buf, dic_no, entry)
5071 register struct wnn_buf *buf;
5072 int dic_no, entry;
5073 {
5074     struct wnn_jdata *x;
5075 
5076     if(!buf || !(buf->env)) return(NULL);
5077     LockMutex(&BUF_LOCK(buf));
5078     LockMutex(&(envmt->env_lock));
5079     buf_wnn_errorno_set = 0;
5080     x = jl_word_info_e_body((WNN_ENV_INT *)buf->env, dic_no, entry);
5081     if(x == NULL) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
5082     UnlockMutex(&(envmt->env_lock));
5083     UnlockMutex(&BUF_LOCK(buf));
5084     return x;
5085 }
5086 
5087 /*:::DOC_START
5088  *
5089  *    Function Name: jl_dic_list_e_body
5090  *    Description  : �����������Υ��֥롼����
5091  *    Parameter    :
5092  *         env :     (InOut) �Ķ��ؤΥݥ���
5093  *	   dmask :   (In) ��������ޥ���
5094  *	   dicinfo : (Ont) �ǡ�����������ѹ�¤�ΤؤΥݥ���
5095  *
5096  *    Return value : -1==ERROR, else ��Ͽ�����
5097  *
5098  *    Author      :  Hideyuki Kishiba
5099  *
5100  *    Revision history:
5101  *
5102  *:::DOC_END
5103  */
5104 static int
jl_dic_list_e_body(env,dmask,dicinfo)5105 jl_dic_list_e_body(env, dmask, dicinfo)
5106 struct wnn_env_int *env;
5107 unsigned long dmask;
5108 WNN_DIC_INFO **dicinfo;
5109 {
5110     WNN_DIC_INFO *info;
5111     int cnt;
5112     register int k;
5113     register char *c;
5114 
5115     if(dmask == 0)
5116         cnt = js_dic_list(env, &dicrb);
5117     else
5118         cnt = js_fi_dic_list(env, dmask, &dicrb);
5119 
5120     if (cnt < 0) {
5121 	env_wnn_errorno_copy(env);
5122 	if_dead_disconnect(env);
5123 	return(-1);
5124     }
5125     info = (WNN_DIC_INFO *)(dicrb.buf);
5126 
5127 /* If the file is loaded from this client, change the file name to the one
5128    used in loading it. */
5129     LockMutex(&envs_lock);
5130     for(k = 0 ; k < cnt ; k++){
5131 	c = find_file_name_from_id(env, info[k].body);
5132 	if(c != NULL){
5133 	    strcpy(info[k].fname, c);
5134 	}
5135 
5136 	c = find_file_name_from_id(env, info[k].hindo);
5137 	if(c != NULL){
5138 	    strcpy(info[k].hfname, c);
5139 	}
5140     }
5141 
5142     *dicinfo = info;
5143     UnlockMutex(&envs_lock);
5144     return(cnt);
5145 } /* End of jl_dic_list_e_body */
5146 
5147 /*:::DOC_START
5148  *
5149  *    Function Name: jl_dic_list_e
5150  *    Description  : �Ķ�����Ͽ����Ƥ���ף�����������
5151  *    Parameter    :
5152  *         env :     (InOut) �Ķ��ؤΥݥ���
5153  *         dicinfo : (Ont) �ǡ�����������ѹ�¤�ΤؤΥݥ���
5154  *
5155  *    Return value : -1==ERROR, else ��Ͽ�����
5156  *
5157  *    Author      :  Hideyuki Kishiba
5158  *
5159  *    Revision history:
5160  *
5161  *:::DOC_END
5162  */
5163 int
jl_dic_list_e(env,dicinfo)5164 jl_dic_list_e(env, dicinfo)
5165 struct wnn_env *env;
5166 WNN_DIC_INFO **dicinfo;
5167 {
5168     int x;
5169 
5170     if(!env) return(-1);
5171     LockMutex(&ENV_LOCK(env));
5172     env_wnn_errorno_set = 0;
5173     x = jl_dic_list_e_body((WNN_ENV_INT *)env, 0, dicinfo);
5174     UnlockMutex(&ENV_LOCK(env));
5175     return x;
5176 } /* End of jl_dic_list_e */
5177 
5178 /*:::DOC_START
5179  *
5180  *    Function Name: jl_dic_list
5181  *    Description  : �Ķ�����Ͽ����Ƥ���ף�����������
5182  *    Parameter    :
5183  *         buf : (InOut) �Хåե��ؤΥݥ���
5184  *         dip : (Ont) �ǡ�����������ѹ�¤�ΤؤΥݥ���
5185  *
5186  *    Return value : -1==ERROR, else ��Ͽ�����
5187  *
5188  *    Author      :  Hideyuki Kishiba
5189  *
5190  *    Revision history:
5191  *
5192  *:::DOC_END
5193  */
5194 int
jl_dic_list(buf,dip)5195 jl_dic_list(buf, dip)
5196 register struct wnn_buf *buf;
5197 WNN_DIC_INFO **dip;
5198 {
5199     int x;
5200 
5201     if(!buf || !(buf->env)) return(-1);
5202     LockMutex(&BUF_LOCK(buf));
5203     LockMutex(&(envmt->env_lock));
5204     buf_wnn_errorno_set = 0;
5205     x = jl_dic_list_e_body((WNN_ENV_INT *)buf->env, 0, dip);
5206     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
5207     UnlockMutex(&(envmt->env_lock));
5208     UnlockMutex(&BUF_LOCK(buf));
5209     return x;
5210 } /* End of jl_dic_list */
5211 
5212 /*:::DOC_START
5213  *
5214  *    Function Name: jl_fi_dic_list_e
5215  *    Description  : �Ķ�����Ͽ����Ƥ��뼭����⡢���ꤷ��������
5216  *		     ���������
5217  *    Parameter    :
5218  *         env :     (InOut) �Ķ��ؤΥݥ���
5219  *	   dmask :   (In) ��������ޥ���
5220  *         dicinfo : (Ont) �ǡ�����������ѹ�¤�ΤؤΥݥ���
5221  *
5222  *    Return value : -1==ERROR, else ��Ͽ�����
5223  *
5224  *    Author      :  Hideyuki Kishiba
5225  *
5226  *    Revision history:
5227  *
5228  *:::DOC_END
5229  */
5230 int
jl_fi_dic_list_e(env,dmask,dicinfo)5231 jl_fi_dic_list_e(env, dmask, dicinfo)
5232 struct wnn_env *env;
5233 unsigned long dmask;
5234 WNN_DIC_INFO **dicinfo;
5235 {
5236     int x;
5237 
5238     if(!env) return(-1);
5239     LockMutex(&ENV_LOCK(env));
5240     env_wnn_errorno_set = 0;
5241     x = jl_dic_list_e_body((WNN_ENV_INT *)env, dmask, dicinfo);
5242     UnlockMutex(&ENV_LOCK(env));
5243     return x;
5244 } /* End of jl_fi_dic_list_e */
5245 
5246 /*:::DOC_START
5247  *
5248  *    Function Name: jl_fi_dic_list
5249  *    Description  : �Ķ�����Ͽ����Ƥ��뼭����⡢���ꤷ��������
5250  *                   ���������
5251  *    Parameter    :
5252  *         buf :   (InOut) �Хåե��ؤΥݥ���
5253  *	   dmask : (In) ��������ޥ���
5254  *         dip :   (Ont) �ǡ�����������ѹ�¤�ΤؤΥݥ���
5255  *
5256  *    Return value : -1==ERROR, else ��Ͽ�����
5257  *
5258  *    Author      :  Hideyuki Kishiba
5259  *
5260  *    Revision history:
5261  *
5262  *:::DOC_END
5263  */
5264 int
jl_fi_dic_list(buf,dmask,dip)5265 jl_fi_dic_list(buf, dmask, dip)
5266 register struct wnn_buf *buf;
5267 unsigned long dmask;
5268 WNN_DIC_INFO **dip;
5269 {
5270     int x;
5271 
5272     if(!buf || !(buf->env)) return(-1);
5273     LockMutex(&BUF_LOCK(buf));
5274     LockMutex(&(envmt->env_lock));
5275     buf_wnn_errorno_set = 0;
5276     x = jl_dic_list_e_body((WNN_ENV_INT *)buf->env, dmask, dip);
5277     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
5278     UnlockMutex(&(envmt->env_lock));
5279     UnlockMutex(&BUF_LOCK(buf));
5280     return x;
5281 } /* End of jl_fi_dic_list */
5282 
5283 /*:::DOC_START
5284  *
5285  *    Function Name: jl_fuzokugo_list_e_body
5286  *    Description  : ��°���������Υ��֥롼����
5287  *    Parameter    :
5288  *         env :     (InOut) �Ķ��ؤΥݥ���
5289  *         curfzk :  (Out) ���߻��ѥե����뼱�̻�
5290  *         fzkinfo : (Out) ��°������������ѹ�¤�ΤؤΥݥ���
5291  *
5292  *    Return value : -1==ERROR, else �ɹ�����°���
5293  *
5294  *    Author      :  Hideyuki Kishiba
5295  *
5296  *    Revision history:
5297  *
5298  *:::DOC_END
5299  */
5300 static int
jl_fuzokugo_list_e_body(env,curfzk,fzkinfo)5301 jl_fuzokugo_list_e_body(env, curfzk, fzkinfo)
5302 struct wnn_env *env;
5303 int *curfzk;
5304 WNN_FZK_INFO **fzkinfo;
5305 {
5306     int cnt;
5307 
5308     if((cnt = js_fuzokugo_list(env, curfzk, fzkinfo)) < 0) {
5309 	env_wnn_errorno_copy(env);
5310         if_dead_disconnect(env);
5311         return(-1);
5312     }
5313     return(cnt);
5314 } /* End of jl_fuzokugo_list_e_body */
5315 
5316 /*:::DOC_START
5317  *
5318  *    Function Name: jl_fuzokugo_list_e
5319  *    Description  : ���ꤵ�줿�����Ф��ɤ߹��ޤ�Ƥ�������°������
5320  *                   �Ķ��˸������ꤵ��Ƥ������μ��̻Ҥ��֤�
5321  *    Parameter    :
5322  *         env :     (In) �Ķ��ؤΥݥ���
5323  *         curfzk :  (Out) ���߻��ѥե����뼱�̻�
5324  *         fzkinfo : (Out) �ǡ�����������ѹ�¤�ΤؤΥݥ���
5325  *
5326  *    Return value : -1==ERROR, else �ɹ�����°���
5327  *
5328  *    Author      :  Hideyuki Kishiba
5329  *
5330  *    Revision history:
5331  *
5332  *:::DOC_END
5333  */
5334 int
jl_fuzokugo_list_e(env,curfzk,fzkinfo)5335 jl_fuzokugo_list_e(env, curfzk, fzkinfo)
5336 struct wnn_env *env;
5337 int *curfzk;
5338 WNN_FZK_INFO **fzkinfo;
5339 {
5340     int x;
5341 
5342     if(!env) return(-1);
5343     LockMutex(&ENV_LOCK(env));
5344     env_wnn_errorno_set = 0;
5345     x = jl_fuzokugo_list_e_body((WNN_ENV_INT *)env, curfzk, fzkinfo);
5346     UnlockMutex(&ENV_LOCK(env));
5347     return x;
5348 } /* End of jl_fuzokugo_list_e */
5349 
5350 /*:::DOC_START
5351  *
5352  *    Function Name: jl_fuzokugo_list
5353  *    Description  : ���ꤵ�줿�����Ф��ɤ߹��ޤ�Ƥ�������°������
5354  *                   �Ķ��˸������ꤵ��Ƥ������μ��̻Ҥ��֤�
5355  *    Parameter    :
5356  *         buf :    (In) �Хåե��ؤΥݥ���
5357  *         curfzk : (Out) ���߻��ѥե����뼱�̻�
5358  *         fzkp :   (Out) �ǡ�����������ѹ�¤�ΤؤΥݥ���
5359  *
5360  *    Return value : -1==ERROR, else �ɹ�����°���
5361  *
5362  *    Author      :  Hideyuki Kishiba
5363  *
5364  *    Revision history:
5365  *
5366  *:::DOC_END
5367  */
5368 int
jl_fuzokugo_list(buf,curfzk,fzkp)5369 jl_fuzokugo_list(buf, curfzk, fzkp)
5370 register struct wnn_buf *buf;
5371 int *curfzk;
5372 WNN_FZK_INFO **fzkp;
5373 {
5374     int x;
5375 
5376     if(!buf || !(buf->env)) return(-1);
5377     LockMutex(&BUF_LOCK(buf));
5378     LockMutex(&(envmt->env_lock));
5379     buf_wnn_errorno_set = 0;
5380     x = jl_fuzokugo_list_e_body((WNN_ENV_INT *)buf->env, curfzk, fzkp);
5381     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
5382     UnlockMutex(&(envmt->env_lock));
5383     UnlockMutex(&BUF_LOCK(buf));
5384     return x;
5385 } /* End of jl_fuzokugo_list */
5386 
5387 /*:::DOC_START
5388  *
5389  *    Function Name: jl_free
5390  *    Description  : �Ѵ��ʻ������°������ free ����
5391  *    Parameter    :
5392  *	   ptr : �оݥݥ���
5393  *
5394  *    Return value : 0==SUCCESS, -1==ERROR
5395  *
5396  *    Author      :  Hideyuki Kishiba
5397  *
5398  *    Revision history:
5399  *
5400  *:::DOC_END
5401  */
5402 int
jl_free(ptr)5403 jl_free(ptr)
5404 char *ptr;
5405 {
5406     free(ptr);
5407     return(0);
5408 } /* End of jl_free */
5409 
5410 
5411 static int
sort_func_ws(a,b)5412 sort_func_ws(a,b)
5413 register char *a, *b;
5414 {
5415     int ah, bh, ai, bi, iah, ibh, iai, ibi;
5416     ah = ((struct wnn_jdata *)a)->hindo;
5417     bh = ((struct wnn_jdata *)b)->hindo;
5418     iah = ((struct wnn_jdata *)a)->int_hindo;
5419     ibh = ((struct wnn_jdata *)b)->int_hindo;
5420     ai = ((struct wnn_jdata *)a)->ima;
5421     bi = ((struct wnn_jdata *)b)->ima;
5422     iai = ((struct wnn_jdata *)a)->int_ima;
5423     ibi = ((struct wnn_jdata *)b)->int_ima;
5424 
5425     if(ai == WNN_IMA_OFF && ah == WNN_ENTRY_NO_USE) return(1);
5426     if(bi == WNN_IMA_OFF && bh == WNN_ENTRY_NO_USE) return(-1);
5427     if(iai == WNN_IMA_OFF && iah == WNN_ENTRY_NO_USE) return(1);
5428     if(ibi == WNN_IMA_OFF && ibh == WNN_ENTRY_NO_USE) return(-1);
5429 
5430     if(ai != bi){
5431 	if(ai < bi) return(1);
5432 	return(-1);
5433     }
5434     if(iah >= 0){
5435 	ah += iah;
5436 	bh += ibh;
5437     }
5438     if(ah > bh)return(-1);
5439     if(ah < bh)return(1);
5440     return(0);
5441 }
5442 
5443 static int
jl_word_search_e_body(env,dic_no,yomi,jdp)5444 jl_word_search_e_body(env,dic_no, yomi, jdp)
5445 register struct wnn_env_int *env;
5446 int dic_no;
5447 w_char *yomi;
5448 struct wnn_jdata **jdp;
5449 {
5450     register int cnt;
5451     struct wnn_jdata *jd;
5452 
5453     if ((cnt = js_word_search(env,dic_no, yomi, &wordrb)) < 0) {
5454 	env_wnn_errorno_copy(env);
5455 	if_dead_disconnect(env);
5456 	return(-1);
5457     }
5458     jd = (struct wnn_jdata *)wordrb.buf;
5459     qsort((char *)jd,cnt,sizeof(struct wnn_jdata),sort_func_ws);
5460     *jdp = jd;
5461     return(cnt);
5462 }
5463 
5464 int
jl_word_search_e(env,dic_no,yomi,jdp)5465 jl_word_search_e(env,dic_no, yomi, jdp)
5466 register struct wnn_env *env;
5467 int dic_no;
5468 w_char *yomi;
5469 struct wnn_jdata **jdp;
5470 {
5471     int x;
5472 
5473     if(!env) return(-1);
5474     LockMutex(&ENV_LOCK(env));
5475     env_wnn_errorno_set = 0;
5476     x = jl_word_search_e_body((WNN_ENV_INT *)env,dic_no, yomi, jdp);
5477     UnlockMutex(&ENV_LOCK(env));
5478     return x;
5479 }
5480 
5481 int
jl_word_search(buf,dic_no,yomi,jdp)5482 jl_word_search(buf, dic_no, yomi, jdp)
5483 register struct wnn_buf *buf;
5484 int dic_no;
5485 w_char *yomi;
5486 struct wnn_jdata **jdp;
5487 {
5488     int x;
5489 
5490     if(!buf || !(buf->env)) return(-1);
5491     LockMutex(&BUF_LOCK(buf));
5492     LockMutex(&(envmt->env_lock));
5493     buf_wnn_errorno_set = 0;
5494     x = jl_word_search_e_body((WNN_ENV_INT *)buf->env, dic_no, yomi, jdp);
5495     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
5496     UnlockMutex(&(envmt->env_lock));
5497     UnlockMutex(&BUF_LOCK(buf));
5498     return x;
5499 }
5500 
5501 static int
jl_word_search_by_env_e_body(env,yomi,jdp)5502 jl_word_search_by_env_e_body(env, yomi, jdp)
5503 register struct wnn_env_int *env;
5504 struct wnn_jdata **jdp;
5505 w_char *yomi;
5506 {
5507     register int cnt;
5508     struct wnn_jdata *jd;
5509 
5510     if ((cnt = js_word_search_by_env(env, yomi, &wordrb)) < 0) {
5511 	env_wnn_errorno_copy(env);
5512 	if_dead_disconnect(env);
5513 	return(-1);
5514     }
5515     jd = (struct wnn_jdata *)wordrb.buf;
5516     qsort((char *)jd,cnt,sizeof(struct wnn_jdata),sort_func_ws);
5517     *jdp = jd;
5518     return(cnt);
5519 }
5520 
5521 int
jl_word_search_by_env_e(env,yomi,jdp)5522 jl_word_search_by_env_e(env, yomi, jdp)
5523 register struct wnn_env *env;
5524 struct wnn_jdata **jdp;
5525 w_char *yomi;
5526 {
5527     int x;
5528 
5529     if(!env) return(-1);
5530     LockMutex(&ENV_LOCK(env));
5531     env_wnn_errorno_set = 0;
5532     x = jl_word_search_by_env_e_body((WNN_ENV_INT *)env, yomi, jdp);
5533     UnlockMutex(&ENV_LOCK(env));
5534     return x;
5535 }
5536 
5537 int
jl_word_search_by_env(buf,yomi,jdp)5538 jl_word_search_by_env(buf, yomi, jdp)
5539 register struct wnn_buf *buf;
5540 struct wnn_jdata **jdp;
5541 w_char *yomi;
5542 {
5543     int x;
5544 
5545     if(!buf || !(buf->env)) return(-1);
5546     LockMutex(&BUF_LOCK(buf));
5547     LockMutex(&(envmt->env_lock));
5548     buf_wnn_errorno_set = 0;
5549     x = jl_word_search_by_env_e_body((WNN_ENV_INT *)buf->env, yomi, jdp);
5550     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
5551     UnlockMutex(&(envmt->env_lock));
5552     UnlockMutex(&BUF_LOCK(buf));
5553     return x;
5554 }
5555 
5556 
5557 
5558 static void
add_down_bnst(buf,k,b)5559 add_down_bnst(buf, k, b)
5560 register struct wnn_buf_mt *buf;
5561 register int k;
5562 register WNN_BUN *b;
5563 {
5564     if(b->down) return; /* In order to prevent roop! */
5565     if(b == buf->orig.down_bnst[k]) return; /* In order to prevent roop! */
5566 				/* It occurs when Zenkouho-->Nobi-conv */
5567     b->down = buf->orig.down_bnst[k];
5568     buf->orig.down_bnst[k] = b;
5569     b->ref_cnt ++;
5570 }
5571 
5572 
5573 #define REAL_PARAM(x) (strcmp(x, "-"))
5574 
5575 /** wnnrc ���ƤΥѥ�᡼�������� */
5576 int
jl_set_env_wnnrc(env,wnnrc_n,error_handler,message_handler)5577 jl_set_env_wnnrc(env, wnnrc_n, error_handler, message_handler)
5578 register struct wnn_env *env;
5579 char *wnnrc_n;
5580 int  (*error_handler)(), (*message_handler)();
5581 {
5582     int level = 0;
5583     int x;
5584 
5585     if(!env) return(-1);
5586     LockMutex(&ENV_LOCK(env));
5587     env_wnn_errorno_set = 0;
5588     if((int)error_handler ==  WNN_CREATE){
5589 	confirm_state = CREATE_WITHOUT_CONFIRM;
5590     }else if((int)error_handler ==  WNN_NO_CREATE){
5591 	confirm_state = NO_CREATE;
5592     }else{
5593 	confirm_state = CONFIRM;
5594     }
5595 
5596     x = jl_set_env_wnnrc1_body((WNN_ENV_INT *)env, wnnrc_n, error_handler, message_handler, level, 0);
5597 
5598     confirm_state = 0;
5599     UnlockMutex(&ENV_LOCK(env));
5600     return(x);
5601 }
5602 
5603 static int
jl_set_env_wnnrc1_body(env,wnnrc_n,error_handler,message_handler,level,local)5604 jl_set_env_wnnrc1_body(env, wnnrc_n, error_handler, message_handler, level, local)
5605 register struct wnn_env_int *env;
5606 char *wnnrc_n;
5607 int  (*error_handler)(), (*message_handler)();
5608 int level;
5609 int local;
5610 {
5611     register int num, rev, prio;
5612     char s[20][EXPAND_PATH_LENGTH];
5613     char code[EXPAND_PATH_LENGTH];
5614     char tmp[1024];
5615     int tmplen;
5616     register FILE *fp;
5617     unsigned long vmask = 0;
5618     int *flag;
5619     struct wnn_henkan_env henv;
5620     int  (*error_handler1)() = (int (*)())0;
5621     char *p;
5622     extern char *getenv();
5623 
5624     if(level > MAXINCLUDE){
5625 	LockMutex(&msg_lock);
5626 	message_out(message_handler,
5627 		    msg_get(wnn_msg_cat, 206, NULL, env->orig.lang, NULL));
5628 		    /*
5629 		    "include �Υ�٥뤬¿�᤮�ޤ���"
5630 		    */
5631 	UnlockMutex(&msg_lock);
5632 	return(-1);
5633     }
5634     if (!strcmp(wnnrc_n, DEFAULT_RC_NAME)) {
5635 	/*
5636 	 * �ǥե���Ȥ�wnnenvrc��õ���˹Ԥ�
5637          */
5638 	if(!(p = getenv("HOME")))
5639 	    goto Default_WNVRC;
5640 	tmplen = sizeof(tmp);
5641 	strncpy(tmp, p, tmplen - 1);
5642 	tmp[tmplen - 1] = 0;
5643 	if (strlen(tmp) + strlen(FIWNN_DIR) >= tmplen)
5644 	    goto Default_WNVRC;
5645 	strcat(tmp, FIWNN_DIR);
5646 	if (strlen(tmp) + strlen(ENVRCFILE) >= tmplen)
5647 	    goto Default_WNVRC;
5648 	strcat(tmp, ENVRCFILE);
5649 	if ((fp = fopen(tmp, "r")) == NULL) {
5650 Default_WNVRC:
5651 	    /*
5652 	     * �桼���Υǥե���ȥե����뤬̵���ä��Τǡ������ƥ�Υǥե���Ȥ�
5653 	     * ���˹Ԥ�
5654 	     */
5655 	        sprintf(tmp, "%s/%s%s", LIBDIR, WNN_DEFAULT_LANG, ENVRCFILE);
5656 	        /* /usr/local/lib/wnn/ja_JP/wnnenvrc */
5657 	        if((fp = fopen(tmp, "r")) == NULL) {
5658 		    /*
5659 		     * �����ƥ�Υǥե���Ȥ�ʤ��ä��Τǥ��顼�ˤ���
5660 		     */
5661 		    message_out(message_handler,
5662 		    	    msg_get(wnn_msg_cat, 111, NULL, env->orig.lang,
5663 		    		    NULL));
5664 		    UnlockMutex(&msg_lock);
5665 		    return(-1);
5666 	        }
5667 	}
5668     } else {
5669 	if((fp = fopen(wnnrc_n, "r")) == NULL){
5670 	    LockMutex(&msg_lock);
5671 	    /*
5672 	     * ���ꤵ�줿wnnennvrc�������ץ�Ǥ��ʤ�
5673              */
5674 	    message_out(message_handler,
5675 			msg_get(wnn_msg_cat, 207, NULL, env->orig.lang, NULL),
5676 			wnnrc_n);
5677 	    UnlockMutex(&msg_lock);
5678 	    return(-1);
5679 	}
5680     }
5681     while(fgets(tmp,1024,fp  ) != NULL){
5682 	num = sscanf(tmp,
5683 	"%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s",code,
5684 		     s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],
5685 		     s[11],s[12],s[13],s[14],s[15],s[16],s[17],s[18],s[19]) ;
5686 	if (num <= 0) {
5687 	    continue;
5688 	}
5689 	if(code[0] == ';'){
5690 	    continue;
5691 	}else if (strcmp(code, "include") == 0){
5692 	    expand_expr_all(s[0], env);
5693 	    if(jl_set_env_wnnrc1_body(env, s[0], error_handler,
5694 				      message_handler, level + 1,
5695 				      local) == -1){
5696 		fclose(fp);
5697 		return(-1);
5698 	    }
5699 	    continue;
5700 	}
5701 	switch (code[0]) {
5702 	case 'a':
5703 	    if (!strcmp(code, "autosave")) env->orig.autosave = atoi(s[0]);
5704 	    break;
5705 	case 'k':
5706 	    if (!strcmp(code, "kutouten")) {
5707 		/* ������ */
5708 		if (num < 2) goto _Err_happend;
5709 		vmask |= WNN_ENV_KUTOUTEN_MASK;
5710 		flag = &henv.kutouten_flag;
5711 		goto _set_flag;
5712 	    } else if (!strcmp(code, "kakko")) {
5713 		/* ��� */
5714 		if (num < 2) goto _Err_happend;
5715 		vmask |= WNN_ENV_KAKKO_MASK;
5716 		flag = &henv.kakko_flag;
5717 		goto _set_flag;
5718 	    } else if (!strcmp(code, "kigou")) {
5719 		/* ���� */
5720 		if (num < 2) goto _Err_happend;
5721 		vmask |= WNN_ENV_KIGOU_MASK;
5722 		flag = &henv.kigou_flag;
5723 		goto _set_flag;
5724 	    }
5725 	}
5726 	if (local == 0) {
5727 	    switch (code[0]) {
5728 	    case 'b':
5729 		if (!strcmp(code, "bunsetsugiri_gakusyuu")) {
5730 		    int dic_no, mode, type;
5731 AUTO_LEARNING:
5732 		    if (num < 6) goto _Err_happend;
5733 		    if (!strcmp(code, "muhenkan_gakusyuu")) {
5734 			type = WNN_MUHENKAN_LEARNING;
5735 		    } else {
5736 			type = WNN_BUNSETSUGIRI_LEARNING;
5737 		    }
5738 		    if (((dic_no = js_get_autolearning_dic(env, type)) == -1)
5739 			&& env_wnn_errorno_eql) {
5740 			if (env_wnn_errorno_eql != WNN_JSERVER_DEAD) {
5741 			    message_out(message_handler, "%s :%s\n", s[0],
5742 					wnn_perror_lang(env->orig.lang, env));
5743 			} else
5744 			message_out(message_handler, "%s\n",
5745 				    wnn_perror_lang(env->orig.lang, env));
5746 			goto _Err_happend;
5747 		    }
5748 		    expand_expr_all(s[0], env);
5749 		    mode = atoi(s[1]);
5750 		    if ((mode > 2) || (mode < 0)) goto _Err_happend;
5751 		    if (!REAL_PARAM(s[3])) {
5752 			s[3][0] = '\0';
5753 		    } else {
5754 			expand_expr_all(s[3], env);
5755 		    }
5756 		    if (dic_no == WNN_NO_LEARNING) {
5757 			/* �ޤ��������ɤ��Ƥ��ʤ��Τǡ����ɤ��� */
5758 			prio = REAL_PARAM(s[2])? atoi(s[2]) :
5759 			WNN_DIC_PRIO_DEFAULT;
5760 			rev = REAL_PARAM(s[4])? atoi(s[4]) : 0;
5761 			/* ��ư�ؽ��μ���Ͼ���˺�� */
5762 			if (((dic_no = jl_dic_add_e_body(env, s[0], NULL, rev,
5763 							 prio, 0, 0, NULL,
5764 							 NULL,
5765 							 (int (*)())WNN_CREATE,
5766 							 message_handler))
5767 			     == -1) && (env_wnn_errorno_eql != 0)) {
5768 			    if (env_wnn_errorno_eql != WNN_JSERVER_DEAD) {
5769 				message_out(message_handler, "%s :%s\n", s[0],
5770 					    wnn_perror_lang(env->orig.lang,
5771 							    env));
5772 			    } else
5773 			    message_out(message_handler, "%s\n",
5774 					wnn_perror_lang(env->orig.lang, env));
5775 			    goto _Err_happend;
5776 			}
5777 			js_set_autolearning_dic(env, type, dic_no);
5778 		    }
5779 		    if (!js_is_loaded_temporary_dic(env)) {
5780 			/* �ޤ��ƥ�ݥ�꼭�����ɤ��Ƥ��ʤ��Τǡ�
5781 			   ���ɤ��� */
5782 			if ((js_temporary_dic_add(env, rev) == -1) &&
5783 			    (env_wnn_errorno_eql != 0)){
5784 			    if (env_wnn_errorno_eql == WNN_NOT_SUPPORT_PACKET){
5785 				message_out(message_handler,
5786 					    msg_get(wnn_msg_cat, 211,
5787 	 "You can not temporary dictionary because server's version is old.",
5788 						    env->orig.lang, NULL));
5789 				continue;
5790 			    } else if (env_wnn_errorno_eql !=
5791 				       WNN_JSERVER_DEAD) {
5792 				message_out(message_handler, "%s :%s\n", s[0],
5793 					    wnn_perror_lang(env->orig.lang,
5794 							    env));
5795 			    } else
5796 			    message_out(message_handler, "%s\n",
5797 					wnn_perror_lang(env->orig.lang, env));
5798 			    goto _Err_happend;
5799 			}
5800 		    }
5801 		    /* �ؽ��Υ⡼�ɤ����ꤹ�� */
5802 		    if (type == WNN_MUHENKAN_LEARNING) {
5803 			henv.muhenkan_flag = mode;
5804 			vmask |= WNN_ENV_MUHENKAN_LEARN_MASK;
5805 		    } else {
5806 			henv.bunsetsugiri_flag = mode;
5807 			vmask |= WNN_ENV_BUNSETSUGIRI_LEARN_MASK;
5808 		    }
5809 		}
5810 		break;
5811 
5812 	    case 'c':
5813 		if (!strcmp(code, "confirm")){
5814 		    confirm_state = CONFIRM;
5815 		} else if (!strcmp(code, "confirm1")) {
5816 		    confirm_state = CONFIRM1;
5817 		} else if (!strcmp(code, "create_without_confirm")) {
5818 		    confirm_state = CREATE_WITHOUT_CONFIRM;
5819 		}
5820 		break;
5821 
5822 	    case 'f':
5823 		if (!strcmp(code, "fi_hindo_kakuritu")) {
5824 		    /* �ף��ƣɴط����پ徺��Ψ�ؿ� */
5825 		    int is_wnn;
5826 HINDO_KAKURITU:
5827 		    if(!strcmp(code, "hindo_kakuritu")) {
5828 			flag = &henv.freq_func_flag;
5829 			is_wnn = 1;
5830 		    } else {
5831 			flag = &henv.fi_freq_func_flag;
5832 			is_wnn = 0;
5833 		    }
5834 		    switch (s[0][0]) {
5835 		    case 'n':
5836 		    case 'N':
5837 			if(!strncmp(s[0], "not", 3) ||
5838 			   !strncmp(s[0], "NOT", 3)) {
5839 			    /* ���ٳؽ����ʤ� */
5840 			    *flag = WNN_HINDO_NOT;
5841 			} else {
5842 			    /* ���̳ؽ� */
5843 			    *flag = WNN_HINDO_NORMAL;
5844 			}
5845 			break;
5846 		    case 'a':
5847 		    case 'A':
5848 			/* ɬ�����ٳؽ����� */
5849 			*flag = WNN_HINDO_ALWAYS;
5850 			break;
5851 		    case 'h':
5852 		    case 'H':
5853 			/* �����Ҥ��ؽ� */
5854 			*flag = WNN_HINDO_HIGH;
5855 			break;
5856 		    case 'l':
5857 		    case 'L':
5858 			/* ���露��ؽ� */
5859 			*flag = WNN_HINDO_LOW;
5860 			break;
5861 		    default:
5862 			goto _Err_happend;
5863 		    }
5864 		    if(is_wnn) vmask |= WNN_ENV_FREQ_FUNC_MASK;
5865 		    else vmask |= WNN_ENV_FI_FREQ_FUNC_MASK;
5866 		    break;
5867 		} else if (!strcmp(code, "fukugou_yuusen")) {
5868 		    /* ʣ���ͥ���Ѵ� */
5869 		    if (num < 2) goto _Err_happend;
5870 		    vmask |= WNN_ENV_COMPLEX_CONV_MASK;
5871 		    flag = &henv.complex_flag;
5872 		    goto _set_flag;
5873 		}
5874 		break;
5875 	    case 'g':
5876 		if (!strcmp(code, "giji_number")) {
5877 		    /* ���������ν��ɽ����ˡ */
5878 		    switch (s[0][0]) {
5879 		    case 'k':
5880 		    case 'K':
5881 			if(!strcmp(s[0], "kansuuji")||
5882 			   !strcmp(s[0], "KANSUUJI")) {
5883 			    henv.numeric_flag = WNN_NUM_KANSUUJI;
5884 			} else if(!strcmp(s[0], "kanold") ||
5885 				  !strcmp(s[0], "KANOLD")) {
5886 			    henv.numeric_flag = WNN_NUM_KANOLD;
5887 			} else if(!strcmp(s[0], "kan") ||
5888 				  !strcmp(s[0], "KAN")) {
5889 			    henv.numeric_flag = WNN_NUM_KAN;
5890 			}
5891 			break;
5892 		    case 'h':
5893 		    case 'H':
5894 			if(!strcmp(s[0], "hancan") ||
5895 			   !strcmp(s[0], "HANCAN")) {
5896 			    henv.numeric_flag = WNN_NUM_HANCAN;
5897 			} else if(!strcmp(s[0], "han") ||
5898 				  !strcmp(s[0], "HAN")) {
5899 			    henv.numeric_flag = WNN_NUM_HAN;
5900 			}
5901 			break;
5902 		    case 'z':
5903 		    case 'Z':
5904 			if(!strcmp(s[0], "zencan") ||
5905 			   !strcmp(s[0], "ZENCAN")) {
5906 			    henv.numeric_flag = WNN_NUM_ZENCAN;
5907 			} else if(!strcmp(s[0], "zen") ||
5908 				  !strcmp(s[0], "ZEN")) {
5909 			    henv.numeric_flag = WNN_NUM_ZEN;
5910 			}
5911 			break;
5912 		    default:
5913 			goto _Err_happend;
5914 		    }
5915 		    vmask |= WNN_ENV_NUMERIC_MASK;
5916 		} else if (!strcmp(code, "giji_eisuu")) {
5917 		    /* ��������ե��٥åȤν��ɽ����ˡ */
5918 		    switch (s[0][0]) {
5919 		    case 'h':
5920 		    case 'H':
5921 			henv.alphabet_flag = WNN_ALP_HAN;
5922 			break;
5923 		    case 'z':
5924 		    case 'Z':
5925 			henv.alphabet_flag = WNN_ALP_ZEN;
5926 			break;
5927 		    default:
5928 			goto _Err_happend;
5929 		    }
5930 		    vmask |= WNN_ENV_ALPHABET_MASK;
5931 		} else if (!strcmp(code, "giji_kigou")) {
5932 		    /* ��������ν��ɽ����ˡ */
5933 		    switch (s[0][0]) {
5934 		    case 'h':
5935 		    case 'H':
5936 			henv.symbol_flag = WNN_KIG_HAN;
5937 			break;
5938 		    case 'j':
5939 		    case 'J':
5940 			henv.symbol_flag = WNN_KIG_JIS;
5941 			break;
5942 		    case 'a':
5943 		    case 'A':
5944 			henv.symbol_flag = WNN_KIG_ASC;
5945 			break;
5946 		    default:
5947 			goto _Err_happend;
5948 		    }
5949 		    vmask |= WNN_ENV_SYMBOL_MASK;
5950 		}
5951 		break;
5952 	    case 'h':
5953 		if (!strcmp(code, "hindo_kakuritu")) {
5954 		    goto HINDO_KAKURITU;
5955 		} else if (strcmp(code, "hanyou_gakusyu") == 0) {
5956 		    /* ���Ѹ�ؽ� */
5957 		    if (num < 2) goto _Err_happend;
5958 		    vmask |= WNN_ENV_COMMON_LAERN_MASK;
5959 		    flag = &henv.common_learn_flag;
5960 		    goto _set_flag;
5961 		}
5962 		break;
5963 	    case 'm':
5964 		if (!strcmp(code, "muhenkan_gakusyuu")) {
5965 		    goto AUTO_LEARNING;
5966 		}
5967 		break;
5968 	    case 'n':
5969 		if (strcmp(code, "no_create") == 0){
5970 		    confirm_state = NO_CREATE;
5971 		}
5972 		break;
5973 	    case 'o':
5974 		if (strcmp(code, "okuri_gakusyu") == 0) {
5975 		    /* ������ؽ� */
5976 		    if (num < 2) goto _Err_happend;
5977 		    vmask |= WNN_ENV_OKURI_LEARN_MASK;
5978 		    flag = &henv.okuri_learn_flag;
5979 		    goto _set_flag;
5980 		} else if (strcmp(code, "okuri_kijun") == 0) {
5981 		    /* ��������� */
5982 		    switch (s[0][0]) {
5983 		    case 'r':
5984 		    case 'R':
5985 			/* ��§ */
5986 			henv.okuri_flag = WNN_OKURI_REGULATION;
5987 			break;
5988 		    case 'n':
5989 		    case 'N':
5990 			/* ����ʤ� */
5991 			henv.okuri_flag = WNN_OKURI_NO;
5992 			break;
5993 		    case 'y':
5994 		    case 'Y':
5995 			/* ���� */
5996 			henv.okuri_flag = WNN_OKURI_YES;
5997 			break;
5998 		    default:
5999 			goto _Err_happend;
6000 		    }
6001 		    vmask |= WNN_ENV_OKURI_MASK;
6002 		}
6003 		break;
6004 	    case 'r':
6005 		if (strcmp(code, "rendaku") == 0) {
6006 		    /* Ϣ������ */
6007 		    if (num < 2) goto _Err_happend;
6008 		    vmask |= WNN_ENV_RENDAKU_MASK;
6009 		    flag = &henv.rendaku_flag;
6010 		    goto _set_flag;
6011 		}
6012 		break;
6013 	    case 's':
6014 		if (!strcmp(code, "setdic")){
6015 		    /* dic_add */
6016 		    int rdonly, hrdonly;
6017 		    expand_expr_all(s[0], env);
6018 		    if(num < 3 || !REAL_PARAM(s[1])){
6019 			s[1][0] = 0;
6020 		    }else{
6021 			expand_expr_all(s[1], env);
6022 		    }
6023 		    prio = (num >= 4 && REAL_PARAM(s[2]))? atoi(s[2]) :
6024 		    WNN_DIC_PRIO_DEFAULT;
6025 		    rdonly = (num >= 5 && REAL_PARAM(s[3]))? atoi(s[3]) : 0;
6026 		    hrdonly = (num >= 6 && REAL_PARAM(s[4]))? atoi(s[4]) : 0;
6027 		    if(num < 7 || !REAL_PARAM(s[5])) s[5][0] = 0;
6028 		    if(num < 8 || !REAL_PARAM(s[6])) s[6][0] = 0;
6029 		    rev = (num >= 9 && REAL_PARAM(s[7]))? atoi(s[7]) : 0;
6030 
6031 		    switch (confirm_state) {
6032 		    case CONFIRM:
6033 		    case CONFIRM1:
6034 			error_handler1 = error_handler;
6035 			break;
6036 		    case CREATE_WITHOUT_CONFIRM:
6037 			error_handler1 = (int (*)())WNN_CREATE;
6038 			break;
6039 		    case NO_CREATE:
6040 			error_handler1 = (int (*)())WNN_NO_CREATE;
6041 			break;
6042 		    }
6043 
6044 		    if((jl_dic_add_e_body(env, s[0], s[1], rev, prio, rdonly,
6045 					  hrdonly, s[5], s[6], error_handler1,
6046 					  message_handler) == -1)
6047 		       && (env_wnn_errorno_eql != 0)) {
6048 			if (env_wnn_errorno_eql != WNN_JSERVER_DEAD)
6049 			message_out(message_handler, "%s (%s) :%s\n",
6050 				    s[0], s[1], wnn_perror_lang(env->orig.lang,
6051 								env));
6052 			else
6053 			message_out(message_handler, "%s\n",
6054 				    wnn_perror_lang(env->orig.lang, env));
6055 			goto _Err_happend;
6056 		    }
6057 		    break;
6058 		}else if (!strcmp(code, "setfuzokugo") ||
6059 			  !strcmp(code, "setgrammar")) {
6060 		    /* fuzokugo_set */
6061 		    expand_expr_all(s[0], env);
6062 		    if(jl_fuzokugo_set_e_body(env,s[0]) == -1){
6063 			if (env_wnn_errorno_eql != WNN_JSERVER_DEAD)
6064 			message_out(message_handler, "%s :%s\n", s[0],
6065 				    wnn_perror_lang(env->orig.lang, env));
6066 			else
6067 			message_out(message_handler, "%s\n",
6068 				    wnn_perror_lang(env->orig.lang, env));
6069 			goto _Err_happend;
6070 		    }
6071 		    break;
6072 		} else if (!strcmp(code, "setparam")){
6073 		    struct wnn_param para;
6074 		    /* setparam --- set parameter */
6075 		    change_ascii_to_int(s[0], &para.n);
6076 		    change_ascii_to_int(s[1], &para.nsho);
6077 		    change_ascii_to_int(s[2], &para.p1);
6078 		    change_ascii_to_int(s[3], &para.p2);
6079 		    change_ascii_to_int(s[4], &para.p3);
6080 		    change_ascii_to_int(s[5], &para.p4);
6081 		    change_ascii_to_int(s[6], &para.p5);
6082 		    change_ascii_to_int(s[7], &para.p6);
6083 		    change_ascii_to_int(s[8], &para.p7);
6084 		    change_ascii_to_int(s[9], &para.p8);
6085 		    change_ascii_to_int(s[10], &para.p9);
6086 		    change_ascii_to_int(s[11], &para.p10);
6087 		    change_ascii_to_int(s[12], &para.p11);
6088 		    change_ascii_to_int(s[13], &para.p12);
6089 		    change_ascii_to_int(s[14], &para.p13);
6090 		    change_ascii_to_int(s[15], &para.p14);
6091 		    change_ascii_to_int(s[16], &para.p15);
6092 
6093 		    if (js_param_set(env,&para) < 0) {
6094 			fclose(fp);
6095 			LockMutex(&msg_lock);
6096 			message_out(message_handler,
6097 				    msg_get(wnn_msg_cat, 208, NULL,
6098 					    env->orig.lang, NULL), wnnrc_n);
6099 			/*
6100 			 * "�ե����� \"%s\" �ǴĶ�������ˡ����顼��ȯ������
6101 			 * ����ˡ��������ߤ��ޤ���\n",
6102 			 */
6103 			UnlockMutex(&msg_lock);
6104 			env_wnn_errorno_copy(env);
6105 			if_dead_disconnect(env);
6106 			return(-1);
6107 		    }
6108 		    break;
6109 		} else if (!strcmp(code, "saisyu_siyou")) {
6110 		    /* �ǽ����Ѻ�ͥ�� */
6111 		    if (num < 2) goto _Err_happend;
6112 		    vmask |= WNN_ENV_LAST_IS_FIRST_MASK;
6113 		    flag = &henv.last_is_first_flag;
6114 		    goto _set_flag;
6115 		} else if (!strcmp(code, "settou_gakusyu")) {
6116 		    /* ��Ƭ��ؽ� */
6117 		    if (num < 2) goto _Err_happend;
6118 		    vmask |= WNN_ENV_PREFIX_LEARN_MASK;
6119 		    flag = &henv.prefix_learn_flag;
6120 		    goto _set_flag;
6121 		} else if (!strcmp(code, "settou_kouho")) {
6122 		    /* ��Ƭ����� */
6123 		    switch (s[0][0]) {
6124 		    case 'h':
6125 		    case 'H':
6126 			/* �Ҥ餬�ʡʤ���*/
6127 			vmask |= WNN_ENV_PREFIX_MASK;
6128 			henv.prefix_flag = WNN_KANA_KOUHO;
6129 			break;
6130 		    case 'k':
6131 		    case 'K':
6132 			/* �����ʸ��*/
6133 			vmask |= WNN_ENV_PREFIX_MASK;
6134 			henv.prefix_flag = WNN_KANJI_KOUHO;
6135 			break;
6136 		    default:
6137 			break;
6138 		    }
6139 		    break;
6140 		} else if (strcmp(code, "setubi_gakusyu") == 0) {
6141 		    /* ������ؽ� */
6142 		    if (num < 2) goto _Err_happend;
6143 		    vmask |= WNN_ENV_SUFFIX_LEARN_MASK;
6144 		    flag = &henv.suffix_learn_flag;
6145 		    goto _set_flag;
6146 	/*
6147 	 * Hideyuki Kishiba (Jul. 12, 1994)
6148 	 * �ƣɴط������ƥ༭��ȣƣɴط��桼�����������
6149 	 */
6150 		} else if (strcmp(code, "set_fi_system_dic") == 0) {
6151 		    char nul = 0;
6152 		    int hrdonly;
6153 		    /* �ե�����̾�� @, ~ ��Ÿ������ */
6154 		    expand_expr_all(s[0], env);
6155 		    if(num < 3 || !REAL_PARAM(s[1])){
6156 			s[1][0] = 0;
6157 		    }else{
6158 			expand_expr_all(s[1], env);
6159 		    }
6160 		    /* �ƣɴط����٤� R_ONLY or R/W ���� */
6161 		    hrdonly = (num >= 4 && REAL_PARAM(s[2]))? atoi(s[2]) : WNN_DIC_RDONLY;
6162 		    /* �ƣɴط����٤Υѥ���ɥե����� */
6163 		    if(num < 5 || !REAL_PARAM(s[3])) s[3][0] = 0;
6164 
6165 		    switch (confirm_state) {
6166 		    case CONFIRM:
6167 		    case CONFIRM1:
6168 			error_handler1 = error_handler;
6169 			break;
6170 		    case CREATE_WITHOUT_CONFIRM:
6171 			error_handler1 = (int (*)())WNN_CREATE;
6172 			break;
6173 		    case NO_CREATE:
6174 			error_handler1 = (int (*)())WNN_NO_CREATE;
6175 			break;
6176 		    }
6177 
6178 		    if((jl_fi_dic_add_e_body(env, s[0], s[1],
6179 					     WNN_FI_SYSTEM_DICT,
6180 					     WNN_DIC_RDONLY,
6181 					     hrdonly, &nul, s[3],
6182 					     error_handler1, message_handler)
6183 			== -1) && (env_wnn_errorno_eql != 0)) {
6184 			if (env_wnn_errorno_eql != WNN_JSERVER_DEAD)
6185 			message_out(message_handler, "%s (%s) :%s\n",
6186 				    s[0], s[1], wnn_perror_lang(env->orig.lang,
6187 								env));
6188 			else
6189 			message_out(message_handler, "%s\n",
6190 				    wnn_perror_lang(env->orig.lang, env));
6191 			goto _Err_happend;
6192 		    }
6193 		} else if (!strcmp(code, "set_fi_user_dic")) {
6194 		    int rdonly, hrdonly;
6195 		    /* �ե�����̾�� @, ~ ��Ÿ������ */
6196 		    expand_expr_all(s[0], env);
6197 		    /* �ƣɴط������ R_ONLY or R/W ���� */
6198 		    rdonly = (num >= 3 && REAL_PARAM(s[1]))? atoi(s[1]) : WNN_DIC_RDONLY;
6199 		    /* �ƣɴط�����Υѥ���ɥե����� */
6200 		    if(num < 4 || !REAL_PARAM(s[2])) s[2][0] = 0;
6201 
6202 		    switch (confirm_state) {
6203 		    case CONFIRM:
6204 		    case CONFIRM1:
6205 			error_handler1 = error_handler;
6206 			break;
6207 		    case CREATE_WITHOUT_CONFIRM:
6208 			error_handler1 = (int (*)())WNN_CREATE;
6209 			break;
6210 		    case NO_CREATE:
6211 			error_handler1 = (int (*)())WNN_NO_CREATE;
6212 			break;
6213 		    }
6214 
6215 		    if((jl_fi_dic_add_e_body(env, s[0], NULL, WNN_FI_USER_DICT,
6216 					     rdonly, WNN_DIC_RDONLY, s[2], NULL,
6217 					     error_handler1, message_handler)
6218 			== -1) && (env_wnn_errorno_eql != 0)) {
6219 			if (env_wnn_errorno_eql != WNN_JSERVER_DEAD)
6220 			message_out(message_handler, "%s (%s) :%s\n",
6221 				    s[0], s[1], wnn_perror_lang(env->orig.lang,
6222 								env));
6223 			else
6224 			message_out(message_handler, "%s\n",
6225 				    wnn_perror_lang(env->orig.lang, env));
6226 			goto _Err_happend;
6227 		    }
6228 		    henv.fi_relation_learn_flag = rdonly;
6229 		    vmask |= WNN_ENV_FI_RELATION_LEARN_MASK;
6230 		}
6231 		break;
6232 	    case 'u':
6233 		if (!strcmp(code, "use_hinsi") ||
6234 		    !strcmp(code, "unuse_hinsi")) {
6235 		    /* �Ѵ����ѡ��Ի����ʻ� */
6236 		    int ii, *hlist, nhinsi = num - 1;
6237 		    w_char whname[64];
6238 		    if(nhinsi) {
6239 			if(!(hlist = (int *)malloc(nhinsi * sizeof(int))))
6240 			goto _Err_happend;
6241 			for(ii = 0; ii < nhinsi; ii++) {
6242 			    _Sstrcpy(whname, s[ii]);
6243 			    if((hlist[ii] =
6244 				jl_hinsi_number_e_body(env, whname)) == -1) {
6245 				free((char *)hlist);
6246 				goto _Err_happend;
6247 			    }
6248 			}
6249 			if(strcmp(code, "unuse_hinsi") == 0) nhinsi *= -1;
6250 			if(js_set_henkan_hinsi(env, 1, nhinsi, hlist) < 0) {
6251 			    free((char *)hlist);
6252 			    goto _Err_happend;
6253 			}
6254 			free((char *)hlist);
6255 		    }
6256 		}
6257 		break;
6258 	    case 'y':
6259 		if (strcmp(code, "yuragi") == 0) {
6260 		    /* Ĺ�����ɤ����� */
6261 		    if (num < 2) goto _Err_happend;
6262 		    vmask |= WNN_ENV_YURAGI_MASK;
6263 		    flag = &henv.yuragi_flag;
6264 		    goto _set_flag;
6265 		}
6266 		break;
6267 	    }
6268 	    continue;
6269 	    _set_flag:
6270 	    switch (s[0][0]) {
6271 	    case 't':
6272 	    case 'T':
6273 		*flag = True;
6274 		break;
6275 	    case 'f':
6276 	    case 'F':
6277 		*flag = False;
6278 		break;
6279 	    default:
6280 		goto _Err_happend;
6281 	    }
6282 	}
6283     }
6284     if(vmask) {
6285 	if(js_set_henkan_env(env, vmask, &henv) < 0) goto _Err_happend;
6286     }
6287     fclose(fp);
6288     return(0);
6289 
6290 _Err_happend:
6291     LockMutex(&msg_lock);
6292     message_out(message_handler, "%s set Error!!\n", code);
6293     message_out(message_handler,
6294 		msg_get(wnn_msg_cat, 208, NULL, env->orig.lang, NULL),
6295 		wnnrc_n);
6296 		/*
6297 		 * "�ե����� \"%s\" �ǴĶ�������ˡ����顼��ȯ����������ˡ�
6298 		 * �������ߤ��ޤ���\n",
6299 		 */
6300     UnlockMutex(&msg_lock);
6301     fclose(fp);
6302     return(-1);
6303 }
6304 int
jl_set_env_wnnrc1(env,wnnrc_n,error_handler,message_handler,level)6305 jl_set_env_wnnrc1(env, wnnrc_n, error_handler, message_handler, level)
6306 register struct wnn_env *env;
6307 char *wnnrc_n;
6308 int  (*error_handler)(), (*message_handler)();
6309 int level;
6310 {
6311     int x;
6312 
6313     if(!env) return(-1);
6314     LockMutex(&ENV_LOCK(env));
6315     env_wnn_errorno_set = 0;
6316     x = jl_set_env_wnnrc1_body((WNN_ENV_INT *)env, wnnrc_n, error_handler, message_handler, level, 0);
6317     UnlockMutex(&ENV_LOCK(env));
6318     return x;
6319 }
6320 
6321 static int
expand_expr_all(s,env)6322 expand_expr_all(s, env)
6323 struct wnn_env_int *env;
6324 register char *s;
6325 {
6326     register char *c;
6327 
6328     for(c = s; *c; c++){
6329 	if(*c == '~' || *c == '@'){
6330 	    if(expand_expr(c, env) == -1) return(-1);
6331 	}
6332     }
6333     return(0);
6334 }
6335 
6336 /* copy of js.c */
6337 static	char *
getlogname()6338 getlogname()
6339 {
6340     extern struct passwd *getpwuid();
6341     struct passwd *p;
6342 
6343     if ((p = getpwuid(getuid())) == NULL)
6344 	return(NULL);
6345     return(p->pw_name);
6346 }
6347 
6348 
6349 static int
expand_expr(s,env)6350 expand_expr(s, env)
6351 struct wnn_env_int *env;
6352  /**	~user��@HOME��@LIBDIR @ENV @USR ��Ÿ��(â����ʸ�������Ƭ�Τ�)��
6353    �Ǥ��ʤ�����-1��
6354    �֤ꡢ���ξ��s����Ȥ��塹�Ȥ��Τޤ�ޡ�s��Ĺ����256�Ȳ��ꤷ�Ƥ롣*/
6355 register char	*s;
6356 {
6357 	char	*p, *s1;
6358 	char	tmp[EXPAND_PATH_LENGTH];
6359 	char    buf[EXPAND_PATH_LENGTH];
6360 	int	noerr, expandsuc;
6361 	struct	passwd	*u;
6362         extern char *getenv();
6363 	extern struct	passwd	*getpwnam();
6364 #ifdef	SYSVR2
6365 #ifndef	AIXV3
6366 	extern char * strchr();
6367 #endif /* AIXV3 */
6368 #endif
6369 
6370 	if(*s != '~' && *s != '@') return(0);
6371 	if((int)strlen(s) >= EXPAND_PATH_LENGTH) return(-1);
6372 
6373 	s1 = s;
6374 #ifdef BSD42
6375 	if(NULL != (p = index(++s1, '/'))){
6376 #else
6377 	if(NULL != (p = strchr(++s1, '/'))){
6378 #endif
6379 		strcpy(tmp, p);
6380 		*p = '\0';
6381 	} else *tmp = '\0';
6382  /* �����ޤǤϽ�����s����Ƭ��s1�ģ�ʸ���ܡ�p�ĺǽ��'/'�Τ��ä��Ȥ���
6383     �ʤ����ǰ�ö�ڤ�ˡ�tmp�Ĥ���ʸ�Υ��ԡ���*/
6384 
6385 	if(*s == '~'){
6386 		if(*s1){
6387 			noerr = expandsuc =
6388 			(NULL != (u = getpwnam(s1)) &&
6389 			 (int)strlen(p = u -> pw_dir) + (int)strlen(tmp) <
6390 			 EXPAND_PATH_LENGTH );
6391 
6392 		} else {
6393 			noerr = expandsuc =
6394 			(NULL != (p = getenv("HOME")) &&
6395 			 (int)strlen(p) + (int)strlen(tmp) < EXPAND_PATH_LENGTH);
6396 		}
6397 
6398 	} else { /* then, *s must be '@' */
6399 		if(!strcmp(s1, "HOME")){
6400 			noerr = expandsuc =
6401 			(NULL != (p = getenv("HOME")) &&
6402 			 (int)strlen(p) + (int)strlen(tmp) < EXPAND_PATH_LENGTH);
6403 		}else if(!strcmp(s1, "WNN_DIC_DIR")){
6404 			noerr = expandsuc =
6405 			    (NULL != (p = getenv("HOME")) &&
6406 			     (int)strlen(p) + (int)strlen(tmp) < EXPAND_PATH_LENGTH);
6407 			if (expandsuc) {
6408 			    strcpy(buf, p);
6409 			    if (strlen(buf) + strlen("/") < sizeof(buf)) {
6410 				strcat(buf, "/");
6411 				p = getenv("WNN_DIC_DIR");
6412 				if (!p)
6413 				    p = "Wnn";
6414 				if (strlen(buf) + strlen(p) < sizeof(buf)) {
6415 				    strcat(buf, p);
6416 				    p = buf;
6417 				} else
6418 				    noerr = expandsuc = 0;
6419 			    } else
6420 				noerr = expandsuc = 0;
6421 			}
6422 		} else if (!strcmp(s1, "LIBDIR")){
6423 			noerr = expandsuc =
6424 			((int)strlen(p= LIBDIR)+ (int)strlen(tmp) < EXPAND_PATH_LENGTH);
6425 		} else if (!strcmp(s1, "ENV")){  /* Added */
6426 			noerr = expandsuc =
6427 			(NULL != (p = env_name(env)) &&
6428 			 (int)strlen(p)+ (int)strlen(tmp) < EXPAND_PATH_LENGTH);
6429 		}else if (!strcmp(s1, "USR")){
6430 			noerr = expandsuc =
6431 			(NULL != (p = getlogname()) &&
6432 			 (int)strlen(p)+ (int)strlen(tmp) < EXPAND_PATH_LENGTH);
6433 		} else { /* @HOME, @LIBDIR @ENV igai ha kaenai */
6434 			noerr = 1; expandsuc = 0;
6435 		}
6436 	}
6437 
6438 	if(expandsuc) strcpy(s, p);
6439 	strcat(s, tmp);
6440 	return(noerr ? 0 : -1);
6441 }
6442 
6443 static int
change_ascii_to_int(st,dp)6444 change_ascii_to_int(st,dp)
6445 register char *st;
6446 int *dp;
6447 {
6448     register int total,flag;
6449 
6450     total = 0;
6451     flag = 0;
6452     while(*st != NULL){
6453 	if (isdigit(*st)){
6454 	    total = total * 10 + (*st - '0');
6455 	} else if (*st == '+') {
6456 	    if (flag != 0) { return(-1); }
6457 	    flag = 1;
6458 	} else if (*st == '-') {
6459 	    if (flag != 0) { return(-1); }
6460 	    flag = -1;
6461 	} else { return(-1); }
6462 	st++;
6463     }
6464     if (flag == 0){
6465 	flag = 1;
6466     }
6467     *dp = total * flag;
6468     return(1);
6469 }
6470 
6471 static int
file_exist(env,n)6472 file_exist(env, n)
6473 struct wnn_env_int *env;
6474 char *n;
6475 {
6476     if(n[0] == C_LOCAL){
6477  	return(access(n + 1, 4));
6478      }else{
6479 	 return(js_access(env,n,4));
6480     }
6481 }
6482 
6483 static int
create_file(env,n,d,fid,pwd_dic,pwd_hindo,error_handler,message_handler)6484 create_file(env,n, d, fid, pwd_dic, pwd_hindo, error_handler, message_handler)
6485 register struct wnn_env_int *env;
6486 char *n;
6487 int d;
6488 int fid;
6489 char *pwd_dic, *pwd_hindo;
6490 int  (*error_handler)(), (*message_handler)();
6491 {
6492     char pwd[WNN_PASSWD_LEN], hpwd[WNN_PASSWD_LEN];
6493     int rev_dict_type;
6494     int x;	/* result for creating file	Hideyuki Kishiba (Jul. 7, 1994) */
6495 
6496     if(
6497        make_dir_rec1(env, n, error_handler, message_handler) == -1){
6498 	env_wnn_errorno_set = WNN_MKDIR_FAIL;
6499 	return(-1);
6500     }
6501     if(d == HINDO || d == FI_HINDO){
6502 	/*
6503 	 * Hideyuki Kishiba (Jul. 7, 1994)
6504 	 * �ƣɴط����٤κ����������ɲ�
6505 	 */
6506 	if(create_pwd_file(env, pwd_hindo, error_handler, message_handler) == -1)return(-1);
6507 	if(get_pwd(pwd_hindo, hpwd, env) == -1)return(-1);
6508 	if(n[0] == C_LOCAL){
6509 	    /*
6510 	     * Hideyuki Kishiba (Jul. 7, 1994)
6511 	     * ���饤�����¦�����٥ե�������������
6512 	     */
6513 	    if(d == HINDO)
6514 	        x = js_hindo_file_create_client(env, fid, n + 1, NULL, hpwd);
6515 	    else
6516 	        x = js_fi_hindo_file_create_client(env, fid, n + 1, NULL, hpwd);
6517 
6518 	    if(x == -1){
6519 		message_out(message_handler, wnn_perror_lang(env->orig.lang, env));
6520 		if_dead_disconnect(env);
6521 		return(-1);
6522 	    }else{
6523 		LockMutex(&msg_lock);
6524 		message_out(message_handler,
6525 			    "%s \"%s\" %s",
6526 			    msg_get(wnn_msg_cat, 203, NULL, env->orig.lang, NULL),
6527 			    n,
6528 			    msg_get(wnn_msg_cat, 209, NULL, env->orig.lang, NULL));
6529 			    /*
6530 			    "���٥ե����� \"%s\" ����ޤ�����",
6531 			    */
6532 		UnlockMutex(&msg_lock);
6533 		chown(n + 1, getuid(), -1); /* H.T. */
6534 		return(0);
6535 	    }
6536 	}else{
6537 	    /*
6538              * Hideyuki Kishiba (Jul. 7, 1994)
6539              * ������¦�����٥ե�������������
6540              */
6541             if(d == HINDO)
6542 	        x = js_hindo_file_create(env, fid, n, NULL, hpwd);
6543 	    else
6544 	        x = js_fi_hindo_file_create(env, fid, n, NULL, hpwd);
6545 
6546 	    if(x == -1){
6547 		message_out(message_handler, wnn_perror_lang(env->orig.lang, env));
6548 		if_dead_disconnect(env);
6549 		return(-1);
6550 	    }else{
6551 		LockMutex(&msg_lock);
6552 		message_out(message_handler,
6553 			    "%s \"%s\" %s",
6554 			    msg_get(wnn_msg_cat, 203, NULL, env->orig.lang, NULL),
6555 			    n,
6556 			    msg_get(wnn_msg_cat, 209, NULL, env->orig.lang, NULL));
6557 			    /*
6558 			    "���٥ե����� \"%s\" ����ޤ�����",
6559 			    */
6560 		UnlockMutex(&msg_lock);
6561 		return(0);
6562 	    }
6563 	}
6564     } else {
6565 	if(create_pwd_file(env, pwd_hindo, error_handler, message_handler) == -1)return(-1);
6566 	if(get_pwd(pwd_hindo, hpwd, env) == -1)return(-1);
6567 	if(create_pwd_file(env, pwd_dic, error_handler, message_handler) == -1)return(-1);
6568 	if(get_pwd(pwd_dic, pwd, env) == -1)return(-1);
6569 
6570 	/*
6571 	 * Hideyuki Kishiba (Jul. 7, 1994)
6572 	 * �ƣɴط�����κ����������ɲ�
6573 	 */
6574 	if(d == JISHO) {
6575 #ifdef	CONVERT_with_SiSheng
6576 	    if(!strncmp(js_get_lang(env), WNN_C_LANG, 5) ||
6577 	       !strncmp(js_get_lang(env), WNN_T_LANG, 5))
6578 	        rev_dict_type = CWNN_REV_DICT;
6579 	    else
6580 #endif
6581 	    /* Hideyuki Kishiba (Dec. 3, 1994)
6582 	       dic_add ���� rw �ե饰�ˤ�ꡢ���롼�׼����ޡ��������
6583 	       ������Ԥ��褦�ˤ��� */
6584 	    {
6585 		if(fid == WNN_DIC_GROUP)
6586 		    rev_dict_type = WNN_GROUP_DICT;
6587 		else if(fid == WNN_DIC_MERGE)
6588 		    rev_dict_type = WNN_MERGE_DICT;
6589 		else
6590 	            rev_dict_type = WNN_REV_DICT;
6591 	    }
6592 	} else
6593 	    rev_dict_type = WNN_FI_USER_DICT;
6594 
6595 	if(n[0] == C_LOCAL){
6596 	    if(js_dic_file_create_client(env, n + 1, rev_dict_type,
6597 						NULL, pwd, hpwd) == -1){
6598 		message_out(message_handler, wnn_perror_lang(env->orig.lang, env));
6599 		if_dead_disconnect(env);
6600 		return(-1);
6601 	    }else{
6602 		LockMutex(&msg_lock);
6603 		message_out(message_handler,
6604 			    "%s \"%s\" %s",
6605 			    msg_get(wnn_msg_cat, 200, NULL, env->orig.lang, NULL),
6606 			    n,
6607 			    msg_get(wnn_msg_cat, 209, NULL, env->orig.lang, NULL));
6608 			    /*
6609 			    "����ե����� \"%s\" ����ޤ�����",
6610 			    */
6611 		UnlockMutex(&msg_lock);
6612 		chown(n + 1, getuid(), -1);
6613 		return(0);
6614 	    }
6615 	}else{
6616 	    if(js_dic_file_create(env, n, rev_dict_type, NULL, pwd, hpwd)== -1){
6617 		message_out(message_handler, wnn_perror_lang(env->orig.lang, env));
6618 		if_dead_disconnect(env);
6619 		return(-1);
6620 	    }else{
6621 		LockMutex(&msg_lock);
6622 		message_out(message_handler,
6623 			    "%s \"%s\" %s",
6624 			    msg_get(wnn_msg_cat, 200, NULL, env->orig.lang, NULL),
6625 			    n,
6626 			    msg_get(wnn_msg_cat, 209, NULL, env->orig.lang, NULL));
6627 			    /*
6628 			    "����ե����� \"%s\" ����ޤ�����",
6629 			    */
6630 		UnlockMutex(&msg_lock);
6631 		return(0);
6632 	    }
6633 	}
6634     }
6635 }
6636 
6637 static int
make_dir_rec1(env,path,error_handler,message_handler)6638 make_dir_rec1(env, path, error_handler, message_handler)
6639 struct wnn_env_int *env;
6640 register char *path;
6641 int  (*error_handler)(), (*message_handler)();
6642 {
6643     char gomi[128];
6644     register char *c;
6645     for(c = path;*c;c++){
6646 	if(*c == '/'){
6647 	    strncpy(gomi,path,c - path);
6648 	    gomi[c - path] = 0;
6649 	    if(make_dir1(env, gomi, error_handler, message_handler) == -1){
6650 		return(-1);
6651 	    }
6652 	}
6653     }
6654     return(0);
6655 }
6656 
6657 static int
make_dir1(env,dirname,error_handler,message_handler)6658 make_dir1(env, dirname, error_handler, message_handler)
6659 register struct wnn_env_int *env;
6660 register char *dirname;
6661 int  (*error_handler)(), (*message_handler)();
6662 {
6663     char gomi[128];
6664     if(dirname[0] == C_LOCAL){
6665 	if(*(dirname + 1) == 0) return(0);
6666 	if(access(dirname + 1 , 0) == 0){ /* check for existence */
6667 	    return(0); /* dir already exists */
6668 	}
6669     }else{
6670 	if(*dirname == 0) return(0);
6671 	if(js_access(env, dirname , 0) == 0){ /* check for existence */
6672 	    return(0); /* dir already exists */
6673 	}
6674     }
6675     if((int)error_handler != WNN_CREATE){
6676 	LockMutex(&msg_lock);
6677 	sprintf(gomi, "%s \"%s\" %s%s",
6678 		msg_get(wnn_msg_cat, 210, NULL, env->orig.lang, NULL),
6679 		dirname,
6680 		msg_get(wnn_msg_cat, 201, NULL, env->orig.lang, NULL),
6681 		msg_get(wnn_msg_cat, 202, NULL, env->orig.lang, NULL));
6682 		/*
6683 		"directry \"%s\" ��̵���衣���?(Y/N)",
6684 		*/
6685 	UnlockMutex(&msg_lock);
6686 	if(call_error_handler(error_handler,gomi, env) == 0){
6687 	    env_wnn_errorno_set = WNN_MKDIR_FAIL;
6688 	    return(-1);
6689 	}
6690     }
6691     if(dirname[0] == C_LOCAL){  /* Create Directory */
6692 #define	MODE (0000000 | 0000777)
6693 	uid_t euid;
6694 	int ret;
6695 
6696 	euid = geteuid();
6697 	seteuid(getuid());
6698 	ret = mkdir(dirname + 1 , MODE );
6699 	seteuid(euid);
6700 	if (ret != 0 ) {
6701 	    env_wnn_errorno_set=WNN_MKDIR_FAIL;
6702 	    return(-1);
6703 	}
6704     }else{
6705 	if(js_mkdir(env, dirname)){
6706 	    if_dead_disconnect(env);
6707 	    return(-1);
6708 	}
6709     }
6710     return(0);
6711 }
6712 
6713 
6714 static  int
6715 call_error_handler(error_handler, c, env)
6716 int (*error_handler)();
6717 char *c;
6718 ARGS *env;
6719 {
6720     register int x;
6721     x = error_handler(c);
6722     if(confirm_state == CONFIRM1){
6723 	if(x) confirm_state = CREATE_WITHOUT_CONFIRM;
6724 	else  confirm_state = NO_CREATE;
6725     }
6726     return(x);
6727 }
6728 
6729 static void
6730 message_out(message_handler, format, s1, s2, s3, s4, s5, s6, s7, s8)
6731 int (*message_handler)();
6732 char *format;
6733 char *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8;
6734 {
6735     char buf[256];
6736 
6737     if(message_handler){
6738 	sprintf(buf, format, s1, s2, s3, s4, s5, s6, s7, s8);
6739 	(*message_handler)(buf);
6740     }
6741 }
6742 
6743 static int
jl_yomi_len_body(buf,bun_no,bun_no2)6744 jl_yomi_len_body(buf, bun_no, bun_no2)
6745 struct wnn_buf_mt *buf;
6746 register int bun_no, bun_no2;
6747 {
6748     register int len = 0;
6749 
6750     if(bun_no2 >= buf->orig.bun_suu || bun_no2 < 0)
6751 	bun_no2 = buf->orig.bun_suu;
6752     for(;bun_no < bun_no2;bun_no++){
6753 	len += buf->orig.bun[bun_no]->yomilen;
6754     }
6755     return(len);
6756 }
6757 
6758 int
jl_yomi_len(buf,bun_no,bun_no2)6759 jl_yomi_len(buf, bun_no, bun_no2)
6760 struct wnn_buf *buf;
6761 register int bun_no, bun_no2;
6762 {
6763     int x;
6764 
6765     if(!buf) return(0);
6766     LockMutex(&BUF_LOCK(buf));
6767     buf_wnn_errorno_set = 0;
6768     x = jl_yomi_len_body((WNN_BUF_MT *)buf, bun_no, bun_no2);
6769     UnlockMutex(&BUF_LOCK(buf));
6770     return x;
6771 }
6772 
6773 int
jl_kanji_len(buf,bun_no,bun_no2)6774 jl_kanji_len(buf, bun_no, bun_no2)
6775 struct wnn_buf *buf;
6776 register int bun_no, bun_no2;
6777 {
6778     register int len = 0;
6779 
6780     if(!buf) return(0);
6781     LockMutex(&BUF_LOCK(buf));
6782     buf_wnn_errorno_set = 0;
6783     if(bun_no < 0) {
6784 	UnlockMutex(&BUF_LOCK(buf));
6785 	return(0);
6786     }
6787     if(bun_no2 >= buf->bun_suu || bun_no2 < 0)
6788 	bun_no2 = buf->bun_suu;
6789     for(;bun_no < bun_no2;bun_no++){
6790 	len += buf->bun[bun_no]->kanjilen;
6791     }
6792     UnlockMutex(&BUF_LOCK(buf));
6793     return(len);
6794 }
6795 
6796 int wnn_word_use_initial_hindo = 0;
6797 
6798 static int
jl_word_use_e_body(env,dic_no,entry)6799 jl_word_use_e_body(env, dic_no, entry)
6800 register struct wnn_env_int *env;
6801 int dic_no, entry;
6802 {
6803     register struct wnn_jdata *jd;
6804 
6805     if(js_word_info(env,dic_no,entry, &env_rb) == -1) {
6806 	env_wnn_errorno_copy(env);
6807 	if_dead_disconnect(env);
6808 	return(-1);
6809     }
6810     jd = (struct wnn_jdata *)(env_rb.buf);
6811     if(jd->hindo != -1){
6812 	if(js_hindo_set(env, dic_no, entry,WNN_IMA_OFF, WNN_ENTRY_NO_USE) == -1) {
6813 	    env_wnn_errorno_copy(env);
6814 	    if_dead_disconnect(env);
6815 	    return(-1);
6816 	}
6817     }else{
6818 	if(js_hindo_set(env, dic_no, entry,
6819 			(wnn_word_use_initial_hindo & 0x80) ?
6820 				WNN_IMA_ON : WNN_IMA_OFF ,
6821 			wnn_word_use_initial_hindo & 0x7f) == -1) {
6822 	    env_wnn_errorno_copy(env);
6823 	    if_dead_disconnect(env);
6824 	    return(-1);
6825 	}
6826     }
6827     return(0);
6828 }
6829 
6830 int
jl_word_use_e(env,dic_no,entry)6831 jl_word_use_e(env, dic_no, entry)
6832 register struct wnn_env *env;
6833 int dic_no, entry;
6834 {
6835     int x;
6836 
6837     if(!env) return(-1);
6838     LockMutex(&ENV_LOCK(env));
6839     env_wnn_errorno_set = 0;
6840     x = jl_word_use_e_body((WNN_ENV_INT *)env, dic_no, entry);
6841     UnlockMutex(&ENV_LOCK(env));
6842     return x;
6843 }
6844 
6845 int
jl_word_use(buf,dic_no,entry)6846 jl_word_use(buf, dic_no, entry)
6847 register struct wnn_buf *buf;
6848 int dic_no, entry;
6849 {
6850     int x;
6851 
6852     if(!buf || !(buf->env)) return(-1);
6853     LockMutex(&BUF_LOCK(buf));
6854     LockMutex(&(envmt->env_lock));
6855     buf_wnn_errorno_set = 0;
6856     x = jl_word_use_e_body((WNN_ENV_INT *)buf->env, dic_no, entry);
6857     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
6858     UnlockMutex(&(envmt->env_lock));
6859     UnlockMutex(&BUF_LOCK(buf));
6860     return x;
6861 }
6862 
6863 void
jl_env_set(buf,env)6864 jl_env_set(buf, env)
6865 register struct wnn_env *env;
6866 register struct wnn_buf *buf;
6867 {
6868     if(!buf) return;
6869     LockMutex(&BUF_LOCK(buf));
6870     buf_wnn_errorno_set = 0;
6871     buf->env = env;
6872     UnlockMutex(&BUF_LOCK(buf));
6873 }
6874 
6875 
6876 struct wnn_env *
jl_env_get(buf)6877 jl_env_get(buf)
6878 register struct wnn_buf *buf;
6879 {
6880     struct wnn_env *x;
6881 
6882     if(!buf) return(NULL);
6883     LockMutex(&BUF_LOCK(buf));
6884     buf_wnn_errorno_set = 0;
6885     x = buf->env;
6886     UnlockMutex(&BUF_LOCK(buf));
6887     return x;
6888 }
6889 
6890 static int
jl_param_set_e_body(env,para)6891 jl_param_set_e_body(env, para)
6892 register struct wnn_env_int *env;
6893 struct wnn_param *para;
6894 {
6895     register int x;
6896 
6897     if((x = js_param_set(env, para)) == -1) {
6898 	env_wnn_errorno_copy(env);
6899 	if_dead_disconnect(env);
6900 	return(-1);
6901     }
6902     return (x);
6903 }
6904 
6905 int
jl_param_set_e(env,para)6906 jl_param_set_e(env, para)
6907 register struct wnn_env *env;
6908 struct wnn_param *para;
6909 {
6910     int x;
6911 
6912     if(!env) return(-1);
6913     LockMutex(&ENV_LOCK(env));
6914     env_wnn_errorno_set = 0;
6915     x = jl_param_set_e_body((WNN_ENV_INT *)env, para);
6916     UnlockMutex(&ENV_LOCK(env));
6917     return x;
6918 }
6919 
6920 int
jl_param_set(buf,para)6921 jl_param_set(buf, para)
6922 register struct wnn_buf *buf;
6923 struct wnn_param *para;
6924 {
6925     int x;
6926 
6927     if(!buf || !(buf->env)) return(-1);
6928     LockMutex(&BUF_LOCK(buf));
6929     LockMutex(&(envmt->env_lock));
6930     buf_wnn_errorno_set = 0;
6931     x = jl_param_set_e_body((WNN_ENV_INT *)buf->env, para);
6932     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
6933     UnlockMutex(&(envmt->env_lock));
6934     UnlockMutex(&BUF_LOCK(buf));
6935     return x;
6936 }
6937 
6938 static int
jl_set_henkan_env_e_body(env,valuemask,henv)6939 jl_set_henkan_env_e_body(env, valuemask, henv)
6940 register struct wnn_env_int *env;
6941 unsigned long valuemask;
6942 struct wnn_henkan_env *henv;
6943 {
6944     register int x;
6945 
6946     if((x = js_set_henkan_env(env, valuemask, henv)) == -1) {
6947         env_wnn_errorno_copy(env);
6948         if_dead_disconnect(env);
6949         return(-1);
6950     }
6951     return (x);
6952 }
6953 
6954 int
jl_set_henkan_env_e(env,valuemask,henv)6955 jl_set_henkan_env_e(env, valuemask, henv)
6956 register struct wnn_env *env;
6957 unsigned long valuemask;
6958 struct wnn_henkan_env *henv;
6959 {
6960     int x;
6961 
6962     if(!env) return(-1);
6963     LockMutex(&ENV_LOCK(env));
6964     env_wnn_errorno_set = 0;
6965     x = jl_set_henkan_env_e_body((WNN_ENV_INT *)env, valuemask, henv);
6966     UnlockMutex(&ENV_LOCK(env));
6967     return x;
6968 }
6969 
6970 int
jl_set_henkan_env(buf,valuemask,henv)6971 jl_set_henkan_env(buf, valuemask, henv)
6972 register struct wnn_buf *buf;
6973 unsigned long valuemask;
6974 struct wnn_henkan_env *henv;
6975 {
6976     int x;
6977 
6978     if(!buf || !(buf->env)) return(-1);
6979     LockMutex(&BUF_LOCK(buf));
6980     LockMutex(&(envmt->env_lock));
6981     buf_wnn_errorno_set = 0;
6982     x = jl_set_henkan_env_e_body((WNN_ENV_INT *)buf->env, valuemask, henv);
6983     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
6984     UnlockMutex(&(envmt->env_lock));
6985     UnlockMutex(&BUF_LOCK(buf));
6986     return x;
6987 }
6988 
6989 static int
jl_set_henkan_hinsi_e_body(env,mode,nhinsi,hname)6990 jl_set_henkan_hinsi_e_body(env, mode, nhinsi, hname)
6991 register struct wnn_env_int *env;
6992 int mode, nhinsi;
6993 char **hname;
6994 {
6995     int x, i, hsize, *hno = NULL;
6996     w_char tmp[32];
6997 
6998     if(nhinsi) {
6999         hsize = abs(nhinsi);
7000         hno = (int *)malloc(hsize * sizeof(int));
7001         for(i = 0; i < hsize; i++) {
7002             _Sstrcpy(tmp, hname[i]);
7003             if((hno[i] = jl_hinsi_number_e_body(env, tmp)) == -1) {
7004                 free((char *)hno);
7005                 return(-1);
7006             }
7007         }
7008     }
7009 
7010     if((x = js_set_henkan_hinsi(env, mode, nhinsi, hno)) == -1) {
7011         env_wnn_errorno_copy(env);
7012         if_dead_disconnect(env);
7013 	 if(nhinsi) free((char *)hno);
7014         return(-1);
7015     }
7016     if(nhinsi) free((char *)hno);
7017     return (x);
7018 }
7019 
7020 int
jl_set_henkan_hinsi_e(env,mode,nhinsi,hname)7021 jl_set_henkan_hinsi_e(env, mode, nhinsi, hname)
7022 register struct wnn_env *env;
7023 int mode, nhinsi;
7024 char **hname;
7025 {
7026     int x;
7027 
7028     if(!env) return(-1);
7029     LockMutex(&ENV_LOCK(env));
7030     env_wnn_errorno_set = 0;
7031     x = jl_set_henkan_hinsi_e_body((WNN_ENV_INT *)env, mode, nhinsi, hname);
7032     UnlockMutex(&ENV_LOCK(env));
7033     return x;
7034 }
7035 
7036 int
jl_set_henkan_hinsi(buf,mode,nhinsi,hname)7037 jl_set_henkan_hinsi(buf, mode, nhinsi, hname)
7038 register struct wnn_buf *buf;
7039 int mode, nhinsi;
7040 char **hname;
7041 {
7042     int x;
7043 
7044     if(!buf || !(buf->env)) return(-1);
7045     LockMutex(&BUF_LOCK(buf));
7046     LockMutex(&(envmt->env_lock));
7047     buf_wnn_errorno_set = 0;
7048     x = jl_set_henkan_hinsi_e_body((WNN_ENV_INT *)buf->env, mode, nhinsi, hname);
7049     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7050     UnlockMutex(&(envmt->env_lock));
7051     UnlockMutex(&BUF_LOCK(buf));
7052     return x;
7053 }
7054 
7055 static int
jl_param_get_e_body(env,para)7056 jl_param_get_e_body(env, para)
7057 struct wnn_env_int *env;
7058 struct wnn_param *para;
7059 {
7060     register int x;
7061 
7062     if((x = js_param_get(env, para)) == -1) {
7063 	env_wnn_errorno_copy(env);
7064 	if_dead_disconnect(env);
7065 	return(-1);
7066     }
7067     return (x);
7068 }
7069 
7070 int
jl_param_get_e(env,para)7071 jl_param_get_e(env, para)
7072 struct wnn_env *env;
7073 struct wnn_param *para;
7074 {
7075     int x;
7076 
7077     if(!env) return(-1);
7078     LockMutex(&ENV_LOCK(env));
7079     env_wnn_errorno_set = 0;
7080     x = jl_param_get_e_body((WNN_ENV_INT *)env, para);
7081     UnlockMutex(&ENV_LOCK(env));
7082     return x;
7083 }
7084 
7085 int
jl_param_get(buf,para)7086 jl_param_get(buf, para)
7087 register struct wnn_buf *buf;
7088 struct wnn_param *para;
7089 {
7090     int x;
7091 
7092     if(!buf || !(buf->env)) return(-1);
7093     LockMutex(&BUF_LOCK(buf));
7094     LockMutex(&(envmt->env_lock));
7095     buf_wnn_errorno_set = 0;
7096     x = jl_param_get_e_body((WNN_ENV_INT *)buf->env, para);
7097     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7098     UnlockMutex(&(envmt->env_lock));
7099     UnlockMutex(&BUF_LOCK(buf));
7100     return x;
7101 }
7102 
7103 /*:::DOC_START
7104  *
7105  *    Function Name: jl_get_henkan_env_e_body
7106  *    Description  : ����������Ѵ��Ķ������륵�֥롼����
7107  *    Parameter    :
7108  *         env :   (In) �Ķ��ؤΥݥ���
7109  *         henv :  (Out) �Ѵ��Ķ���������ѹ�¤�ΤؤΥݥ���
7110  *	   local : (In) �Ѵ��Ķ��������оݥե饰
7111  *	  		��0 == jserver, else client��
7112  *
7113  *    Return value : 0==SUCCESS, -1==ERROR
7114  *
7115  *    Author      :  Hideyuki Kishiba
7116  *
7117  *    Revision history:
7118  *
7119  *:::DOC_END
7120  */
7121 static int
jl_get_henkan_env_e_body(env,henv,local)7122 jl_get_henkan_env_e_body(env, henv, local)
7123 struct wnn_env_int *env;
7124 struct wnn_henkan_env *henv;
7125 int local;
7126 {
7127     register int x;
7128 
7129     if ((local && ((x = js_get_henkan_env_local(env, henv)) == -1)) ||
7130 	(!local && ((x = js_get_henkan_env(env, henv)) == -1))) {
7131         env_wnn_errorno_copy(env);
7132         if_dead_disconnect(env);
7133         return(-1);
7134     }
7135     return (x);
7136 }
7137 
7138 /*:::DOC_START
7139  *
7140  *    Function Name: jl_get_henkan_env_e
7141  *    Description  : ����������Ѵ��Ķ�������
7142  *    Parameter    :
7143  *         env :  (In) �Ķ��ؤΥݥ���
7144  *	   henv : (Out) �Ѵ��Ķ���������ѹ�¤�ΤؤΥݥ���
7145  *
7146  *    Return value : 0==SUCCESS, -1==ERROR
7147  *
7148  *    Author      :  Hideyuki Kishiba
7149  *
7150  *    Revision history:
7151  *
7152  *:::DOC_END
7153  */
7154 int
jl_get_henkan_env_e(env,henv)7155 jl_get_henkan_env_e(env, henv)
7156 struct wnn_env *env;
7157 struct wnn_henkan_env *henv;
7158 {
7159     int x;
7160 
7161     if(!env) return(-1);
7162     LockMutex(&ENV_LOCK(env));
7163     env_wnn_errorno_set = 0;
7164     x = jl_get_henkan_env_e_body((WNN_ENV_INT *)env, henv, 0);
7165     UnlockMutex(&ENV_LOCK(env));
7166     return x;
7167 } /* End of jl_get_henkan_env_e */
7168 
7169 /*:::DOC_START
7170  *
7171  *    Function Name: jl_get_henkan_env
7172  *    Description  : ����������Ѵ��Ķ�������
7173  *    Parameter    :
7174  *         buf :  (In) �Хåե��ؤΥݥ���
7175  *         henv : (Out) �Ѵ��Ķ���������ѹ�¤�ΤؤΥݥ���
7176  *
7177  *    Return value : 0==SUCCESS, -1==ERROR
7178  *
7179  *    Author      :  Hideyuki Kishiba
7180  *
7181  *    Revision history:
7182  *
7183  *:::DOC_END
7184  */
7185 int
jl_get_henkan_env(buf,henv)7186 jl_get_henkan_env(buf, henv)
7187 register struct wnn_buf *buf;
7188 struct wnn_henkan_env *henv;
7189 {
7190     int x;
7191 
7192     if(!buf || !(buf->env)) return(-1);
7193     LockMutex(&BUF_LOCK(buf));
7194     LockMutex(&(envmt->env_lock));
7195     buf_wnn_errorno_set = 0;
7196     x = jl_get_henkan_env_e_body((WNN_ENV_INT *)buf->env, henv, 0);
7197     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7198     UnlockMutex(&(envmt->env_lock));
7199     UnlockMutex(&BUF_LOCK(buf));
7200     return x;
7201 } /* End of jl_get_henkan_env */
7202 
7203 /*:::DOC_START
7204  *
7205  *    Function Name: jl_get_henkan_env_local_e
7206  *    Description  : �Ѵ��Ķ����⡤�饤�֥��ˤ����Τ���
7207  *                   ����������̡�����
7208  *    Parameter    :
7209  *         env :      (In) �Ķ��ؤΥݥ���
7210  *         henv :     (Out) �Ѵ��Ķ��ι�¤�ΤؤΥݥ���
7211  *
7212  *    Return value : 0==SUCCESS,-1==ERROR
7213  *
7214  *    Author      :  Seiji KUWARI
7215  *
7216  *    Revision history:
7217  *
7218  *:::DOC_END
7219  */
7220 int
jl_get_henkan_env_local_e(env,henv)7221 jl_get_henkan_env_local_e(env, henv)
7222 struct wnn_env *env;
7223 struct wnn_henkan_env *henv;
7224 {
7225     int x;
7226 
7227     if(!env) return(-1);
7228     LockMutex(&ENV_LOCK(env));
7229     env_wnn_errorno_set = 0;
7230     x = jl_get_henkan_env_e_body((WNN_ENV_INT *)env, henv, 1);
7231     UnlockMutex(&ENV_LOCK(env));
7232     return x;
7233 }
7234 
7235 /*:::DOC_START
7236  *
7237  *    Function Name: jl_get_henkan_env_local
7238  *    Description  : �Ѵ��Ķ����⡤�饤�֥��ˤ����Τ���
7239  *                   ����������̡�����
7240  *    Parameter    :
7241  *         buf :      (In) �Хåե��ؤΥݥ���
7242  *         henv :     (Out) �Ѵ��Ķ��ι�¤�ΤؤΥݥ���
7243  *
7244  *    Return value : 0==SUCCESS,-1==ERROR
7245  *
7246  *    Author      :  Seiji KUWARI
7247  *
7248  *    Revision history:
7249  *
7250  *:::DOC_END
7251  */
7252 int
jl_get_henkan_env_local(buf,henv)7253 jl_get_henkan_env_local(buf, henv)
7254 register struct wnn_buf *buf;
7255 struct wnn_henkan_env *henv;
7256 {
7257     int x;
7258 
7259     if(!buf || !(buf->env)) return(-1);
7260     LockMutex(&BUF_LOCK(buf));
7261     LockMutex(&(envmt->env_lock));
7262     buf_wnn_errorno_set = 0;
7263     x = jl_get_henkan_env_e_body((WNN_ENV_INT *)buf->env, henv, 1);
7264     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7265     UnlockMutex(&(envmt->env_lock));
7266     UnlockMutex(&BUF_LOCK(buf));
7267     return x;
7268 }
7269 
7270 /*:::DOC_START
7271  *
7272  *    Function Name: jl_get_henkan_hinsi_e_body
7273  *    Description  : �Ѵ��ˡʻ��ѡ��Ի��ѡˤ����ʻ췲�����륵�֥롼����
7274  *    Parameter    :
7275  *         env :    (In) �Ķ��ؤΥݥ���
7276  *         nhinsi : (Out) �����ʻ������ == �Ի���, �� ���ѡ�
7277  *         hlist :  (Out) �����ʻ�ꥹ�ȤؤΥݥ���
7278  *
7279  *    Return value : 0==SUCCESS, -1==ERROR
7280  *
7281  *    Author      :  Hideyuki Kishiba
7282  *
7283  *    Revision history:
7284  *
7285  *:::DOC_END
7286  */
7287 static int
jl_get_henkan_hinsi_e_body(env,nhinsi,hlist)7288 jl_get_henkan_hinsi_e_body(env, nhinsi, hlist)
7289 struct wnn_env_int *env;
7290 int *nhinsi, **hlist;
7291 {
7292     register int x;
7293 
7294     if((x = js_get_henkan_hinsi(env, nhinsi, hlist)) == -1) {
7295         env_wnn_errorno_copy(env);
7296         if_dead_disconnect(env);
7297         return(-1);
7298     }
7299     return (x);
7300 } /* End of jl_get_henkan_hinsi_e_body */
7301 
7302 /*:::DOC_START
7303  *
7304  *    Function Name: jl_get_henkan_hinsi_e
7305  *    Description  : �Ѵ��ˡʻ��ѡ��Ի��ѡˤ����ʻ췲������
7306  *    Parameter    :
7307  *         env :    (In) �Ķ��ؤΥݥ���
7308  *         nhinsi : (Out) �����ʻ������ == �Ի���, �� ���ѡ�
7309  *         hlist :  (Out) �����ʻ�ꥹ�ȤؤΥݥ���
7310  *
7311  *    Return value : 0==SUCCESS, -1==ERROR
7312  *
7313  *    Author      :  Hideyuki Kishiba
7314  *
7315  *    Revision history:
7316  *
7317  *:::DOC_END
7318  */
7319 int
jl_get_henkan_hinsi_e(env,nhinsi,hlist)7320 jl_get_henkan_hinsi_e(env, nhinsi, hlist)
7321 struct wnn_env *env;
7322 int *nhinsi, **hlist;
7323 {
7324     int x;
7325 
7326     if(!env) return(-1);
7327     LockMutex(&ENV_LOCK(env));
7328     env_wnn_errorno_set = 0;
7329     x = jl_get_henkan_hinsi_e_body((WNN_ENV_INT *)env, nhinsi, hlist);
7330     UnlockMutex(&ENV_LOCK(env));
7331     return x;
7332 } /* End of jl_get_henkan_hinsi_e */
7333 
7334 /*:::DOC_START
7335  *
7336  *    Function Name: jl_get_henkan_hinsi
7337  *    Description  : �Ѵ��ˡʻ��ѡ��Ի��ѡˤ����ʻ췲������
7338  *    Parameter    :
7339  *         env :    (In) �Хåե��ؤΥݥ���
7340  *         nhinsi : (Out) �����ʻ������ == �Ի���, �� ���ѡ�
7341  *         hlist :  (Out) �����ʻ�ꥹ�ȤؤΥݥ���
7342  *
7343  *    Return value : 0==SUCCESS, -1==ERROR
7344  *
7345  *    Author      :  Hideyuki Kishiba
7346  *
7347  *    Revision history:
7348  *
7349  *:::DOC_END
7350  */
7351 int
jl_get_henkan_hinsi(buf,nhinsi,hlist)7352 jl_get_henkan_hinsi(buf, nhinsi, hlist)
7353 register struct wnn_buf *buf;
7354 int *nhinsi, **hlist;
7355 {
7356     int x;
7357 
7358     if(!buf || !(buf->env)) return(-1);
7359     LockMutex(&BUF_LOCK(buf));
7360     LockMutex(&(envmt->env_lock));
7361     buf_wnn_errorno_set = 0;
7362     x = jl_get_henkan_hinsi_e_body((WNN_ENV_INT *)buf->env, nhinsi, hlist);
7363     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7364     UnlockMutex(&(envmt->env_lock));
7365     UnlockMutex(&BUF_LOCK(buf));
7366     return x;
7367 } /* End of jl_get_henkan_hinsi */
7368 
7369 static int
jl_dic_use_e_body(env,dic_no,flag)7370 jl_dic_use_e_body(env, dic_no, flag)
7371 struct wnn_env_int *env;
7372 int	dic_no,flag;
7373 {
7374     register int x;
7375 
7376     if((x = js_dic_use(env, dic_no, flag)) == -1) {
7377 	env_wnn_errorno_copy(env);
7378 	if_dead_disconnect(env);
7379 	return(-1);
7380     }
7381     return (x);
7382 }
7383 
7384 int
jl_dic_use_e(env,dic_no,flag)7385 jl_dic_use_e(env, dic_no, flag)
7386 struct wnn_env *env;
7387 int     dic_no,flag;
7388 {
7389     int x;
7390 
7391     if(!env) return(-1);
7392     LockMutex(&ENV_LOCK(env));
7393     env_wnn_errorno_set = 0;
7394     x = jl_dic_use_e_body((WNN_ENV_INT *)env, dic_no, flag);
7395     UnlockMutex(&ENV_LOCK(env));
7396     return x;
7397 }
7398 
7399 int
jl_dic_use(buf,dic_no,flag)7400 jl_dic_use(buf, dic_no, flag)
7401 register struct wnn_buf *buf;
7402 int     dic_no,flag;
7403 {
7404     int x;
7405 
7406     if(!buf || !(buf->env)) return(-1);
7407     LockMutex(&BUF_LOCK(buf));
7408     LockMutex(&(envmt->env_lock));
7409     buf_wnn_errorno_set = 0;
7410     x = jl_dic_use_e_body((WNN_ENV_INT *)buf->env, dic_no, flag);
7411     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7412     UnlockMutex(&(envmt->env_lock));
7413     UnlockMutex(&BUF_LOCK(buf));
7414     return x;
7415 }
7416 
7417 static int
jl_word_add_e_body(env,dic_no,yomi,kanji,comment,hinsi,init_hindo)7418 jl_word_add_e_body(env, dic_no, yomi, kanji, comment, hinsi, init_hindo)
7419 struct wnn_env_int *env;
7420 int	dic_no;
7421 w_char	*yomi,*kanji,*comment;
7422 int	hinsi,init_hindo;
7423 {
7424     register int x;
7425 
7426     if((x = js_word_add(env, dic_no, yomi, kanji, comment, hinsi, init_hindo)) == -1) {
7427 	env_wnn_errorno_copy(env);
7428 	if_dead_disconnect(env);
7429 	return(-1);
7430     }
7431     return (x);
7432 }
7433 
7434 int
jl_word_add_e(env,dic_no,yomi,kanji,comment,hinsi,init_hindo)7435 jl_word_add_e(env, dic_no, yomi, kanji, comment, hinsi, init_hindo)
7436 struct wnn_env *env;
7437 int     dic_no;
7438 w_char  *yomi,*kanji,*comment;
7439 int     hinsi,init_hindo;
7440 {
7441     int x;
7442 
7443     if(!env) return(-1);
7444     LockMutex(&ENV_LOCK(env));
7445     env_wnn_errorno_set = 0;
7446     x = jl_word_add_e_body((WNN_ENV_INT *)env, dic_no, yomi, kanji, comment, hinsi, init_hindo);
7447     UnlockMutex(&ENV_LOCK(env));
7448     return x;
7449 }
7450 
7451 int
jl_word_add(buf,dic_no,yomi,kanji,comment,hinsi,init_hindo)7452 jl_word_add(buf, dic_no, yomi, kanji, comment, hinsi, init_hindo)
7453 register struct wnn_buf *buf;
7454 int     dic_no;
7455 w_char  *yomi,*kanji,*comment;
7456 int     hinsi,init_hindo;
7457 {
7458     int x;
7459 
7460     if(!buf || !(buf->env)) return(-1);
7461     LockMutex(&BUF_LOCK(buf));
7462     LockMutex(&(envmt->env_lock));
7463     buf_wnn_errorno_set = 0;
7464     x = jl_word_add_e_body((WNN_ENV_INT *)buf->env, dic_no, yomi, kanji,
7465 			   comment, hinsi, init_hindo);
7466     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7467     UnlockMutex(&(envmt->env_lock));
7468     UnlockMutex(&BUF_LOCK(buf));
7469     return x;
7470 }
7471 
7472 static int
jl_word_delete_e_body(env,dic_no,entry)7473 jl_word_delete_e_body(env, dic_no, entry)
7474 struct wnn_env_int *env;
7475 int	dic_no;
7476 int	entry;
7477 {
7478     register int x;
7479 
7480     if((x = js_word_delete(env, dic_no, entry)) == -1) {
7481 	env_wnn_errorno_copy(env);
7482 	if_dead_disconnect(env);
7483 	return(-1);
7484     }
7485     return (x);
7486 }
7487 
7488 int
jl_word_delete_e(env,dic_no,entry)7489 jl_word_delete_e(env, dic_no, entry)
7490 struct wnn_env *env;
7491 int     dic_no;
7492 int     entry;
7493 {
7494     int x;
7495 
7496     if(!env) return(-1);
7497     LockMutex(&ENV_LOCK(env));
7498     env_wnn_errorno_set = 0;
7499     x = jl_word_delete_e_body((WNN_ENV_INT *)env, dic_no, entry);
7500     UnlockMutex(&ENV_LOCK(env));
7501     return x;
7502 }
7503 
7504 int
jl_word_delete(buf,dic_no,entry)7505 jl_word_delete(buf, dic_no, entry)
7506 register struct wnn_buf *buf;
7507 int     dic_no;
7508 int     entry;
7509 {
7510     int x;
7511 
7512     if(!buf || !(buf->env)) return(-1);
7513     LockMutex(&BUF_LOCK(buf));
7514     LockMutex(&(envmt->env_lock));
7515     buf_wnn_errorno_set = 0;
7516     x = jl_word_delete_e_body((WNN_ENV_INT *)buf->env, dic_no, entry);
7517     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7518     UnlockMutex(&(envmt->env_lock));
7519     UnlockMutex(&BUF_LOCK(buf));
7520     return x;
7521 }
7522 
7523 static int
file_read(env,fname)7524 file_read(env, fname)
7525 struct wnn_env_int *env;
7526 char *fname;
7527 {
7528     register int fid;
7529     if(fname[0] == C_LOCAL){
7530 	fid = js_file_send(env, fname + 1);
7531     }else{
7532 	fid = js_file_read(env, fname);
7533     }
7534     if(fid >= 0){
7535 	add_file_to_env(env, fid, fname);
7536     }
7537     return(fid);
7538 }
7539 
7540 static int
file_remove(server,fname,pwd)7541 file_remove(server, fname, pwd)
7542 register WNN_JSERVER_ID *server;
7543 char *fname;
7544 char *pwd;
7545 {
7546     if(fname[0] == C_LOCAL){
7547 	return(js_file_remove_client(server, fname + 1, pwd));
7548     }else{
7549 	return(js_file_remove(server, fname, pwd));
7550     }
7551 }
7552 
7553 
7554 static int
file_discard(env,fid)7555 file_discard(env, fid)
7556 register struct wnn_env_int *env;
7557 register int fid;
7558 {
7559     delete_file_from_env(env, fid);
7560     return(js_file_discard(env, fid));
7561 }
7562 
7563 static int
jl_hinsi_number_e_body(env,name)7564 jl_hinsi_number_e_body(env, name)
7565 register struct wnn_env_int *env;
7566 w_char *name;
7567 {
7568     register int x;
7569 
7570     if((x = js_hinsi_number(env->orig.js_id, name)) == -1) {
7571 	env_wnn_errorno_copy(env);
7572 	if_dead_disconnect(env);
7573 	return(-1);
7574     }
7575     return (x);
7576 }
7577 
7578 int
jl_hinsi_number_e(env,name)7579 jl_hinsi_number_e(env, name)
7580 register struct wnn_env *env;
7581 w_char *name;
7582 {
7583     int x;
7584 
7585     if(!env) return(-1);
7586     LockMutex(&ENV_LOCK(env));
7587     env_wnn_errorno_set = 0;
7588     x = jl_hinsi_number_e_body((WNN_ENV_INT *)env, name);
7589     UnlockMutex(&ENV_LOCK(env));
7590     return x;
7591 }
7592 
7593 int
jl_hinsi_number(buf,name)7594 jl_hinsi_number(buf, name)
7595 register struct wnn_buf *buf;
7596 w_char *name;
7597 {
7598     int x;
7599 
7600     if(!buf || !(buf->env)) return(-1);
7601     LockMutex(&BUF_LOCK(buf));
7602     LockMutex(&(envmt->env_lock));
7603     buf_wnn_errorno_set = 0;
7604     x = jl_hinsi_number_e_body((WNN_ENV_INT *)buf->env, name);
7605     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7606     UnlockMutex(&(envmt->env_lock));
7607     UnlockMutex(&BUF_LOCK(buf));
7608     return x;
7609 }
7610 
jl_hinsi_name_e_body(env,no)7611 static w_char *jl_hinsi_name_e_body(env, no)
7612 register struct wnn_env_int *env;
7613 register int no;
7614 {
7615     w_char *x;
7616 
7617     if(js_hinsi_name(env->orig.js_id, no, &env_rb) == -1) {
7618 	env_wnn_errorno_copy(env);
7619 	if_dead_disconnect(env);
7620 	return(NULL);
7621     }
7622     x = (w_char *)(env_rb.buf);
7623     return x;
7624 }
7625 
jl_hinsi_name_e(env,no)7626 w_char *jl_hinsi_name_e(env, no)
7627 register struct wnn_env *env;
7628 register int no;
7629 {
7630     w_char *x;
7631 
7632     if(!env) return(NULL);
7633     LockMutex(&ENV_LOCK(env));
7634     env_wnn_errorno_set = 0;
7635     x = jl_hinsi_name_e_body((WNN_ENV_INT *)env, no);
7636     UnlockMutex(&ENV_LOCK(env));
7637     return x;
7638 }
7639 
7640 w_char *
jl_hinsi_name(buf,no)7641 jl_hinsi_name(buf, no)
7642 register struct wnn_buf *buf;
7643 register int no;
7644 {
7645     w_char *x;
7646 
7647     if(!buf || !(buf->env)) return(NULL);
7648     LockMutex(&BUF_LOCK(buf));
7649     LockMutex(&(envmt->env_lock));
7650     buf_wnn_errorno_set = 0;
7651     x = jl_hinsi_name_e_body((WNN_ENV_INT *)buf->env, no);
7652     if(x == NULL) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7653     UnlockMutex(&(envmt->env_lock));
7654     UnlockMutex(&BUF_LOCK(buf));
7655     return x;
7656 }
7657 
7658 static int
jl_hinsi_list_e_body(env,dic_no,name,area)7659 jl_hinsi_list_e_body(env, dic_no, name, area)
7660 register struct wnn_env_int *env;
7661 int dic_no;
7662 w_char *name;
7663 w_char ***area;
7664 {
7665     int x;
7666 
7667     if((x = js_hinsi_list(env, dic_no, name, &env_rb)) == -1) {
7668 	env_wnn_errorno_copy(env);
7669 	if_dead_disconnect(env);
7670 	return(-1);
7671     }
7672     *area = (w_char **)(env_rb.buf);
7673     return(x);
7674 }
7675 
7676 int
jl_hinsi_list_e(env,dic_no,name,area)7677 jl_hinsi_list_e(env, dic_no, name, area)
7678 register struct wnn_env *env;
7679 int dic_no;
7680 w_char *name;
7681 w_char ***area;
7682 {
7683     int x;
7684 
7685     if(!env) return(-1);
7686     LockMutex(&ENV_LOCK(env));
7687     env_wnn_errorno_set = 0;
7688     x = jl_hinsi_list_e_body((WNN_ENV_INT *)env, dic_no, name, area);
7689     UnlockMutex(&ENV_LOCK(env));
7690     return x;
7691 }
7692 
7693 int
jl_hinsi_list(buf,dic_no,name,area)7694 jl_hinsi_list(buf, dic_no, name, area)
7695 register struct wnn_buf *buf;
7696 int dic_no;
7697 w_char *name;
7698 w_char ***area;
7699 {
7700     int x;
7701 
7702     if(!buf || !(buf->env)) return(-1);
7703     LockMutex(&BUF_LOCK(buf));
7704     LockMutex(&(envmt->env_lock));
7705     buf_wnn_errorno_set = 0;
7706     x = jl_hinsi_list_e_body((WNN_ENV_INT *)buf->env, dic_no, name, area);
7707     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7708     UnlockMutex(&(envmt->env_lock));
7709     UnlockMutex(&BUF_LOCK(buf));
7710     return x;
7711 }
7712 
7713 static int
jl_hinsi_dicts_e_body(env,no,area)7714 jl_hinsi_dicts_e_body(env, no, area)
7715 register struct wnn_env_int *env;
7716 int no;
7717 int **area;
7718 {
7719     int x;
7720 
7721     if((x = js_hinsi_dicts(env, no, &env_rb)) == -1) {
7722 	env_wnn_errorno_copy(env);
7723 	if_dead_disconnect(env);
7724 	return(-1);
7725     }
7726     *area = (int *)(env_rb.buf);
7727     return(x);
7728 }
7729 
7730 int
jl_hinsi_dicts_e(env,no,area)7731 jl_hinsi_dicts_e(env, no, area)
7732 register struct wnn_env *env;
7733 int no;
7734 int **area;
7735 {
7736     int x;
7737 
7738     if(!env) return(-1);
7739     LockMutex(&ENV_LOCK(env));
7740     env_wnn_errorno_set = 0;
7741     x = jl_hinsi_dicts_e_body((WNN_ENV_INT *)env, no, area);
7742     UnlockMutex(&ENV_LOCK(env));
7743     return x;
7744 }
7745 
7746 int
jl_hinsi_dicts(buf,no,area)7747 jl_hinsi_dicts(buf, no, area)
7748 register struct wnn_buf *buf;
7749 int no;
7750 int **area;
7751 {
7752     int x;
7753 
7754     if(!buf || !(buf->env)) return(-1);
7755     LockMutex(&BUF_LOCK(buf));
7756     LockMutex(&(envmt->env_lock));
7757     buf_wnn_errorno_set = 0;
7758     x = jl_hinsi_dicts_e_body((WNN_ENV_INT *)buf->env, no, area);
7759     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7760     UnlockMutex(&(envmt->env_lock));
7761     UnlockMutex(&BUF_LOCK(buf));
7762     return x;
7763 }
7764 
7765 static int
jl_word_comment_set_e_body(env,dic_no,entry,comment)7766 jl_word_comment_set_e_body(env, dic_no, entry, comment)
7767 register struct wnn_env_int *env;
7768 int	dic_no,entry;
7769 w_char *comment;
7770 {
7771     register int x;
7772 
7773     if((x = js_word_comment_set(env, dic_no, entry, comment)) == -1) {
7774 	env_wnn_errorno_copy(env);
7775 	if_dead_disconnect(env);
7776 	return(-1);
7777     }
7778     return (x);
7779 }
7780 
7781 int
jl_word_comment_set_e(env,dic_no,entry,comment)7782 jl_word_comment_set_e(env, dic_no, entry, comment)
7783 register struct wnn_env *env;
7784 int     dic_no,entry;
7785 w_char *comment;
7786 {
7787     int x;
7788 
7789     if(!env) return(-1);
7790     LockMutex(&ENV_LOCK(env));
7791     env_wnn_errorno_set = 0;
7792     x = jl_word_comment_set_e_body((WNN_ENV_INT *)env, dic_no, entry, comment);
7793     UnlockMutex(&ENV_LOCK(env));
7794     return x;
7795 }
7796 
7797 int
jl_word_comment_set(buf,dic_no,entry,comment)7798 jl_word_comment_set(buf, dic_no, entry, comment)
7799 register struct wnn_buf *buf;
7800 int     dic_no,entry;
7801 w_char *comment;
7802 {
7803     int x;
7804 
7805     if(!buf || !(buf->env)) return(-1);
7806     LockMutex(&BUF_LOCK(buf));
7807     LockMutex(&(envmt->env_lock));
7808     buf_wnn_errorno_set = 0;
7809     x = jl_word_comment_set_e_body((WNN_ENV_INT *)buf->env, dic_no, entry,
7810 				   comment);
7811     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7812     UnlockMutex(&(envmt->env_lock));
7813     UnlockMutex(&BUF_LOCK(buf));
7814     return x;
7815 }
7816 
7817 static int
jl_dic_comment_set_e_body(env,dic_no,comment)7818 jl_dic_comment_set_e_body(env, dic_no, comment)
7819 register struct wnn_env_int *env;
7820 int dic_no;
7821 w_char *comment;
7822 {
7823     register int x;
7824     WNN_DIC_INFO dic;
7825     WNN_FILE_INFO_STRUCT file;
7826 
7827     if(js_dic_info(env,dic_no,&dic) < 0) {
7828 	    env_wnn_errorno_copy(env);
7829 	    if_dead_disconnect(env);
7830 	    return(-1);
7831     }
7832     /*	dic Body	*/
7833     if (js_file_info(env,dic.body,&file) < 0) {
7834 	    env_wnn_errorno_copy(env);
7835 	    if_dead_disconnect(env);
7836 	    return(-1);
7837     }
7838     if((x = js_file_comment_set(env, file.fid, comment)) == -1) {
7839 	env_wnn_errorno_copy(env);
7840 	if_dead_disconnect(env);
7841 	return(-1);
7842     }
7843     return (x);
7844 }
7845 
7846 int
jl_dic_comment_set_e(env,dic_no,comment)7847 jl_dic_comment_set_e(env, dic_no, comment)
7848 register struct wnn_env *env;
7849 int dic_no;
7850 w_char *comment;
7851 {
7852     int x;
7853 
7854     if(!env) return(-1);
7855     LockMutex(&ENV_LOCK(env));
7856     env_wnn_errorno_set = 0;
7857     x = jl_dic_comment_set_e_body((WNN_ENV_INT *)env, dic_no, comment);
7858     UnlockMutex(&ENV_LOCK(env));
7859     return x;
7860 }
7861 
7862 int
jl_dic_comment_set(buf,dic_no,comment)7863 jl_dic_comment_set(buf, dic_no, comment)
7864 register struct wnn_buf *buf;
7865 int dic_no;
7866 w_char *comment;
7867 {
7868     int x;
7869 
7870     if(!buf || !(buf->env)) return(-1);
7871     LockMutex(&BUF_LOCK(buf));
7872     LockMutex(&(envmt->env_lock));
7873     buf_wnn_errorno_set = 0;
7874     x = jl_dic_comment_set_e_body((WNN_ENV_INT *)buf->env, dic_no, comment);
7875     if(x == -1) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
7876     UnlockMutex(&(envmt->env_lock));
7877     UnlockMutex(&BUF_LOCK(buf));
7878     return x;
7879 }
7880 
7881 
7882 int
jl_bun_suu(buf)7883 jl_bun_suu(buf)
7884 register struct wnn_buf *buf;
7885 {
7886     int x;
7887 
7888     if(!buf) return(0);
7889     LockMutex(&BUF_LOCK(buf));
7890     x = buf->bun_suu;
7891     UnlockMutex(&BUF_LOCK(buf));
7892     return x;
7893 }
7894 
7895 int
jl_zenkouho_suu(buf)7896 jl_zenkouho_suu(buf)
7897 register struct wnn_buf *buf;
7898 {
7899     int x;
7900 
7901     if(!buf) return(0);
7902     LockMutex(&BUF_LOCK(buf));
7903     if(buf->zenkouho_daip)
7904         x = buf->zenkouho_dai_suu;
7905     else
7906         x = buf->zenkouho_suu;
7907     UnlockMutex(&BUF_LOCK(buf));
7908     return x;
7909 }
7910 
7911 int
jl_zenkouho_bun(buf)7912 jl_zenkouho_bun(buf)
7913 register struct wnn_buf *buf;
7914 {
7915     int x;
7916 
7917     if(!buf) return(0);
7918     LockMutex(&BUF_LOCK(buf));
7919     x = buf->zenkouho_bun;
7920     UnlockMutex(&BUF_LOCK(buf));
7921     return x;
7922 }
7923 
7924 int
jl_c_zenkouho(buf)7925 jl_c_zenkouho(buf)
7926 register struct wnn_buf *buf;
7927 {
7928     int x;
7929 
7930     if(!buf) return(0);
7931     LockMutex(&BUF_LOCK(buf));
7932     x = buf->c_zenkouho;
7933     UnlockMutex(&BUF_LOCK(buf));
7934     return x;
7935 }
7936 
7937 int
jl_zenkouho_daip(buf)7938 jl_zenkouho_daip(buf)
7939 register struct wnn_buf *buf;
7940 {
7941     int x;
7942 
7943     if(!buf) return(0);
7944     LockMutex(&BUF_LOCK(buf));
7945     x = buf->zenkouho_daip;
7946     UnlockMutex(&BUF_LOCK(buf));
7947     return x;
7948 }
7949 
7950 int
jl_dai_top(buf,k)7951 jl_dai_top(buf, k)
7952 register struct wnn_buf *buf;
7953 int	k;
7954 {
7955     int x;
7956 
7957     if(!buf) return(0);
7958     LockMutex(&BUF_LOCK(buf));
7959     x = buf->bun[k]->dai_top;
7960     UnlockMutex(&BUF_LOCK(buf));
7961     return x;
7962 }
7963 
7964 int
jl_jiri_len(buf,k)7965 jl_jiri_len(buf, k)
7966 register struct wnn_buf *buf;
7967 int	k;
7968 {
7969     int x;
7970 
7971     if(!buf) return(0);
7972     LockMutex(&BUF_LOCK(buf));
7973     x = buf->bun[k]->jirilen;
7974     UnlockMutex(&BUF_LOCK(buf));
7975     return x;
7976 }
7977 
7978 struct wnn_env *
jl_env(buf)7979 jl_env(buf)
7980 register struct wnn_buf *buf;
7981 {
7982     struct wnn_env *x;
7983 
7984     if(!buf) return(NULL);
7985     LockMutex(&BUF_LOCK(buf));
7986     x = buf->env;
7987     UnlockMutex(&BUF_LOCK(buf));
7988     return x;
7989 }
7990 
7991 int
jl_get_wnn_errorno_env(env)7992 jl_get_wnn_errorno_env(env)
7993 register struct wnn_env *env;
7994 {
7995     int x;
7996 
7997     if(!env) return(-1);
7998     LockMutex(&ENV_LOCK(env));
7999     x = env_wnn_errorno_eql;
8000     UnlockMutex(&ENV_LOCK(env));
8001     return x;
8002 }
8003 
8004 int
jl_get_wnn_errorno_buf(buf)8005 jl_get_wnn_errorno_buf(buf)
8006 register struct wnn_buf *buf;
8007 {
8008     int x;
8009 
8010     if(!buf) return(-1);
8011     LockMutex(&BUF_LOCK(buf));
8012     x = buf_wnn_errorno_eql;
8013     UnlockMutex(&BUF_LOCK(buf));
8014     return x;
8015 }
8016 
8017 struct wnn_jdata *
jl_inspect(buf,bun_no)8018 jl_inspect(buf, bun_no)
8019 register struct wnn_buf *buf;
8020 int bun_no;
8021 {
8022     struct wnn_jdata *x;
8023 
8024     if(!buf || !(buf->env)) return(NULL);
8025     LockMutex(&BUF_LOCK(buf));
8026     LockMutex(&(envmt->env_lock));
8027     buf_wnn_errorno_set = 0;
8028     x = jl_word_info_e_body((WNN_ENV_INT *)buf->env, buf->bun[bun_no]->dic_no,
8029 			    buf->bun[bun_no]->entry);
8030     if(x == NULL) buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
8031     UnlockMutex(&(envmt->env_lock));
8032     UnlockMutex(&BUF_LOCK(buf));
8033     return x;
8034 }
8035 
8036 int
jl_env_sticky_e(env)8037 jl_env_sticky_e(env)
8038 register struct wnn_env *env;
8039 {
8040     int x;
8041 
8042     if(!env) return(-1);
8043     LockMutex(&ENV_LOCK(env));
8044     env_wnn_errorno_set = 0;
8045     if((x = js_env_sticky(env)) == -1) env_wnn_errorno_copy((WNN_ENV_INT *)env);
8046     UnlockMutex(&ENV_LOCK(env));
8047     return x;
8048 }
8049 
8050 int
jl_env_sticky(buf)8051 jl_env_sticky(buf)
8052 register struct wnn_buf *buf;
8053 {
8054     int x;
8055 
8056     if(!buf || !(buf->env)) return(-1);
8057     LockMutex(&BUF_LOCK(buf));
8058     LockMutex(&(envmt->env_lock));
8059     buf_wnn_errorno_set = 0;
8060     if((x = jl_env_sticky_e((WNN_ENV_INT *)buf->env)) == -1)
8061 	buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
8062     UnlockMutex(&(envmt->env_lock));
8063     UnlockMutex(&BUF_LOCK(buf));
8064     return x;
8065 }
8066 
8067 int
jl_env_un_sticky_e(env)8068 jl_env_un_sticky_e(env)
8069 register struct wnn_env *env;
8070 {
8071     int x;
8072 
8073     if(!env) return(-1);
8074     LockMutex(&ENV_LOCK(env));
8075     if((x = js_env_un_sticky(env)) == -1) env_wnn_errorno_copy((WNN_ENV_INT *)env);
8076     UnlockMutex(&ENV_LOCK(env));
8077     return x;
8078 }
8079 
8080 int
jl_env_un_sticky(buf)8081 jl_env_un_sticky(buf)
8082 register struct wnn_buf *buf;
8083 {
8084     int x;
8085 
8086     if(!buf || !(buf->env)) return(-1);
8087     LockMutex(&BUF_LOCK(buf));
8088     LockMutex(&(envmt->env_lock));
8089     buf_wnn_errorno_set = 0;
8090     if((x = jl_env_un_sticky_e((WNN_ENV_INT *)buf->env)) == -1)
8091 	buf_wnn_errorno_copy((WNN_BUF_MT *)buf);
8092     UnlockMutex(&(envmt->env_lock));
8093     UnlockMutex(&BUF_LOCK(buf));
8094     return x;
8095 }
8096 
8097 char *
jl_get_lang(buf)8098 jl_get_lang(buf)
8099 register struct wnn_buf *buf;
8100 {
8101     char *x;
8102 
8103     if(!buf || !(buf->env)) return(NULL);
8104     LockMutex(&BUF_LOCK(buf));
8105     LockMutex(&(envmt->env_lock));
8106     buf_wnn_errorno_set = 0;
8107     x = js_get_lang((WNN_ENV_INT *)buf->env);
8108     UnlockMutex(&(envmt->env_lock));
8109     UnlockMutex(&BUF_LOCK(buf));
8110     return x;
8111 }
8112 
8113 
8114 /* �ѥ�᡼�������ȥ��塼�˥� */
8115 typedef struct _InfoShoRec {
8116     int		hindo;
8117     int		ima;
8118     int		jirilength;
8119     int		bunlength;
8120     int		dictnice;
8121     int		hyoka;
8122     int		daihyoka;
8123     int		dai_top;
8124     w_char	*yomi;
8125     int		serial;
8126     int		kangovect;
8127     struct _InfoShoRec *next;
8128 } InfoShoRec;
8129 
8130 typedef struct _InfoDaiRec {
8131     int		n;
8132     int		hindo;
8133     int		ima;
8134     int		jirilength;
8135     int		sholength;
8136     int		dictnice;
8137     int		dailength;
8138     struct _InfoDaiRec *next;
8139 } InfoDaiRec;
8140 
8141 typedef InfoDaiRec InfoTotalRec;
8142 
8143 typedef struct _WnnAutoTune {
8144     InfoDaiRec		*s_dai_info;
8145     InfoDaiRec		*e_dai_info;
8146     InfoShoRec		*s_sho_info;
8147     InfoShoRec		*e_sho_info;
8148     InfoTotalRec	*s_total_info;
8149     InfoTotalRec	*e_total_info;
8150     struct wnn_param	new_param;
8151     struct wnn_param	get_param;
8152 } WnnAutoTune;
8153 
8154 static int
Giji_Hinsi_Check(info)8155 Giji_Hinsi_Check(info)
8156 InfoShoRec *info;
8157 {
8158     InfoShoRec *p = info;
8159 
8160     for (; p; p = p->next) {
8161 	if ((p->serial == -11) || (p->serial == -1)) {
8162 	    return(0);
8163 	}
8164     }
8165     return(1);
8166 }
8167 
8168 static int
Chval(h,o)8169 Chval(h, o)
8170 int h, o;
8171 {
8172     if (h > o) return(-1);
8173     if (h == o) return(0);
8174     return(1);
8175 }
8176 
8177 static int
Sho_Info(buf,bun_no,info)8178 Sho_Info(buf, bun_no, info)
8179 struct wnn_buf *buf;
8180 int bun_no;
8181 InfoShoRec *info;
8182 {
8183     WNN_BUN *data = NULL;
8184     WNN_DIC_INFO dic;
8185     w_char *yomi;
8186 
8187     if (!buf || !buf->bun || !(data = buf->bun[bun_no])) return(-1);
8188     if (js_dic_info(buf->env, data->dic_no, &dic) < 0)
8189 	return(-1);
8190     if (!(yomi = (w_char *)malloc(sizeof(w_char) * (data->yomilen + 1))))
8191 	return(-1);
8192     wnn_Strncpy(yomi, data->yomi, data->yomilen);
8193     yomi[data->yomilen] = (w_char)0;
8194     info->yomi = yomi;
8195     info->serial = data->entry;
8196     info->hindo = data->hindo;
8197     info->dictnice = dic.nice;
8198     info->ima = data->ima;
8199     info->hyoka = data->hyoka;
8200     info->daihyoka = data->daihyoka;
8201     info->kangovect = data->kangovect;
8202     info->dai_top = data->dai_top;
8203     info->jirilength = data->jirilen;
8204     info->bunlength = data->kanjilen;
8205     return(0);
8206 }
8207 
8208 static InfoShoRec *
Atume(buf)8209 Atume(buf)
8210 register struct wnn_buf *buf;
8211 {
8212     int max = jl_bun_suu(buf);
8213     int i;
8214     InfoShoRec *info, *prev;
8215 
8216     if (max <= 0) return(NULL);
8217     if (!(info = (InfoShoRec *)malloc(sizeof(InfoShoRec) * max))) return(NULL);
8218     bzero((char *)info, sizeof(InfoShoRec) * max);
8219 
8220     for (i = 0; i < max; i++) {
8221 	if (Sho_Info(buf, i, &info[i]) < 0) {
8222 	    free((char *)info);
8223 	    return(NULL);
8224 	}
8225 	info[i].next = NULL;
8226 	if (i > 0) prev->next = &info[i];
8227 	prev = &info[i];
8228     }
8229     return(info);
8230 }
8231 
8232 static InfoTotalRec *
Total(p)8233 Total(p)
8234 InfoDaiRec *p;
8235 {
8236     int nn;
8237     InfoTotalRec *info;
8238 
8239     if (!p) return(NULL);
8240     if (!(info = (InfoTotalRec *)malloc(sizeof(InfoTotalRec)))) return(NULL);
8241     bzero((char *)info, sizeof(InfoTotalRec));
8242 
8243     for (; p; p = p->next) {
8244 	nn = p->n;
8245 	info->n += nn;
8246 	info->hindo += p->hindo/nn;
8247 	info->ima += p->ima/nn;
8248 	info->jirilength += p->jirilength/nn;
8249 	info->sholength += p->sholength/nn;
8250 	info->dictnice += p->dictnice/nn;
8251 	info->dailength += p->dailength;
8252     }
8253     return(info);
8254 }
8255 
8256 static InfoDaiRec *
Dai_Info(sho_p)8257 Dai_Info(sho_p)
8258 InfoShoRec *sho_p;
8259 {
8260     int cnt, i;
8261     InfoShoRec *p = sho_p;
8262     InfoDaiRec *d, *info, *prev;
8263 
8264     for (cnt = 0; p; p = p->next) {
8265 	if (p->dai_top) cnt++;
8266     }
8267 
8268     if (cnt <= 0) return(NULL);
8269     if (!(info = (InfoDaiRec *)malloc(sizeof(InfoDaiRec) * cnt))) return(NULL);
8270     bzero((char *)info, sizeof(InfoDaiRec) * cnt);
8271 
8272     d = &info[0];
8273     for (i = 0, p = sho_p; p; p = p->next) {
8274 	if (p->dai_top) {
8275 	    d = &info[i];
8276 	    if (i > 0) prev->next = d;
8277 	    prev = d;
8278 	    i++;
8279 	}
8280 	d->n++;
8281 	d->hindo += p->hindo;
8282 	d->ima += p->ima;
8283 	d->jirilength += p->jirilength;
8284 	d->sholength += p->bunlength;
8285 	d->dictnice += p->dictnice;
8286 	d->dailength = d->sholength;
8287     }
8288     return(info);
8289 }
8290 
8291 
8292 static int
wnn_set_area_body(buf,bun_no,area,kanjip)8293 wnn_set_area_body(buf, bun_no, area, kanjip)
8294 struct wnn_buf_mt *buf;
8295 register int bun_no;
8296 w_char *area;
8297 int kanjip;
8298 {
8299     register WNN_BUN *wb, *wb1;
8300     w_char *c, *end, *area1 = area;
8301     int len;
8302 
8303     if ((kanjip != WNN_KANJI ) || (bun_no < 0) ||
8304 	!(wb = buf->orig.bun[bun_no])) {
8305 	return(0);
8306     }
8307 
8308     for(wb1 = wb; ;){
8309 	if(wb1 != wb) c = (w_char *)wb1;
8310 	else c = wb1->yomi;
8311 	end = (w_char *)&wb1->next;
8312 	for(;c < end;){
8313 	    if(!kanjip){
8314 		if((*c++ = *area++) == 0){ area--; goto out;}
8315 	    }else{
8316 		if(*c++ == 0) kanjip--;
8317 	    }
8318 	}
8319 	if (!*end) {
8320 	    wb1->next = get_new_bun(buf);
8321 	}
8322 	wb1 = wb1->next;
8323     }
8324 out:
8325     wb1->next = NULL; 	/* 95/6/13 waya */
8326     len = area - area1;
8327     wb->kanjilen = wb->real_kanjilen = len;
8328     wb->jirilen = wb->yomilen;
8329     return 0;
8330 }
8331 
8332 int
wnn_set_area(buf,bun_no,area,kanjip)8333 wnn_set_area(buf, bun_no, area, kanjip)
8334 struct wnn_buf *buf;
8335 register int bun_no;
8336 w_char *area;
8337 int kanjip;
8338 {
8339     int x;
8340 
8341     if(!buf) return(0);
8342     LockMutex(&BUF_LOCK(buf));
8343     x = wnn_set_area_body((WNN_BUF_MT *)buf, bun_no, area, kanjip);
8344     UnlockMutex(&BUF_LOCK(buf));
8345     return x;
8346 }
8347 
8348 /* --------------- for ikeiji ---------- */
8349 extern int js_ikeiji_with_data();
8350 int jl_zenikeiji_dai_with_hinsi_name();
8351 
8352 /*:::DOC_START
8353  *
8354  *    Function Name: jl_zenikeiji_dai
8355  *    Description  :
8356  *         do ikeiji-henkan with some conditions
8357  *
8358  *    Parameter    :
8359  *         buf :      (InOut) kanji buffer
8360  *         bun_no :     (In) staring bun no.
8361  *         bun_no2 :     (In) ending bun no. (exclusive)
8362  *         use_maep :     (In)  connective info.
8363  *         uniq_level :     (In) unique level
8364  *
8365  *    Return value : no. of dai-bunsetsu
8366  *
8367  *    Author      :  fujimori
8368  *
8369  *    Revision history:
8370  *         20-Dec-94: initial release
8371  *
8372  *:::DOC_END
8373  */
8374 int
jl_zenikeiji_dai(buf,bun_no,bun_no2,use_maep,uniq_level)8375 jl_zenikeiji_dai(buf, bun_no, bun_no2, use_maep, uniq_level)
8376 register struct wnn_buf *buf;
8377 int bun_no, bun_no2, use_maep, uniq_level;
8378 {
8379 int nhinsi = 1; char hname[32];
8380 char * p_hname = &hname[0];
8381     int x;
8382  strcpy(hname, "�۷���");
8383     x = jl_zenikeiji_dai_with_hinsi_name(buf, bun_no, bun_no2, use_maep, uniq_level, nhinsi, &p_hname );
8384     return x;
8385 }
8386 
8387 /*:::DOC_START
8388  *
8389  *    Function Name: zen_conv_dai_ikeiji1
8390  *    Description  :
8391  *         do ikeiji-henkan with some conditions
8392  *
8393  *    Parameter    :
8394  *         buf :      (InOut) kanji buffer
8395  *         bun_no :     (In) staring bun no.
8396  *         bun_no2 :     (In) ending bun no. (exclusive)
8397  *         use_maep :     (In)  connective info.
8398  *         uniq_level :     (In) unique level
8399  *         fuku :     (In) fukugou-go
8400  *         nhinsi :     (In) no. of hinsi
8401  *         hlist :     (In) hinsi-list
8402  *
8403  *    Return value : no. of dai-bunsetsu
8404  *
8405  *    Author      :  fujimori
8406  *
8407  *    Revision history:
8408  *         20-Dec-94: initial release
8409  *
8410  *:::DOC_END
8411  */
8412 static int
zen_conv_dai_ikeiji1(buf,bun_no,bun_no2,use_maep,uniq_level,fuku,nhinsi,hlist)8413 zen_conv_dai_ikeiji1(buf, bun_no, bun_no2, use_maep, uniq_level, fuku, nhinsi, hlist)
8414 register struct wnn_buf *buf;
8415 int bun_no, bun_no2, use_maep, uniq_level, fuku, nhinsi, *hlist;
8416 {
8417     register struct wnn_buf_mt *buf_m = (WNN_BUF_MT *)buf;
8418     int cnt;
8419     w_char yomi[LENGTHBUNSETSU], yomi1[LENGTHBUNSETSU];
8420     struct wnn_dai_bunsetsu *dp;
8421     int tmp;
8422     register int k;
8423     int x;
8424     int nobi_top;
8425     w_char yomi_orig[LENGTHBUNSETSU];
8426 
8427     if(bun_no2 > (tmp = dai_end(buf_m, bun_no)) ||
8428 	bun_no2 < 0) bun_no2 = tmp;
8429     jl_get_kanji_body(buf_m, bun_no, bun_no2, yomi);
8430     jl_get_yomi_body(buf_m, bun_no, bun_no2, yomi_orig);
8431 
8432     if(bun_no == buf->zenkouho_bun && buf->zenkouho_daip == IKEIJI){
8433 	x = buf->c_zenkouho;
8434 	return x;
8435     }
8436     if (use_maep & WNN_USE_MAE && bun_no > 0) {
8437 	dumbhinsi = buf->bun[bun_no - 1]->hinsi;
8438 	jl_get_yomi_body(buf_m, bun_no - 1, bun_no, yomi1);
8439 	mae_fzk = yomi1 + buf->bun[bun_no - 1]->jirilen;
8440     } else {
8441 	dumbhinsi = WNN_BUN_SENTOU;
8442 	mae_fzk = (w_char *)0;
8443     }
8444     if(use_maep & WNN_USE_ATO && bun_no2 < buf->bun_suu){
8445 	syuutanv = buf->bun[bun_no2]->kangovect;
8446 	syuutanv1 = WNN_VECT_KANZEN;
8447 	buf->zenkouho_endvect = syuutanv;
8448     }else{
8449 	syuutanv = WNN_VECT_KANZEN;
8450 	syuutanv1 = WNN_VECT_NO;
8451 	if(bun_no2 < buf->bun_suu){
8452 	    buf->bun[bun_no2]->dai_top = 1;
8453 	}
8454 	buf->zenkouho_endvect = -1;
8455     }
8456     if(!(buf->env)) return(-1);
8457     LockMutex(&(envmt->env_lock));
8458     if(fuku == 0 && nhinsi == 0) {
8459 /* ?? error for this henkan */
8460 #if 0
8461 	if(buf->bun[bun_no]->fukugou == 0 && buf->bun[bun_no]->num_hinsi == 0) {
8462 	    if((cnt = js_kanzen_dai(buf->env, yomi, dumbhinsi, mae_fzk,
8463 				    syuutanv, syuutanv1, &buf_rb)) < 0){
8464 		buf_wnn_errorno_copy(buf_m);
8465 		if_dead_disconnect_b(buf_m);
8466 		UnlockMutex(&(envmt->env_lock));
8467 		return(-1);
8468 	    }
8469 	} else {
8470 	    if((cnt = js_ikeiji_with_data(buf->env, buf->bun[bun_no]->fukugou,
8471 			  buf->bun[bun_no]->num_hinsi, buf->bun[bun_no]->hinsi_list,
8472 			  WNN_IKEIJI_DAI, yomi, dumbhinsi, mae_fzk, syuutanv,
8473 			  syuutanv1, WNN_VECT_BUNSETSU,
8474 		      /* need fugokugo-len, hinsi, etc */ buf->bun[bun_no], yomi_orig,
8475 			  &buf_rb)) < 0) {
8476 		buf_wnn_errorno_copy(buf_m);
8477                 if_dead_disconnect_b(buf_m);
8478                 UnlockMutex(&(envmt->env_lock));
8479                 return(-1);
8480             }
8481 	}
8482 #else
8483 /* ?? need set
8484 		buf_wnn_errorno_copy(buf_m);
8485 */
8486                 if_dead_disconnect_b(buf_m);
8487                 UnlockMutex(&(envmt->env_lock));
8488                 return(-1);
8489 #endif /* 0 */
8490     } else {
8491 	if((cnt = js_ikeiji_with_data(buf->env, fuku, nhinsi, hlist,
8492 		      WNN_IKEIJI_DAI, yomi, dumbhinsi, mae_fzk, syuutanv,
8493 		      syuutanv1, WNN_VECT_BUNSETSU,
8494 		      /* need fugokugo-len, hinsi, etc */ buf->bun[bun_no], yomi_orig,
8495 		      &buf_rb)) < 0) {
8496 	    buf_wnn_errorno_copy(buf_m);
8497 	    if_dead_disconnect_b(buf_m);
8498 	    UnlockMutex(&(envmt->env_lock));
8499 	    return(-1);
8500 	}
8501     }
8502 
8503     dp = (struct wnn_dai_bunsetsu *)buf_rb.buf;
8504 
8505     free_zenkouho(buf_m);
8506 		/* Wander if it is OK, that is, only when all the
8507 		 * zenkouho's are got from zenkouho_dai, we need not move
8508 		 * the current dai-bunsetsu to the top of zenkouho's
8509 		 */
8510     for(k = bun_no; k < bun_no2; k++){
8511 	if(buf->bun[k]->from_zenkouho != ZENKOUHO_IKEIJI_DAI)break;
8512     }
8513     nobi_top = buf->bun[k]->nobi_top;
8514     if(k != bun_no2){		/* move the current to the top. */
8515 	make_space_for(buf_m, ZENKOUHO, buf->zenkouho_suu, buf->zenkouho_suu,
8516 		       bun_no2 - bun_no);
8517 	set_dai(&buf->bun[bun_no], &buf->zenkouho[0], bun_no2 - bun_no);
8518 	buf->zenkouho_dai[0] = 0;
8519 	buf->zenkouho_dai[1] = bun_no2 - bun_no;
8520 	buf->zenkouho_dai_suu = 1;
8521 	buf->zenkouho_suu = bun_no2 - bun_no;
8522 	k = get_c_jikouho_dai(dp, cnt, buf->bun, bun_no);
8523 	if(k >= 0){
8524 	    buf->zenkouho[0]->dai_top =
8525 		(dp[k].sbn->status == WNN_CONNECT)? 0:1;
8526 	    buf->zenkouho[bun_no2-bun_no-1]->dai_end =
8527 		(dp[k].sbn[dp[k].sbncnt-1].status_bkwd == WNN_CONNECT_BK)? 0:1;
8528 	    /* KURI *//* USO*?*/
8529 	} else if (cnt == 0) {
8530             /* �֡��פϸ������ 0 �ʤΤǡ�dai_top, dai_end ��
8531                ����Ū�� 1 �ˤ��� */
8532             buf->zenkouho[0]->dai_top = 1;
8533             buf->zenkouho[bun_no2-bun_no-1]->dai_end = 1;
8534 	}
8535 	if(uniq_level || k < 0){
8536 	    insert_dai_or_ikeiji(buf_m, ZENKOUHO, -1, -1, dp, cnt, uniq_level, 0, 0, NULL, IKEIJI);
8537 	}else{
8538 	    insert_dai_or_ikeiji(buf_m, ZENKOUHO, -1, -1, dp, k, uniq_level, 0, 0, NULL, IKEIJI);
8539 	    insert_dai_or_ikeiji(buf_m, ZENKOUHO, -1, -1, dp + k + 1, cnt - k - 1,
8540 		       uniq_level, 0, 0, NULL, IKEIJI);
8541 	}
8542 	buf->c_zenkouho = 0;
8543     }else{
8544 	insert_dai_or_ikeiji(buf_m, ZENKOUHO, -1, -1, dp, cnt, uniq_level, 0, 0, NULL, IKEIJI);
8545 	k = get_c_jikouho_from_zenkouho_dai(buf_m, buf->bun[bun_no]);
8546 	if(k < 0){
8547 	    k = 0;	/* Only when the kouho has been removed from dict. */
8548 	}
8549 	buf->c_zenkouho = k;
8550     }
8551     buf->zenkouho_bun = bun_no;
8552     buf->zenkouho_end_bun = bun_no2;
8553     buf->zenkouho_daip = IKEIJI;
8554     for(k = 0 ; k < buf->zenkouho_suu; k++){
8555 	if(buf->zenkouho[k]->ima && buf->zenkouho[k]->dic_no != -1){
8556 	    add_down_bnst(buf_m, bun_no, buf->zenkouho[k]);
8557 	}
8558 	/*
8559 	 * ʸ�῭�Ф�/�̤��Ԥä��弡������ä����ˤϡ��������ʸ�����
8560 	 * �ˤ�ʸ�῭�Ф�/�̤�ξ����Ĥ��Ƥ�����ʸ���ڤ�ؽ��ǻ��Ѥ��롣
8561 	 */
8562 	if (nobi_top) buf->zenkouho[k]->nobi_top = 1;
8563     }
8564     x = buf->c_zenkouho;
8565     UnlockMutex(&(envmt->env_lock));
8566     return x;
8567 }
8568 
8569 /*:::DOC_START
8570  *
8571  *    Function Name: jl_zenikeiji_dai_with_hinsi_name
8572  *    Description  :
8573  *         do ikeiji-henkan with some conditions
8574  *
8575  *    Parameter    :
8576  *         buf :      (InOut) kanji buffer
8577  *         bun_no :     (In) staring bun no.
8578  *         bun_no2 :     (In) ending bun no. (exclusive)
8579  *         use_maep :     (In)  connective info.
8580  *         uniq_level :     (In) unique level
8581  *         nhinsi :     (In) no. of hinsi-name
8582  *         hname :     (In) hinsi name-list
8583  *
8584  *    Return value : no. of dai-bunsetsu
8585  *
8586  *    Author      :  fujimori
8587  *
8588  *    Revision history:
8589  *         20-Dec-94: initial release
8590  *
8591  *:::DOC_END
8592  */
8593 int
jl_zenikeiji_dai_with_hinsi_name(buf,bun_no,bun_no2,use_maep,uniq_level,nhinsi,hname)8594 jl_zenikeiji_dai_with_hinsi_name(buf, bun_no, bun_no2, use_maep, uniq_level, nhinsi, hname)
8595 register struct wnn_buf *buf;
8596 int bun_no, bun_no2, use_maep, uniq_level, nhinsi;
8597 char **hname;
8598 {
8599     int x, i, hsize, *hno = NULL;
8600     w_char tmp[64];
8601 
8602     if(!buf) return(-1);
8603     LockMutex(&BUF_LOCK(buf));
8604     buf_wnn_errorno_set = 0;
8605 /*    if(strncmp(js_get_lang(buf->env), WNN_J_LANG, 5) || nhinsi == 0) {
8606         UnlockMutex(&BUF_LOCK(buf));
8607         return(-1);
8608 	} */
8609     if(nhinsi){
8610         hsize = abs(nhinsi);
8611         hno = (int *)malloc(hsize * sizeof(int));
8612         for(i = 0; i < hsize; i++) {
8613             _Sstrcpy(tmp, hname[i]);
8614             if((hno[i] = jl_hinsi_number_e(buf->env, tmp)) == -1) {
8615                 free((char *)hno);
8616                 UnlockMutex(&BUF_LOCK(buf));
8617                 return(-1);
8618             }
8619         }
8620     }
8621     x = zen_conv_dai_ikeiji1(buf, bun_no, bun_no2, use_maep, uniq_level, 0, nhinsi, hno);
8622     if(nhinsi) free((char *)hno);
8623     UnlockMutex(&BUF_LOCK(buf));
8624     return x;
8625 }
8626 /* end of jl_zenikeiji_dai_with_hinsi_name */
8627 
8628 /*:::DOC_START
8629  *
8630  *    Function Name: insert_dai_or_ikeiji
8631  *    Description  :
8632  *         insert dai-bunsetsu in to kanji-buffer
8633  *
8634  *    Parameter    :
8635  *         buf :      (InOut) kanji buffer
8636  *         zenp :     (In) zen-kouho type.
8637  *         bun_no :     (In) staring bun no.
8638  *         bun_no2 :     (In) ending bun no. (exclusive)
8639  *         dp :     (In)  dai-bunsetsu
8640  *         dcnt :     (In)  no. of dai-bunsetsu
8641  *         uniq_level :     (In) unique level
8642  *         fuku :     (In)  fukugou-go
8643  *         nhinsi :     (In)  no. of hinsi
8644  *         hlist :     (In)  hinsi list
8645  *         daip :     (In)  henkan type
8646  *
8647  *    Return value : no. of dai-bunsetsu
8648  *
8649  *    Author      :  fujimori
8650  *
8651  *    Revision history:
8652  *         20-Dec-94: initial release
8653  *
8654  *:::DOC_END
8655  */
8656 /* from insert_dai */
8657 	/* for zenkouho, assume bun_no = bun_no2 = zenkouho_suu */
8658 static int
insert_dai_or_ikeiji(buf,zenp,bun_no,bun_no2,dp,dcnt,uniq_level,fuku,nhinsi,hlist,daip)8659 insert_dai_or_ikeiji(buf, zenp, bun_no, bun_no2, dp, dcnt, uniq_level, fuku, nhinsi, hlist, daip)
8660 struct wnn_buf_mt *buf;
8661 int bun_no, bun_no2;
8662 struct wnn_dai_bunsetsu *dp;
8663 int dcnt;
8664 int zenp;
8665 int uniq_level;
8666 int fuku, nhinsi, *hlist;
8667 int daip;
8668 {
8669     register WNN_BUN **b, **b0;
8670     register int k, l, m;
8671     register int cnt = 0;
8672     struct wnn_sho_bunsetsu *sp, *sp1;
8673 
8674     if(bun_no == -1){
8675 	bun_no = bun_no2 = (zenp == BUN)? buf->orig.bun_suu: buf->orig.zenkouho_suu;
8676     }
8677 
8678     for(k = 0; k < dcnt ; k++){
8679 	cnt += dp[k].sbncnt;
8680     }
8681     make_space_for(buf, zenp, bun_no, bun_no2, cnt);
8682 				/* zenkouho_dai_suu must not be initialized */
8683 
8684     b = ((zenp == BUN)? buf->orig.bun: buf->orig.zenkouho) + bun_no;
8685 
8686     for(k = 0, m = buf->orig.zenkouho_dai_suu ; k < dcnt; k++){
8687 	/* �۷����Ѵ��κݤϡ�find_same_kouho_dai() ���ơ�
8688 	   ������ꥹ�ȤΥ��֥���ɤ� */
8689 	if(uniq_level){
8690 	    if(find_same_kouho_dai(&dp[k], buf, m, uniq_level))
8691 		continue;
8692 	}
8693 	sp = dp[k].sbn;
8694 	if(zenp == ZENKOUHO){
8695 	    buf->orig.zenkouho_dai[m++] = b - buf->orig.zenkouho;
8696 	}
8697 	b0 = b;
8698 	sp1 = sp;
8699 	for(l = 0 ; l < dp[k].sbncnt; l++){
8700 	    *b = get_sho(buf, sp, zenp, daip, fuku, nhinsi, hlist);
8701 	    if(zenp == ZENKOUHO){
8702 		if (l == dp[k].sbncnt -1){
8703 		    if(buf->orig.zenkouho_endvect != -1){
8704 			(*b)->dai_end = (sp->status_bkwd == WNN_CONNECT_BK)? 0:1;
8705 		    }else{
8706 			(*b)->dai_end = 0;
8707 		    }
8708 		}else{
8709 		    (*b)->dai_end = 0;
8710 		}
8711 	    }
8712 	    b++;
8713 	    sp++;
8714 	}
8715 	(*b0)->dai_top = (sp1->status == WNN_CONNECT)? 0:1;
8716 	(*b0)->daihyoka = dp[k].hyoka;
8717     }
8718     if(zenp == ZENKOUHO){
8719 	buf->orig.zenkouho_dai[m] = b - buf->orig.zenkouho;
8720 	buf->orig.zenkouho_suu = b - buf->orig.zenkouho;
8721 	buf->orig.zenkouho_dai_suu = m;
8722     }
8723     return(cnt + bun_no);
8724 }
8725 
8726 
8727 /*:::DOC_START
8728  *
8729  *    Function Name: jl_set_ikeiji_dai
8730  *    Description  :
8731  *         set current kouho
8732  *
8733  *    Parameter    :
8734  *         buf :      (InOut) kanji buffer
8735  *         offset :     (In) target bun no.
8736  *
8737  *    Return value : current bun no.
8738  *
8739  *    Author      :  fujimori
8740  *
8741  *    Revision history:
8742  *         20-Dec-94: initial release
8743  *
8744  *:::DOC_END
8745  */
8746 /* ?? need, identical jl_set_jikouho_dai */
8747 int
jl_set_ikeiji_dai(buf,offset)8748 jl_set_ikeiji_dai(buf, offset)
8749 register struct wnn_buf *buf;
8750 int offset;
8751 {
8752     register int st, end, bun, k;
8753 
8754     if(!buf) return(-1);
8755     LockMutex(&BUF_LOCK(buf));
8756     buf_wnn_errorno_set = 0;
8757     if(buf->zenkouho_suu <= 0) {
8758 	UnlockMutex(&BUF_LOCK(buf));
8759 	return(-1);
8760     }
8761     if(buf->zenkouho_daip == SHO){
8762 	UnlockMutex(&BUF_LOCK(buf));
8763 	return(-1);
8764     }
8765     offset = (offset + buf->zenkouho_dai_suu) % buf->zenkouho_dai_suu;
8766     if(buf->zenkouho_end_bun < buf->bun_suu && buf->zenkouho_endvect != -1)
8767 	buf->bun[buf->zenkouho_end_bun]->dai_top =
8768 		buf->zenkouho[buf->zenkouho_dai[offset+1]-1]->dai_end;
8769     free_bun((WNN_BUF_MT *)buf, buf->zenkouho_bun, buf->zenkouho_end_bun);
8770     st = buf->zenkouho_dai[offset];
8771     end = buf->zenkouho_dai[offset + 1];
8772     make_space_for((WNN_BUF_MT *)buf, BUN, buf->zenkouho_bun,
8773 		   buf->zenkouho_end_bun, end - st);
8774     for(bun = buf->zenkouho_bun, k = st; k < end;){
8775 	set_sho(buf->zenkouho[k++], &buf->bun[bun++]);
8776     }
8777     buf->zenkouho_end_bun = buf->zenkouho_bun + end - st;
8778     buf->c_zenkouho = offset;
8779     UnlockMutex(&BUF_LOCK(buf));
8780     return(offset);
8781 }
8782 
8783