Mercurial > freewnn
annotate Wnn/jlib.V3/jlv3.c @ 25:466fe6732d8d
- fixed more NULL pointer related errata
- suppress warnings
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sat, 06 Mar 2010 04:37:31 +0900 |
parents | bbc77ca4def5 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * $Id: jlv3.c,v 1.9 2002/07/14 04:26:57 hiroo Exp $ | |
3 */ | |
4 | |
5 /* | |
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system. | |
7 * This file is part of FreeWnn. | |
8 * | |
9 * Copyright Kyoto University Research Institute for Mathematical Sciences | |
10 * 1987, 1988, 1989, 1990, 1991, 1992 | |
11 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 | |
12 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 | |
13 * Copyright FreeWnn Project 1999, 2000, 2002 | |
14 * | |
15 * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> | |
16 * | |
17 * This program is free software; you can redistribute it and/or modify | |
18 * it under the terms of the GNU General Public License as published by | |
19 * the Free Software Foundation; either version 2 of the License, or | |
20 * (at your option) any later version. | |
21 * | |
22 * This program is distributed in the hope that it will be useful, | |
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
25 * GNU General Public License for more details. | |
26 * | |
27 * You should have received a copy of the GNU General Public License | |
28 * along with this program; if not, write to the Free Software | |
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
30 */ | |
31 | |
32 /* | |
33 Nihongo Henkan Library | |
34 */ | |
35 /* | |
36 entry functions | |
37 | |
38 jd_open jd_open_in jd_close | |
39 jd_begin jd_end | |
40 jd_next jd_reconv jd_tanconv | |
41 jd_udp jd_udchg jd_freqsv | |
42 jd_dicadd jd_dicdel jd_dicinfo | |
43 jd_wdel jd_wsch jd_wreg | |
44 jd_setevf jd_getevf | |
45 jd_dicstatus jd_whdel | |
46 jd_mkdir jd_access | |
47 jd_who jd_version | |
48 | |
49 extern Variables | |
50 int wnn_errorno; | |
51 */ | |
52 | |
53 #ifdef HAVE_CONFIG_H | |
54 # include <config.h> | |
55 #endif | |
56 | |
57 #include <stdio.h> | |
58 #include <ctype.h> | |
59 #if STDC_HEADERS | |
60 # include <stdlib.h> | |
61 # include <string.h> | |
62 #else | |
63 # if HAVE_MALLOC_H | |
64 # include <malloc.h> | |
65 # endif | |
66 # if HAVE_STRINGS_H | |
67 # include <strings.h> | |
68 # endif | |
69 #endif /* STDC_HEADERS */ | |
70 #if HAVE_FCNTL_H | |
71 # include <fcntl.h> | |
72 #endif | |
73 #include <pwd.h> | |
74 #if HAVE_UNISTD_H | |
75 # include <unistd.h> | |
76 #endif | |
77 #include <sys/types.h> | |
78 | |
79 #include "jllib.h" | |
80 #include "jlib.h" | |
81 #include "wnnerror.h" | |
82 #include "wnn_string.h" | |
83 #include "wnn_os.h" | |
84 | |
85 | |
86 /* These are used to convert w_char and char strings */ | |
87 static w_char wchartmp[256]; | |
88 static char chartmp[256]; | |
89 | |
90 static struct wnn_buf *buf; | |
91 | |
92 /* "jd_server_dead_env" は、使う必要が、ありません。 | |
93 互換性のためだけにあります。 | |
94 V4 では、サーバーが死んでも、ちゃんとエラーリターンします。 | |
95 */ | |
96 jmp_buf jd_server_dead_env; | |
97 int jd_server_dead_env_flg = 0; | |
98 | |
99 #define JD_WNN_DEAD \ | |
100 { \ | |
101 buf->env->js_id->js_dead_env_flg = 1; \ | |
102 if (setjmp(buf->env->js_id->js_dead_env) == 666) { \ | |
103 if (jlib_work_area) { \ | |
104 free(jlib_work_area); \ | |
105 jlib_work_area = NULL;} \ | |
106 jl_close(buf); \ | |
107 if (jd_server_dead_env_flg) \ | |
108 longjmp(jd_server_dead_env,666); \ | |
109 return -1; \ | |
110 } \ | |
111 } | |
112 | |
113 /* j Lib. */ | |
114 static char *jlib_work_area = NULL; | |
115 | |
116 /* bun joho */ | |
117 static struct bunjoho bun; /** 文情報 **/ | |
118 | |
119 static int current_bun_no = -1; /* 次候補を取っている文節 */ | |
120 static int current_ud = -1; /* カレント・ユーザ辞書 */ | |
121 | |
122 static struct wnn_ret_buf ret_buf = { 0, NULL }; | |
123 | |
124 /* get login name form /etc/passwd file */ | |
125 static char * | |
126 getlogname () | |
127 { | |
128 extern struct passwd *getpwuid (); | |
129 struct passwd *p; | |
130 | |
131 if ((p = getpwuid (getuid ())) == NULL) | |
132 return (NULL); | |
133 return (p->pw_name); | |
134 } | |
135 | |
136 /* | |
137 * Lib. Functions | |
138 */ | |
139 | |
140 /** jd_close **/ | |
141 int | |
142 jd_close (void) | |
143 { | |
144 if (jlib_work_area) | |
145 { | |
146 free (jlib_work_area); | |
147 jlib_work_area = NULL; | |
148 } | |
149 if (jl_dic_save_all (buf) < 0) | |
150 return (-1); | |
151 jl_close (buf); | |
152 return (0); | |
153 } | |
154 | |
155 int jd_begin (); | |
156 static int henkan_rcv (); | |
157 | |
158 /** jd_reconv **/ | |
159 int | |
160 jd_reconv (bunsetsu_no, kbuf, kb_siz) | |
161 int bunsetsu_no, kb_siz; | |
162 w_char *kbuf; | |
163 { | |
164 JD_WNN_DEAD if (bunsetsu_no == 0) | |
165 return jd_begin (kbuf, kb_siz); | |
166 if (jl_ren_conv (buf, &(bun.kana_buf)[((bun.klist)[bunsetsu_no]).s_ichi], bunsetsu_no, -1, WNN_USE_MAE) < 0) | |
167 return (-1); | |
168 return henkan_rcv (bunsetsu_no, kbuf, kb_siz); | |
169 } | |
170 | |
171 /** jd_begin **/ | |
172 int | |
173 jd_begin (kbuf, kb_siz) | |
174 w_char *kbuf; | |
175 int kb_siz; | |
176 { | |
177 JD_WNN_DEAD current_bun_no = -1; | |
178 jl_kill (buf, 0, -1); | |
179 if (jl_ren_conv (buf, bun.kana_buf, 0, -1, WNN_NO_USE) < 0) | |
180 return (-1); | |
181 | |
182 return (henkan_rcv (0, kbuf, kb_siz)); | |
183 } | |
184 | |
185 /** jd_tanconv **/ | |
186 int | |
187 jd_tanconv (bunsetsu_no, moji_no, kbuf, kb_siz) | |
188 int bunsetsu_no, moji_no, kb_siz; | |
189 w_char *kbuf; | |
190 { | |
191 JD_WNN_DEAD if (moji_no < 0) | |
192 return (-1); | |
193 if (jl_nobi_conv (buf, bunsetsu_no, moji_no, -1, WNN_USE_MAE, WNN_SHO) < 0) | |
194 return (-1); | |
195 return henkan_rcv (bunsetsu_no, kbuf, kb_siz); | |
196 } | |
197 | |
198 /** 変換結果を受信する **/ | |
199 static int | |
200 henkan_rcv (bunsetsu_no, kbuf, kb_siz) | |
201 int bunsetsu_no; /** 文節番号 **/ | |
202 w_char *kbuf; /** 漢字バッファー **/ | |
203 int kb_siz; /** 漢字バッファーサイズ **/ | |
204 { | |
205 | |
206 register w_char *b, *p; | |
207 register int i, bun_no; | |
208 register KOUHO_ENT *klp; | |
209 int kanji_len = 0; | |
210 int tmp; | |
211 | |
212 bun_no = jl_bun_suu (buf); | |
213 if (jl_kanji_len (buf, bunsetsu_no, -1) >= kb_siz) | |
214 return -1; | |
215 | |
216 if (bun_no >= bun.klist_size) | |
217 { | |
218 wnn_errorno = WNN_LONG_MOJIRETSU; | |
219 return -1; | |
220 } | |
221 for (i = bunsetsu_no, klp = &((bun.klist)[bunsetsu_no]), b = kbuf; i < bun_no; klp++, i++) | |
222 { | |
223 klp->s_ichi = jl_yomi_len (buf, 0, i); | |
224 klp->jl = jl_jiri_len (buf, i); | |
225 klp->fl = jl_fuzoku_len (buf, i); | |
226 klp->jishono = buf->bun[i]->dic_no; | |
227 klp->serial = buf->bun[i]->entry; | |
228 if (jl_kanji_len (buf, i, i + 1) + kanji_len >= kb_siz) | |
229 { | |
230 wnn_errorno = WNN_LONG_MOJIRETSU; | |
231 return (-1); | |
232 } | |
233 klp->k_data = b; | |
234 jl_get_kanji (buf, i, i + 1, b); | |
235 tmp = jl_jiri_kanji_len (buf, i); | |
236 b += tmp; | |
237 kanji_len += tmp + 1; | |
238 *b = 0; | |
239 b++; | |
240 klp->pl = 0; | |
241 for (p = klp->k_data; *p; p++) | |
242 { | |
243 klp->pl += (*p & 0x8000) ? 2 : 1; | |
244 } | |
245 klp->pl += (klp->fl * 2); | |
246 } | |
247 klp->s_ichi = -1; | |
248 return (bun_no - bunsetsu_no); | |
249 } | |
250 | |
251 static int up_date_jikouho (); | |
252 | |
253 /** jd_end **/ | |
254 | |
255 int | |
256 jd_end () | |
257 { | |
258 int ret; | |
259 | |
260 JD_WNN_DEAD if (current_bun_no != -1) | |
261 { | |
262 up_date_jikouho (); | |
263 current_bun_no = -1; | |
264 } | |
265 ret = jl_update_hindo (buf, 0, -1); | |
266 jl_kill (buf, 0, -1); | |
267 return (ret); | |
268 } | |
269 | |
270 | |
271 /** jd_next **/ | |
272 int | |
273 jd_next (bunsetsu_no, to_go) | |
274 int bunsetsu_no; | |
275 JIKOUHOJOHO *to_go; | |
276 { | |
277 register int no_of_kouho, i; | |
278 register w_char *b; | |
279 register JIKOUHO_ENT *jlp; | |
280 | |
281 JD_WNN_DEAD if (current_bun_no != -1 && current_bun_no != bunsetsu_no) | |
282 up_date_jikouho (); | |
283 current_bun_no = bunsetsu_no; | |
284 if (jl_zenkouho (buf, bunsetsu_no, WNN_USE_MAE, WNN_UNIQ) < 0) | |
285 return (-1); | |
286 no_of_kouho = jl_zenkouho_suu (buf); | |
287 | |
288 if (no_of_kouho >= to_go->jlist_size - 1) | |
289 { | |
290 wnn_errorno = WNN_JKTAREA_FULL; | |
291 return (-1); | |
292 } | |
293 for (i = 0, jlp = to_go->jlist, b = to_go->kanji_buf; i < no_of_kouho; jlp++, i++) | |
294 { | |
295 | |
296 jlp->jl = jl_jiri_len (buf, bunsetsu_no); | |
297 jlp->jishono = buf->bun[bunsetsu_no]->dic_no; | |
298 jlp->serial = buf->bun[bunsetsu_no]->entry; | |
299 jlp->k_data = b; | |
300 if (jl_kanji_len (buf, bunsetsu_no, bunsetsu_no + 1) >= to_go->kanji_buf_size) | |
301 { | |
302 wnn_errorno = WNN_JKTAREA_FULL; | |
303 return (-1); | |
304 } | |
305 jl_get_kanji (buf, bunsetsu_no, bunsetsu_no + 1, b); | |
306 b += jl_jiri_kanji_len (buf, bunsetsu_no); | |
307 *b = 0; | |
308 b++; | |
309 if (jl_next (buf) < 0) | |
310 return (-1); | |
311 } | |
312 jlp->jl = -1; | |
313 return no_of_kouho; | |
314 } | |
315 | |
316 static int | |
317 up_date_jikouho () | |
318 { | |
319 register int no_of_kouho, i; | |
320 int jishono, serial; | |
321 | |
322 jishono = (bun.klist)[current_bun_no].jishono; | |
323 serial = (bun.klist)[current_bun_no].serial; | |
324 | |
325 no_of_kouho = jl_zenkouho_suu (buf); | |
326 | |
327 for (i = 0; i < no_of_kouho; i++) | |
328 { | |
329 if (jishono == buf->bun[current_bun_no]->dic_no && serial == buf->bun[current_bun_no]->entry) | |
330 return (0); | |
331 if (jl_next (buf) < 0) | |
332 return (-1); | |
333 } | |
334 wnn_errorno = WNN_WORD_NO_EXIST; | |
335 return (-1); | |
336 } | |
337 | |
338 /* JD dictionary */ | |
339 | |
340 /** jd_dicadd **/ | |
341 int | |
342 jd_dicadd (fn, fn1, prio, hrdonly) | |
343 char *fn, *fn1; | |
344 int prio, hrdonly; | |
345 { | |
346 int rdonly; | |
347 WNN_DIC_INFO ret; | |
348 int dic_no; | |
349 | |
350 JD_WNN_DEAD if (fn1 == 0 || *fn1 == 0) | |
351 { /* UD */ | |
352 rdonly = hrdonly; | |
353 } | |
354 else if ((hrdonly == WNN_DIC_RDONLY) && | |
355 /* READ ONLY SD && hind file is none */ | |
356 (js_access (jl_env (buf), fn, 4) != -1) && (js_access (jl_env (buf), fn1, 4) == -1)) | |
357 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
0
diff
changeset
|
358 if ((dic_no = jl_dic_add (buf, fn, fn1, WNN_DIC_ADD_NOR, prio, WNN_DIC_RDONLY, WNN_DIC_RW, NULL, NULL, (void *)WNN_CREATE, NULL)) < 0) |
0 | 359 return (-1); |
360 if (jl_dic_delete (buf, dic_no) < 0) | |
361 return (-1); | |
362 rdonly = WNN_DIC_RDONLY; | |
363 } | |
364 else | |
365 { | |
366 rdonly = WNN_DIC_RDONLY; | |
367 } | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
0
diff
changeset
|
368 if ((dic_no = jl_dic_add (buf, fn, fn1, WNN_DIC_ADD_NOR, prio, rdonly, hrdonly, NULL, NULL, (void *)WNN_CREATE, NULL)) < 0) |
0 | 369 /* pw_d pw_h err mes */ |
370 return (-1); | |
371 if (js_dic_info (jl_env (buf), dic_no, &ret) < 0) | |
372 return (-1); | |
373 if ((ret.type == WNN_UD_DICT || ret.type == WNN_REV_DICT) && ret.rw == WNN_DIC_RW) | |
374 current_ud = dic_no; | |
375 return (dic_no); | |
376 } | |
377 | |
378 /** jd_dicdel **/ | |
379 int | |
380 jd_dicdel (dict_no) | |
381 int dict_no; | |
382 { | |
383 JD_WNN_DEAD return (jl_dic_delete (buf, dict_no)); | |
384 } | |
385 | |
386 | |
387 /** jd_udchg **/ | |
388 int | |
389 jd_udchg (dic_no) | |
390 int dic_no; | |
391 { | |
392 WNN_DIC_INFO ret; | |
393 | |
394 JD_WNN_DEAD if (js_dic_info (jl_env (buf), dic_no, &ret) < 0) | |
395 return (-1); | |
396 if (ret.type != WNN_UD_DICT && ret.type != WNN_REV_DICT) | |
397 { | |
398 wnn_errorno = WNN_NOT_A_UD; | |
399 return (-1); | |
400 } | |
401 else if (ret.rw != WNN_DIC_RW || ret.enablef != 1) | |
402 { | |
403 wnn_errorno = WNN_RDONLY; | |
404 return (-1); | |
405 } | |
406 current_ud = dic_no; | |
407 return (0); | |
408 } | |
409 | |
410 /** jd_udp **/ | |
411 int | |
412 jd_udp (dic_no) | |
413 int dic_no; | |
414 { | |
415 WNN_DIC_INFO ret; | |
416 int rdonly = 0; | |
417 | |
418 JD_WNN_DEAD if (js_dic_info (jl_env (buf), dic_no, &ret) < 0) | |
419 return (-1); | |
420 if (ret.rw == WNN_DIC_RDONLY || ret.enablef == 0) | |
421 rdonly |= 0x4; | |
422 if (ret.type == WNN_UD_DICT || (ret.type == WNN_REV_DICT && ret.rw == WNN_DIC_RW)) | |
423 { | |
424 rdonly = 1; | |
425 if (current_ud == dic_no) | |
426 rdonly |= 0x2; | |
427 } | |
428 | |
429 return (rdonly); | |
430 } | |
431 | |
432 /** jd_freqsv **/ | |
433 int | |
434 jd_freqsv () | |
435 { | |
436 JD_WNN_DEAD return (jl_dic_save_all (buf)); | |
437 } | |
438 | |
439 /* JD word */ | |
440 | |
441 /** jd_whdel **/ | |
442 int | |
443 jd_whdel (ser_no, yomi, bunpou) | |
444 int ser_no, bunpou; | |
445 w_char *yomi; | |
446 { | |
447 JD_WNN_DEAD return (jl_word_delete (buf, current_ud, ser_no)); | |
448 } | |
449 | |
450 | |
451 /** jd_wdel **/ | |
452 int | |
453 jd_wdel (ser_no, yomi) | |
454 int ser_no; | |
455 w_char *yomi; | |
456 { | |
457 JD_WNN_DEAD return (jl_word_delete (buf, current_ud, ser_no)); | |
458 } | |
459 | |
460 static int oldh_to_newh (); | |
461 | |
462 /** jd_wreg **/ | |
463 int | |
464 jd_wreg (kanji, yomi, bunpo) | |
465 w_char *kanji, *yomi; | |
466 int bunpo; | |
467 { | |
468 #ifdef NEW_HINSI | |
469 return (jl_word_add (buf, current_ud, yomi, kanji, NULL, bunpo, 0)); | |
470 #else | |
471 int i; | |
472 int ret = 0; | |
473 int hinsi_suu; | |
474 unsigned short *hinsi; | |
475 | |
476 JD_WNN_DEAD | |
477 /* hinsi No conversion */ | |
478 hinsi_suu = oldh_to_newh (bunpo, &hinsi); | |
479 for (i = 0; i < hinsi_suu; i++, hinsi++) | |
480 { | |
481 if (jl_word_add (buf, current_ud, yomi, kanji, NULL, *hinsi, 0)) | |
482 { | |
483 ret = -1; | |
484 } | |
485 } | |
486 return (ret); | |
487 #endif | |
488 } | |
489 | |
490 static int newh_to_oldh (); | |
491 | |
492 /** jd_wsch **/ | |
493 int | |
494 jd_wsch (yomi, jbuf, jbuf_siz, kbuf, kbuf_siz) | |
495 w_char *yomi, *kbuf; | |
496 JISHOJOHO *jbuf; | |
497 int jbuf_siz, kbuf_siz; | |
498 { | |
499 register int i, klen; | |
500 register w_char *b; | |
501 | |
502 struct wnn_jdata *jdp; | |
503 int len; | |
504 int cnt; | |
505 | |
506 JD_WNN_DEAD if ((cnt = jl_word_search_by_env (buf, yomi, &jdp)) < 0) | |
507 return (-1); | |
508 | |
509 if (cnt >= jbuf_siz - 1) | |
510 { | |
511 wnn_errorno = WNN_JISHOTABLE_FULL; | |
512 return (-1); | |
513 } | |
514 for (klen = 0, i = cnt, b = kbuf; i > 0; jbuf++, jdp++, i--) | |
515 { | |
516 jbuf->hindo = jdp->hindo; | |
517 #ifdef NEW_HINSI | |
518 jbuf->bumpo = jdp->hinshi; | |
519 #else /* hinsi No conversion */ | |
520 jbuf->bumpo = newh_to_oldh (jdp->hinshi); | |
521 #endif | |
522 jbuf->jisho = jdp->dic_no; | |
523 jbuf->serial = jdp->serial; | |
524 jbuf->k_data = b; | |
525 len = wnn_Strlen (jdp->kanji) + 1; | |
526 klen += len; | |
527 if (klen >= kbuf_siz) | |
528 { | |
529 wnn_errorno = WNN_JISHOTABLE_FULL; | |
530 return (-1); | |
531 } | |
532 wnn_Strcpy (b, jdp->kanji); | |
533 b += len; | |
534 } | |
535 jbuf->hindo = -1; | |
536 return cnt; | |
537 } | |
538 | |
539 | |
540 /* Parameter set/get */ | |
541 /** jd_setenvf **/ | |
542 int | |
543 jd_setevf (bunsetsu_su, par1, par2, par3, par4, par5) | |
544 int bunsetsu_su, par1, par2, par3, par4, par5; | |
545 { | |
546 struct wnn_param para; | |
547 int ret; | |
548 | |
549 JD_WNN_DEAD ret = jl_param_get (buf, ¶); | |
550 if (ret < 0) | |
551 return (ret); | |
552 para.n = bunsetsu_su; | |
553 para.p1 = par1; | |
554 para.p2 = par2; | |
555 para.p3 = par3; | |
556 para.p4 = par4; | |
557 para.p5 = par5; | |
558 return (jl_param_set (buf, ¶)); | |
559 } | |
560 | |
561 | |
562 /** jd_getenvf **/ | |
563 int | |
564 jd_getevf (bunsetsu_su, par1, par2, par3, par4, par5) | |
565 int *bunsetsu_su, *par1, *par2, *par3, *par4, *par5; | |
566 { | |
567 struct wnn_param para; | |
568 int ret; | |
569 | |
570 JD_WNN_DEAD ret = jl_param_get (buf, ¶); | |
571 *bunsetsu_su = para.n; | |
572 *par1 = para.p1; /* 幹語の頻度 */ | |
573 *par2 = para.p2; /* 小文節長 */ | |
574 *par3 = para.p3; /* 自立語長 */ | |
575 *par4 = para.p4; /* 今使ったよビット */ | |
576 *par5 = para.p5; /* 辞書 */ | |
577 if (ret < 0); | |
578 return (ret); | |
579 } | |
580 | |
581 | |
582 /** jd_dicinfo **/ | |
583 int | |
584 jd_dicinfo (jbuf, jbuf_siz, fbuf, fbuf_siz) | |
585 DICINFO *jbuf; | |
586 int jbuf_siz; | |
587 char *fbuf; | |
588 int fbuf_siz; | |
589 { | |
590 register int i, klen; | |
591 register char *b; | |
592 | |
593 WNN_DIC_INFO *dic; | |
594 int cnt, len; | |
595 | |
596 JD_WNN_DEAD if ((cnt = js_dic_list (jl_env (buf), &ret_buf)) < 0) | |
597 return (-1); | |
598 | |
599 if (cnt >= jbuf_siz - 1) | |
600 { | |
601 wnn_errorno = WNN_JISHOTABLE_FULL; | |
602 return (-1); | |
603 } | |
604 dic = (WNN_DIC_INFO *) ret_buf.buf; | |
605 for (klen = i = 0, b = fbuf; i < cnt; jbuf++, dic++, i++) | |
606 { | |
607 jbuf->dic_no = dic->dic_no; | |
608 jbuf->ttl_hindo = 0; /* ??? */ | |
609 /* | |
610 jbuf->dic_type = dic->type; | |
611 */ | |
612 if (dic->type == WNN_STATIC_DICT || (dic->type == WNN_REV_DICT && dic->rw == WNN_DIC_RDONLY)) | |
613 jbuf->dic_type = SYSTEM_DIC; | |
614 else if (dic->type == WNN_UD_DICT || (dic->type == WNN_REV_DICT && dic->rw == WNN_DIC_RW)) | |
615 jbuf->dic_type = USER_DIC; | |
616 jbuf->udp = jbuf->dic_no == current_ud ? 1 : 0; | |
617 jbuf->dic_size = dic->gosuu; | |
618 jbuf->prio = dic->nice; | |
619 jbuf->rdonly = dic->rw | !dic->enablef; | |
620 jbuf->file_name = b; | |
621 len = strlen (dic->fname) + 1; | |
622 klen += len; | |
623 if (klen >= fbuf_siz) | |
624 { | |
625 wnn_errorno = WNN_JISHOTABLE_FULL; | |
626 return (-1); | |
627 } | |
628 strcpy (b, dic->fname); | |
629 b += len; | |
630 jbuf->h_file_name = b; | |
631 len = strlen (dic->hfname) + 1; | |
632 klen += len; | |
633 if (klen >= fbuf_siz) | |
634 { | |
635 wnn_errorno = WNN_JISHOTABLE_FULL; | |
636 return (-1); | |
637 } | |
638 strcpy (b, dic->hfname); | |
639 b += len; | |
640 } | |
641 jbuf->dic_no = -1; | |
642 return i; | |
643 } | |
644 | |
645 | |
646 /** jd_open_in **/ | |
647 struct bunjoho * | |
648 jd_open_in (kana_len, klist_len, kanji_len, server, user, host) | |
649 int kana_len, klist_len, kanji_len; | |
650 char *server, *user, *host; | |
651 { | |
652 register int kasz, klsz, kjsz; | |
653 int cnt, i; | |
654 WNN_FILE_INFO_STRUCT *files; | |
655 | |
656 if (jlib_work_area != NULL) | |
657 free (jlib_work_area); | |
658 jlib_work_area = NULL; | |
659 | |
660 if (user == NULL || *user == '\0') | |
661 { /* ENV name */ | |
662 user = getlogname (); | |
663 } | |
664 | |
665 if ((buf = jl_open (user, server, NULL, WNN_NO_CREATE, NULL, 0)) == NULL) | |
666 return (NULL); | |
667 else if (buf->env == NULL) | |
668 return (NULL); | |
669 kasz = (sizeof (w_char) * (kana_len + 1) + 7) & 0xfffffff8; | |
670 klsz = (sizeof (KOUHO_ENT) * (klist_len + 1) + 7) & 0xfffffff8; | |
671 kjsz = (sizeof (w_char) * kanji_len + 7) & 0xfffffff8; | |
672 if (!(jlib_work_area = malloc (kasz + klsz + kjsz))) | |
673 { | |
674 wnn_errorno = WNN_MALLOC_INITIALIZE; | |
675 return 0; | |
676 } | |
677 bun.klist = (KOUHO_ENT *) jlib_work_area; | |
678 bun.klist_size = klist_len; | |
679 bun.kana_buf = (w_char *) (jlib_work_area + klsz); | |
680 bun.kana_size = kana_len; | |
681 bun.kanji_buf = (w_char *) (jlib_work_area + klsz + kasz); | |
682 bun.kanji_buf_size = kanji_len; | |
683 | |
684 /* Don't override fuzokugo file if already exists */ | |
685 if (js_fuzokugo_get (jl_env (buf)) >= 0) | |
686 { | |
687 return &bun; | |
688 } | |
689 | |
690 if ((cnt = js_file_list_all (buf->env->js_id, &ret_buf)) <= 0) | |
691 return (NULL); | |
692 for (i = 0, files = (WNN_FILE_INFO_STRUCT *) ret_buf.buf; i < cnt; i++) | |
693 { | |
694 if (files->type == WNN_FT_FUZOKUGO_FILE) | |
695 break; | |
696 files++; | |
697 } | |
698 if (i == cnt) | |
699 return (NULL); | |
700 if (jl_fuzokugo_set (buf, files->name) == -1) | |
701 { | |
702 return (NULL); | |
703 } | |
704 return &bun; | |
705 } | |
706 | |
707 /** jd_open **/ | |
708 struct bunjoho * | |
709 jd_open (kana_len, klist_len, kanji_len) | |
710 int kana_len, klist_len, kanji_len; | |
711 { | |
712 return (struct bunjoho *) jd_open_in (kana_len, klist_len, kanji_len, NULL, getlogname (), NULL); | |
713 } | |
714 | |
715 | |
716 /** jd_dicstatus **/ | |
717 int | |
718 jd_dicstatus (fn) | |
719 char *fn; | |
720 { | |
721 WNN_FILE_STAT s; | |
722 | |
723 JD_WNN_DEAD if (js_file_stat (jl_env (buf), fn, &s) < 0) | |
724 return (-1); | |
725 if (s.type == WNN_STATIC_DICT) | |
726 return (SYSTEM_DIC); | |
727 else if (s.type == WNN_UD_DICT || s.type == WNN_REV_DICT) | |
728 return (USER_DIC); | |
729 else if (s.type == WNN_FILE_NOT_EXIST) | |
730 return (NO_EXIST); | |
731 else | |
732 return (NOT_A_JISHO); | |
733 } | |
734 | |
735 /** jd_mkdir **/ | |
736 int | |
737 jd_mkdir (dn) | |
738 char *dn; | |
739 { | |
740 JD_WNN_DEAD return (js_mkdir (jl_env (buf), dn)); | |
741 } | |
742 | |
743 /** jd_access **/ | |
744 int | |
745 jd_access (dn, amode) | |
746 char *dn; | |
747 int amode; | |
748 { | |
749 JD_WNN_DEAD return (js_access (jl_env (buf), dn, amode)); | |
750 } | |
751 | |
752 /** jd_who **/ | |
753 int | |
754 jd_who (u, str) | |
755 JWHO u[]; | |
756 char *str; | |
757 { | |
758 register int i; | |
759 register int cnt; | |
760 WNN_JWHO *jwho; | |
761 | |
762 JD_WNN_DEAD if ((cnt = js_who (jl_env (buf)->js_id, &ret_buf)) < 0) | |
763 return (-1); | |
764 jwho = (WNN_JWHO *) ret_buf.buf; | |
765 for (i = 0; i < cnt; i++, jwho++) | |
766 { | |
767 u[i].sd = jwho[0].sd; | |
768 u[i].user_name = str; | |
769 strcpy (str, jwho->user_name); | |
770 str += strlen (u[i].user_name) + 1; | |
771 u[i].host_name = str; | |
772 strcpy (str, jwho->host_name); | |
773 str += strlen (u[i].host_name) + 1; | |
774 } | |
775 u[i].sd = -1; | |
776 return (0); | |
777 } | |
778 | |
779 /** jd_version **/ | |
780 int | |
781 jd_version (serv, libv) | |
782 int *serv, *libv; | |
783 { | |
784 JD_WNN_DEAD return (js_version (jl_env (buf)->js_id, serv, libv)); | |
785 } | |
786 | |
787 #ifndef NEW_HINSI | |
788 #define KOMEI 0x20000000 | |
789 #define MEISI 0x00040000 | |
790 #define JOSUU 0x04000000 | |
791 #define SETTO 0x01000000 | |
792 #define SETUBI 0x02000000 | |
793 #define KEIYOU 0x00010000 | |
794 #define KEIDOU 0x00020000 | |
795 #define OLD_HINSI_SZ 32 | |
796 | |
797 static char *new_name[] = { | |
798 "カ行五段", "カ行(行く)", "ガ行五段", "サ行五段", | |
799 "タ行五段", "ナ行五段", "バ行五段", "マ行五段", | |
800 "ラ行五段", "ワ行五段", "一段&名詞", "一段", | |
801 "サ行(する)&名詞", "サ行(する)", "ザ行(ずる)", "来(こ)", | |
802 "形容詞", "形容動詞", "名詞", "連体詞", | |
803 "副詞", "接続詞,感動詞", "来(き)", "来(く)", | |
804 "接頭語", "接尾語", "助数詞", "数詞", | |
805 "ラ行(下さい)", "固有名詞", "形容動詞(たる)", "単漢字" | |
806 }; | |
807 /* | |
808 :為(し):為(す):為(せ) | |
809 */ | |
810 | |
811 | |
812 #define KOMEI_SZ 3 /* "固有名詞" */ | |
813 static char *komei_name[] = { "人名", "地名", "人名&地名" }; | |
814 | |
815 #define MEISI_SZ 1 /* "名詞" */ | |
816 static char *meisi_name[] = { "形容動詞&名詞" }; | |
817 | |
818 #define JOSUU_SZ 2 /* "助数詞" */ | |
819 static char *josuu_name[] = { "接頭助数詞", "接尾助数詞" }; | |
820 | |
821 #define SETTO_SZ 7 /* "接頭語" */ | |
822 static char *setto_name[] = { "接頭語お", "接頭数詞", "接頭地名", | |
823 "形容詞化接尾動詞", "接尾動詞", "サ行(する)&名詞化接尾語", | |
824 "形容動詞化接尾語" | |
825 }; | |
826 | |
827 #define SETUBI_SZ 4 /* "接尾語" */ | |
828 static char *setubi_name[] = { | |
829 "接尾人名", "接尾地名", "接尾社名", "接尾サ行(する)サ変名名詞" | |
830 }; | |
831 | |
832 #define DOUSI_SZ 15 | |
833 static char *dousi_name[] = { | |
834 "カ動幹", "", "ガ動幹", "サ動幹", | |
835 "タ動幹", "ナ動幹", "バ動幹", "マ動幹", | |
836 "ラ動幹", "ワ動幹", "", "一動幹", | |
837 "", "サ変動幹", "ザ変動幹" | |
838 }; | |
839 | |
840 static char *dou_renyou_name[] = { | |
841 "カ動連用幹", "", "ガ動連用幹", "サ動連用幹", | |
842 "タ動連用幹", "ナ動連用幹", "バ動連用幹", "マ動連用幹", | |
843 "ラ動連用幹", "ワ動連用幹", "", "一動連用幹", | |
844 "", "サ変動連用幹", "ザ変動連用幹" | |
845 }; | |
846 | |
847 static int | |
848 oldh_to_newh (hinsi, new) | |
849 int hinsi; | |
850 unsigned short **new; | |
851 { | |
852 register int i, j; | |
853 static unsigned short tmp[OLD_HINSI_SZ + 1]; | |
854 register int tmptmp; /* H.T. to compile PCC */ | |
855 | |
856 for (i = j = 0; hinsi != 0 && i < OLD_HINSI_SZ; i++) | |
857 { | |
858 if ((hinsi & 0x01) != 0) | |
859 { | |
860 /* if((tmptmp = wnn_find_hinsi_by_name(new_name[i])) != -1){ */ | |
861 wnn_Sstrcpy (wchartmp, new_name[i]); | |
862 if ((tmptmp = jl_hinsi_number (buf, wchartmp)) != -1) | |
863 { | |
864 tmp[j] = tmptmp; | |
865 j++; | |
866 } | |
867 else | |
868 { | |
869 tmp[j] = tmptmp; | |
870 } | |
871 | |
872 /* H.T. unsigned short comparison with -1 | |
873 if ((tmp[j] = wnn_find_hinsi_by_name(new_name[i])) != -1) | |
874 j++; | |
875 */ | |
876 } | |
877 hinsi >>= 1; | |
878 } | |
879 | |
880 tmp[j] = -1; | |
881 *new = tmp; | |
882 return (j); | |
883 } | |
884 | |
885 static int | |
886 newh_to_oldh (hinsi) | |
887 unsigned short hinsi; | |
888 { | |
889 register char *new_n; | |
890 register w_char *wnew_n; | |
891 register int i; | |
892 | |
893 /* if ((new_n = wnn_get_hinsi_name(hinsi)) == 0) */ | |
894 if ((wnew_n = jl_hinsi_name (buf, hinsi)) == 0) | |
895 return (-1); | |
896 wnn_sStrcpy (chartmp, wnew_n); | |
897 new_n = chartmp; | |
898 for (i = 0; i < OLD_HINSI_SZ; i++) | |
899 { | |
900 if (strcmp (new_n, new_name[i]) == 0) | |
901 return (0x1 << i); | |
902 } | |
903 | |
904 for (i = 0; i < DOUSI_SZ; i++) | |
905 { | |
906 if (strcmp (new_n, dousi_name[i]) == 0) | |
907 return (0x1 << i); | |
908 } | |
909 for (i = 0; i < DOUSI_SZ; i++) | |
910 { | |
911 if (strcmp (new_n, dou_renyou_name[i]) == 0) | |
912 { | |
913 /* return(wnn_find_hinsi_by_name(new_name[i])); */ | |
914 wnn_Sstrcpy (wchartmp, new_name[i]); | |
915 return (jl_hinsi_number (buf, wchartmp)); | |
916 } | |
917 } | |
918 | |
919 for (i = 0; i < KOMEI_SZ; i++) | |
920 { | |
921 if (strcmp (new_n, komei_name[i]) == 0) | |
922 return (KOMEI); | |
923 } | |
924 for (i = 0; i < MEISI_SZ; i++) | |
925 { | |
926 if (strcmp (new_n, meisi_name[i]) == 0) | |
927 return (MEISI); | |
928 } | |
929 for (i = 0; i < JOSUU_SZ; i++) | |
930 { | |
931 if (strcmp (new_n, josuu_name[i]) == 0) | |
932 return (JOSUU); | |
933 } | |
934 for (i = 0; i < SETTO_SZ; i++) | |
935 { | |
936 if (strcmp (new_n, setto_name[i]) == 0) | |
937 return (SETTO); | |
938 } | |
939 for (i = 0; i < SETUBI_SZ; i++) | |
940 { | |
941 if (strcmp (new_n, setubi_name[i]) == 0) | |
942 return (SETUBI); | |
943 } | |
944 return (0); | |
945 } | |
946 #endif /* ! NEWHINSI */ |