Mercurial > freewnn
annotate Wnn/jserver/renbn_kai.c @ 29:35bc1f2e3f14 default tip
minor fix
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sat, 06 Mar 2010 23:55:24 +0900 |
parents | 466fe6732d8d |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * FreeWnn is a network-extensible Kana-to-Kanji conversion system. | |
3 * This file is part of FreeWnn. | |
4 * | |
5 * Copyright Kyoto University Research Institute for Mathematical Sciences | |
6 * 1987, 1988, 1989, 1990, 1991, 1992 | |
7 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 | |
8 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 | |
9 * Copyright FreeWnn Project 1999, 2000, 2002 | |
10 * | |
11 * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> | |
12 * | |
13 * This program is free software; you can redistribute it and/or modify | |
14 * it under the terms of the GNU General Public License as published by | |
15 * the Free Software Foundation; either version 2 of the License, or | |
16 * (at your option) any later version. | |
17 * | |
18 * This program is distributed in the hope that it will be useful, | |
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 * GNU General Public License for more details. | |
22 * | |
23 * You should have received a copy of the GNU General Public License | |
24 * along with this program; if not, write to the Free Software | |
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
26 */ | |
27 | |
28 #ifdef HAVE_CONFIG_H | |
29 # include <config.h> | |
30 #endif | |
31 | |
32 /* #include <stdio.h> */ /* for debug only */ | |
33 #include "commonhd.h" | |
34 #include "de_header.h" | |
35 #include "fzk.h" | |
36 #include "kaiseki.h" | |
37 | |
38 static struct DSD_DBN *dcdbn_set (struct DSD_DBN *, struct DSD_SBN **, struct BZD *); | |
39 static struct DSD_SBN *dcdsbn_set (struct DSD_SBN *, struct SYO_BNSETSU *); | |
40 static int cnt_syo (struct SYO_BNSETSU *); | |
41 static void cnt_bzd (struct BZD *, int *, int *); | |
42 static int chk_yomi_endvect (int, int, int, int); | |
43 static int set_kata_giji_sbn (int, int, int, int, struct SYO_BNSETSU **); | |
44 static int set_kata_giji_bzd (int, int, int, int, struct BZD **, int); | |
45 | |
46 int | |
47 renbn_kai (int yomi_sno, /* 解析文字列 start index */ | |
48 int yomi_eno, /* 解析文字列 end index (end char の次) */ | |
49 int beginvect, /* 前端ベクタ(-1:文節先頭、-2:なんでも)品詞No. */ | |
50 #ifndef NO_FZK | |
51 w_char *fzkchar, | |
52 #endif /* NO_FZK */ | |
53 int endvect, /* 終端ベクタ */ | |
54 int endvect1, /* 終端ベクタ (予備) */ | |
55 int endvect2, /* bunsetsu 終端ベクタ */ | |
56 int kaidbno, /* 解析大文節数 */ | |
57 int kaisbno, /* 解析小文節数 */ | |
58 struct DSD_DBN **dsd_dbn) /* 決定大文節情報エリア pointer */ | |
59 { | |
60 int dbn_cnt; | |
61 int sbn_cnt; | |
62 struct DSD_SBN *dsd_sbn; /* 決定大文節情報エリア pointer */ | |
63 | |
64 UINT dicidyno, /* 決定した大文節の index */ | |
65 buncnt = 0; /* 決定した大文節数 */ | |
66 struct BZD *rbzdptr; /* 決定の対象となるノード top pointer */ | |
67 struct BZD *brbzdptr, /* work pointer */ | |
3 | 68 *dicide_bp = NULL, /* 決定した大文節の top pointer */ |
69 *dicide_np = NULL, /* 決定した大文節への pointer */ | |
0 | 70 *wkbzdptr, /* work pointer */ |
71 *maxbzd; /* 決定の対象となっている大文節の */ | |
72 /* 最大の評価値を持つノードへの pointer */ | |
73 int rtmknode; | |
74 extern int _status; | |
75 | |
76 dicidyno = yomi_sno - 1; | |
3 | 77 rbzdptr = NULL; |
0 | 78 rtmknode = 1; |
79 | |
80 _status = 0; | |
81 | |
82 if (c_env->fzk_fid == -1) | |
83 { | |
84 wnn_errorno = WNN_FZK_FILE_NO_LOAD; | |
85 return (-1); | |
86 } | |
87 ft = (struct FT *) files[c_env->fzk_fid].area; | |
88 if (chk_yomi_endvect (yomi_sno, yomi_eno, endvect, endvect1) < 0) | |
89 return (-1); | |
90 while (dicidyno + 1 < yomi_eno) | |
91 { | |
3 | 92 if (rbzdptr == NULL) |
0 | 93 { |
94 if (dbn_kai (dicidyno + 1, yomi_eno, beginvect, | |
95 #ifndef NO_FZK | |
96 fzkchar, | |
97 #endif /* NO_FZK */ | |
98 endvect, endvect1, kaisbno, &rbzdptr) < 0) | |
99 { | |
100 log_err ("CONVERSION ERROR."); | |
101 init_work_areas (); | |
102 return (-1); /* ERROR */ | |
103 } | |
3 | 104 if (rbzdptr == NULL) |
0 | 105 { |
106 if (set_kata_giji_bzd (dicidyno + 1, yomi_eno, endvect, endvect1, &rbzdptr, buncnt) < 0) | |
107 return (-1); | |
108 buncnt++; | |
109 rtmknode = 0; | |
3 | 110 if (dicide_bp == NULL) |
0 | 111 dicide_bp = rbzdptr; |
3 | 112 else if (dicide_np != NULL) |
113 dicide_np->lnk_son = rbzdptr; | |
0 | 114 break; |
115 } | |
116 } | |
117 /* 1 文節決定可能になるまでノードを作る */ | |
118 if (kaidbno == 1) | |
119 { | |
120 /* 各文節の評価値の足し算(son_v)は、mknode でやるんだけど kaidbno が 1 | |
121 つまり 1文節解析の場合は、そこを通らないからここでやろう */ | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
122 for (brbzdptr = rbzdptr->lnk_br; brbzdptr != NULL; brbzdptr = brbzdptr->lnk_br) |
0 | 123 brbzdptr->son_v = brbzdptr->v_jc; |
124 } | |
125 else | |
126 { | |
127 while ((int) (rbzdptr->kbcnt) < kaidbno && rtmknode > 0) | |
128 { | |
129 for (brbzdptr = rbzdptr; brbzdptr != 0; brbzdptr = brbzdptr->lnk_br) | |
130 { | |
131 rtmknode = mknode (brbzdptr, yomi_eno, beginvect, | |
132 #ifndef NO_FZK | |
133 fzkchar, | |
134 #endif /* NO_FZK */ | |
135 endvect2, kaisbno); | |
136 brbzdptr->son_v /= brbzdptr->kbcnt; | |
137 if (rtmknode == 0) | |
138 { | |
139 brbzdptr->son_v += brbzdptr->v_jc; | |
140 } | |
141 else if (rtmknode == -1) | |
142 { | |
143 log_err ("CONVERSION ERROR."); | |
144 init_work_areas (); /* エラーでいいのかな */ | |
145 return (-1); /* ERROR */ | |
146 } | |
147 } | |
148 } | |
149 } | |
150 | |
151 /* 最大の評価を持つノードを見つける */ | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
152 for (brbzdptr = rbzdptr->lnk_br, maxbzd = rbzdptr; brbzdptr != NULL; brbzdptr = wkbzdptr) |
0 | 153 { |
154 wkbzdptr = brbzdptr->lnk_br; | |
155 if (maxbzd->son_v <= brbzdptr->son_v) | |
156 { | |
157 clr_node (maxbzd); /* garbage collection */ | |
158 maxbzd = brbzdptr; | |
159 } | |
160 else | |
161 clr_node (brbzdptr); | |
162 } | |
163 | |
164 /* 1 文節決定 */ | |
165 buncnt++; /* 決定文節 count up */ | |
166 dicidyno = maxbzd->j_c; /* 決定した文節の top */ | |
167 /* kettei sita node no link */ | |
168 if (maxbzd->bend_m == yomi_sno) | |
169 { | |
170 dicide_bp = dicide_np = maxbzd; | |
171 } | |
172 else | |
173 { | |
174 dicide_np->lnk_son = maxbzd; | |
175 dicide_np = maxbzd; | |
176 } | |
177 rbzdptr = maxbzd->lnk_son; | |
178 } | |
179 | |
180 cnt_bzd (dicide_bp, &dbn_cnt, &sbn_cnt); | |
3 | 181 if ((*dsd_dbn = get_dsd_dbn (dbn_cnt)) == NULL) |
0 | 182 { |
183 init_work_areas (); | |
184 return (-1); | |
185 } | |
3 | 186 if ((dsd_sbn = get_dsd_sbn (sbn_cnt)) == NULL) |
0 | 187 { |
188 init_work_areas (); | |
189 return (-1); | |
190 } | |
191 | |
192 dcdbn_set (*dsd_dbn, &dsd_sbn, dicide_bp); | |
193 return (buncnt); | |
194 } | |
195 | |
196 /************************************************************/ | |
197 /* 単文節解析(大文節) routine */ | |
198 /************************************************************/ | |
199 int | |
200 tan_dai (int yomi_sno, /* 解析文字列 start index */ | |
201 int yomi_eno, /* 解析文字列 end index (end char の次) */ | |
202 int beginvect, /* 前端ベクタ(-1:文節先頭、-2:なんでも)品詞No. */ | |
203 #ifndef NO_FZK | |
204 w_char *fzkchar, | |
205 #endif /* NO_FZK */ | |
206 int endvect, /* 終端ベクタ */ | |
207 int endvect1, /* 終端ベクタ */ | |
208 int kaisbno, /* 解析小文節数 */ | |
209 struct DSD_DBN **dsd_dbn) /* 決定大文節情報エリア pointer */ | |
210 { | |
211 int dbn_cnt; | |
212 int sbn_cnt; | |
213 struct DSD_SBN *dsd_sbn; /* 決定大文節情報エリア pointer */ | |
214 struct BZD *rbzdptr; /* 決定の対象となるノードの | |
215 トップポインタ */ | |
216 struct BZD *brbzdptr, *wkbzdptr; | |
217 struct BZD *maxbzd; /* 決定の対象となっている文節の | |
218 最大の評価値を持つノードへのポインタ */ | |
219 extern int _status; | |
220 | |
221 if (c_env->fzk_fid == -1) | |
222 { | |
223 wnn_errorno = WNN_FZK_FILE_NO_LOAD; | |
224 return (-1); | |
225 } | |
226 ft = (struct FT *) files[c_env->fzk_fid].area; | |
227 | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
228 rbzdptr = NULL; |
0 | 229 _status = 0; |
230 if (chk_yomi_endvect (yomi_sno, yomi_eno, endvect, endvect1) < 0) | |
231 return (-1); | |
232 if (dbn_kai (yomi_sno, yomi_eno, beginvect, | |
233 #ifndef NO_FZK | |
234 fzkchar, | |
235 #endif /* NO_FZK */ | |
236 endvect, endvect1, kaisbno, &rbzdptr) < 0) | |
237 { | |
238 init_work_areas (); | |
239 return (-1); /* ERROR */ | |
240 } | |
241 | |
242 /* 最大の評価値を持つノードを見つける */ | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
243 for (brbzdptr = rbzdptr, maxbzd = NULL; brbzdptr != NULL; brbzdptr = wkbzdptr) |
0 | 244 { |
245 wkbzdptr = brbzdptr->lnk_br; | |
246 if (brbzdptr->j_c == yomi_eno - 1) | |
247 { /* 文節長さ */ | |
3 | 248 if (maxbzd == NULL) |
0 | 249 { |
250 maxbzd = brbzdptr; | |
251 } | |
252 else if (maxbzd->v_jc < brbzdptr->v_jc) | |
253 { | |
254 freebzd (maxbzd); | |
255 maxbzd = brbzdptr; | |
256 } | |
257 else | |
258 { | |
259 freebzd (brbzdptr); | |
260 } | |
261 } | |
262 else | |
263 { | |
264 clr_node (brbzdptr); | |
265 } | |
266 } | |
267 | |
3 | 268 if (maxbzd == NULL) |
0 | 269 { |
270 if (set_kata_giji_bzd (yomi_sno, yomi_eno, endvect, endvect1, &maxbzd, 0) < 0) | |
271 return (-1); | |
272 } | |
273 cnt_bzd (maxbzd, &dbn_cnt, &sbn_cnt); | |
3 | 274 if ((*dsd_dbn = get_dsd_dbn (dbn_cnt)) == NULL) |
0 | 275 { |
276 init_work_areas (); | |
277 return (-1); | |
278 } | |
3 | 279 if ((dsd_sbn = get_dsd_sbn (sbn_cnt)) == NULL) |
0 | 280 { |
281 init_work_areas (); | |
282 return (-1); | |
283 } | |
284 | |
285 dcdbn_set (*dsd_dbn, &dsd_sbn, maxbzd); | |
286 return (1); | |
287 } | |
288 | |
289 /************************************************************/ | |
290 /* 単文節解析(小文節) routine */ | |
291 /************************************************************/ | |
292 int | |
293 tan_syo (int yomi_sno, /* 解析文字列 start index */ | |
294 int yomi_eno, /* 解析文字列 end index (end char の次) */ | |
295 int beginvect, /* 前端ベクタ(-1:文節先頭、-2:なんでも)品詞No. */ | |
296 #ifndef NO_FZK | |
297 w_char *fzkchar, | |
298 #endif /* NO_FZK */ | |
299 int endvect, /* 終端ベクタ */ | |
300 int endvect1, /* 終端ベクタ */ | |
301 struct DSD_SBN **dsd_sbn) /* 決定小文節情報エリア pointer */ | |
302 { | |
303 int sbn_cnt; | |
304 struct SYO_BNSETSU *rsbnptr; /* 決定の対象となるノードのトップポインタ */ | |
305 struct SYO_BNSETSU *brsbnptr, *wksbnptr; | |
306 struct SYO_BNSETSU *maxsbn; /* 決定の対象となっている文節の | |
307 最大の評価値を持つノードへのポインタ */ | |
308 int divid; | |
309 extern int _status; | |
310 | |
311 if (c_env->fzk_fid == -1) | |
312 { | |
313 wnn_errorno = WNN_FZK_FILE_NO_LOAD; | |
314 return (-1); | |
315 } | |
316 ft = (struct FT *) files[c_env->fzk_fid].area; | |
317 | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
318 rsbnptr = NULL; |
0 | 319 _status = 0; |
320 if (chk_yomi_endvect (yomi_sno, yomi_eno, endvect, endvect1) < 0) | |
321 return (-1); | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
322 if (sbn_kai (yomi_sno, yomi_eno, endvect, endvect1, &rsbnptr, 1, NULL) < 0) |
0 | 323 { |
324 init_work_areas (); | |
325 return (-1); /* ERROR */ | |
326 } | |
327 | |
328 /* 最大の評価値を持つノードを見つける */ | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
329 for (brsbnptr = rsbnptr, maxsbn = NULL; brsbnptr != NULL; brsbnptr = wksbnptr) |
0 | 330 { |
331 wksbnptr = brsbnptr->lnk_br; | |
332 if (brsbnptr->j_c == yomi_eno - 1) | |
333 { /* 文節長さ */ | |
3 | 334 if (maxsbn == NULL) |
0 | 335 { |
336 maxsbn = brsbnptr; | |
337 divid = get_status (brsbnptr->kangovect, beginvect, | |
338 #ifndef NO_FZK | |
339 fzkchar, | |
340 #endif /* NO_FZK */ | |
341 &(brsbnptr->status)); | |
342 brsbnptr->v_jc = DIVID_HYOUKA (brsbnptr->v_jc, divid); | |
343 } | |
344 else | |
345 { | |
346 divid = get_status (brsbnptr->kangovect, beginvect, | |
347 #ifndef NO_FZK | |
348 fzkchar, | |
349 #endif /* NO_FZK */ | |
350 &(brsbnptr->status)); | |
351 brsbnptr->v_jc = DIVID_HYOUKA (brsbnptr->v_jc, divid); | |
352 if (beginvect != WNN_ALL_HINSI && ((brsbnptr->status == WNN_SENTOU && maxsbn->status != WNN_SENTOU) || (brsbnptr->status == WNN_CONNECT && maxsbn->status != WNN_CONNECT))) | |
353 { | |
354 freesbn (maxsbn); | |
355 maxsbn = brsbnptr; | |
356 } | |
357 else if (maxsbn->v_jc < brsbnptr->v_jc) | |
358 { | |
359 freesbn (maxsbn); | |
360 maxsbn = brsbnptr; | |
361 } | |
362 else | |
363 { | |
364 freesbn (brsbnptr); | |
365 } | |
366 } | |
367 } | |
368 else | |
369 { | |
370 freesbn (brsbnptr); | |
371 } | |
372 } | |
373 | |
3 | 374 if (maxsbn == NULL) |
0 | 375 { |
376 if (set_kata_giji_sbn (yomi_sno, yomi_eno, endvect, endvect1, &maxsbn) < 0) | |
377 return (-1); | |
378 } | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
379 if (maxsbn->jentptr == NULL && maxsbn->status == WNN_NOT_CONNECT) |
0 | 380 maxsbn->status = WNN_GIJI; |
381 sbn_cnt = cnt_syo (maxsbn); | |
3 | 382 if ((*dsd_sbn = get_dsd_sbn (sbn_cnt)) == NULL) |
0 | 383 { |
384 init_work_areas (); | |
385 return (-1); | |
386 } | |
387 dcdsbn_set (*dsd_sbn, maxsbn); | |
388 freesbn (maxsbn); | |
389 return (1); | |
390 } | |
391 | |
392 /**********************************************/ | |
393 /* 決定した文節の情報をセットする */ | |
394 /**********************************************/ | |
395 static struct DSD_DBN * | |
396 dcdbn_set (struct DSD_DBN *dsd_dbn, | |
397 struct DSD_SBN **dsd_sbn, | |
398 struct BZD *bzd) | |
399 { | |
400 struct DSD_DBN *nextp; | |
401 #ifdef CONVERT_from_TOP | |
402 struct DSD_DBN *dsd_dbn_head; | |
403 struct BZD *s_bzd; /* Buffer son's bzd */ | |
404 dsd_dbn_head = dsd_dbn; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
405 while (bzd != NULL) |
0 | 406 { |
407 nextp = dsd_dbn++; | |
408 nextp->bun_m = bzd->bend_m; | |
409 nextp->bun_jc = bzd->j_c; | |
410 nextp->sbncnt = bzd->sbn_cnt; | |
411 nextp->v_jc = bzd->v_jc; | |
412 | |
413 if (bzd->sbn->status == 0) | |
414 bzd->sbn->status = WNN_SENTOU; | |
415 | |
416 nextp->sbn = *dsd_sbn; | |
417 *dsd_sbn = dcdsbn_set (*dsd_sbn, bzd->sbn); | |
418 | |
419 s_bzd = bzd->lnk_son; | |
420 freebzd (bzd); | |
421 bzd = s_bzd; | |
422 } | |
423 return (dsd_dbn_head); | |
424 #else /* CONVERT_from_TOP */ | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
425 if (bzd == NULL) |
0 | 426 return (dsd_dbn); |
427 nextp = dcdbn_set (dsd_dbn, dsd_sbn, bzd->lnk_son); | |
428 nextp->bun_m = bzd->bend_m; | |
429 nextp->bun_jc = bzd->j_c; | |
430 nextp->sbncnt = bzd->sbn_cnt; | |
431 nextp->v_jc = bzd->v_jc; | |
432 | |
433 if (bzd->sbn->status == 0) | |
434 bzd->sbn->status = WNN_SENTOU; | |
435 | |
436 nextp->sbn = *dsd_sbn; | |
437 *dsd_sbn = dcdsbn_set (*dsd_sbn, bzd->sbn); | |
438 freebzd (bzd); | |
439 return (++nextp); | |
440 #endif /* CONVERT_from_TOP */ | |
441 } | |
442 | |
443 static struct DSD_SBN * | |
444 dcdsbn_set (struct DSD_SBN *dsd_sbn, | |
445 struct SYO_BNSETSU *sbn) | |
446 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
447 if (sbn == NULL) |
0 | 448 return (dsd_sbn); |
449 #ifdef CONVERT_from_TOP | |
450 dsd_sbn = dcdsbn_set (dsd_sbn, sbn->parent); | |
451 #endif /* CONVERT_from_TOP */ | |
452 dsd_sbn->bun_m = sbn->bend_m; | |
453 dsd_sbn->bun_jc = sbn->j_c; | |
454 dsd_sbn->i_jc = sbn->i_jc; | |
455 dsd_sbn->jentptr = sbn->jentptr; | |
456 dsd_sbn->t_jc = sbn->t_jc; | |
457 dsd_sbn->hinsi = sbn->hinsi_fk; | |
458 dsd_sbn->kangovect = sbn->kangovect; | |
459 dsd_sbn->v_jc = sbn->v_jc; | |
460 dsd_sbn->status = sbn->status; | |
461 dsd_sbn->status_bkwd = sbn->status_bkwd; | |
462 dsd_sbn++; | |
463 #ifndef CONVERT_from_TOP | |
464 dsd_sbn = dcdsbn_set (dsd_sbn, sbn->parent); | |
465 #endif /* CONVERT_from_TOP */ | |
466 return (dsd_sbn); | |
467 } | |
468 | |
469 /* 1 大文節中の小文節の数 */ | |
470 static int | |
471 cnt_syo (struct SYO_BNSETSU *sbn) | |
472 { | |
473 int cnt; | |
474 cnt = 0; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
475 |
0 | 476 while (sbn) |
477 { | |
478 cnt++; | |
479 sbn = sbn->parent; | |
480 } | |
481 return (cnt); | |
482 } | |
483 | |
484 /* 1 大文節の数 */ | |
485 static void | |
486 cnt_bzd (struct BZD *bzd, | |
487 int *dbn_cnt, | |
488 int *sbn_cnt) | |
489 { | |
490 *dbn_cnt = 0; | |
491 *sbn_cnt = 0; | |
492 while (bzd) | |
493 { | |
494 *sbn_cnt += cnt_syo (bzd->sbn); | |
495 (*dbn_cnt)++; | |
496 bzd = bzd->lnk_son; | |
497 } | |
498 } | |
499 | |
500 static int | |
501 chk_yomi_endvect ( | |
502 int yomi_sno, /* 解析文字列 start index */ | |
503 int yomi_eno, /* 解析文字列 end index (end char の次) */ | |
504 int endvect, /* 終端ベクタ */ | |
505 int endvect1) /* 終端ベクタ */ | |
506 { | |
507 if (yomi_sno == yomi_eno || (fzk_ckvt (endvect) == NO && fzk_ckvt (endvect1) == NO)) | |
508 { | |
509 wnn_errorno = WNN_NO_KOUHO; | |
510 log_err ("chk_yomi_endvect: cannot make tan-bunsetu kouho."); | |
511 return (-1); | |
512 } | |
513 return (0); | |
514 } | |
515 | |
516 static int | |
517 set_kata_giji_sbn ( | |
518 int yomi_sno, /* 解析文字列 start index */ | |
519 int yomi_eno, /* 解析文字列 end index (end char の次) */ | |
520 int endvect, /* 終端ベクタ */ | |
521 int endvect1, /* 終端ベクタ */ | |
522 struct SYO_BNSETSU **sbn) | |
523 { | |
524 struct ICHBNP *ichbnpbp; /* ICHBNP のセーブ */ | |
525 int fzkcnt; | |
526 int tempi; | |
527 int connect_flg = NO; | |
528 | |
529 if (chk_yomi_endvect (yomi_sno, yomi_eno, endvect, endvect1) < 0) | |
530 return (-1); | |
531 | |
532 fzkcnt = fzk_kai (&bun[yomi_sno], &bun[yomi_eno], endvect, endvect1, &ichbnpbp); | |
533 if (fzkcnt <= 0) | |
534 { | |
535 log_err ("tan_syo(): cannot make tan-bunsetu kouho."); | |
536 init_work_areas (); | |
537 return (-1); /* ERROR */ | |
538 } | |
539 for (tempi = fzkcnt - 1; (int) tempi >= (int) 0; tempi--) | |
540 { | |
541 if (kan_ck_vector (giji_no, getfzkoh (ichbnpbp, tempi)->vector) == WNN_CONNECT_BK) | |
542 { | |
543 connect_flg = YES; | |
544 break; | |
545 } | |
546 } | |
547 if (tempi < 0) | |
548 { | |
549 for (tempi = fzkcnt - 1; (int) tempi >= (int) 0; tempi--) | |
550 { | |
551 if (kan_ck_vector (giji_no, getfzkoh1 (ichbnpbp, tempi)->vector) == WNN_CONNECT_BK) | |
552 { | |
553 break; | |
554 } | |
555 } | |
556 if (tempi < 0) | |
557 { | |
558 freeibsp (ichbnpbp); | |
559 wnn_errorno = WNN_NO_KOUHO; | |
560 log_err ("tan_syo(): cannot make tanbunsetu kouho."); | |
561 return (-1); | |
562 } | |
563 } | |
564 | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
565 if ((*sbn = getsbnsp ()) == NULL) |
0 | 566 return (-1); |
567 | |
568 (*sbn)->j_c = yomi_eno - 1; | |
569 (*sbn)->i_jc = getfzkoh (ichbnpbp, tempi)->offset + yomi_sno; | |
570 (*sbn)->bend_m = yomi_sno; | |
571 (*sbn)->v_jc = 0; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
572 (*sbn)->jentptr = NULL; |
0 | 573 (*sbn)->t_jc = WNN_KATAKANA; |
574 (*sbn)->kangovect = ft->kango_hinsi_area[giji_no]; | |
575 (*sbn)->hinsi_fk = giji_no; | |
576 (*sbn)->status = WNN_GIJI; | |
577 (*sbn)->status_bkwd = connect_flg; | |
578 freeibsp (ichbnpbp); | |
579 return (1); | |
580 } | |
581 | |
582 static int | |
583 set_kata_giji_bzd ( | |
584 int yomi_sno, /* 解析文字列 start index */ | |
585 int yomi_eno, /* 解析文字列 end index (end char の次) */ | |
586 int endvect, /* 終端ベクタ */ | |
587 int endvect1, /* 終端ベクタ */ | |
588 struct BZD **bzd, | |
589 int buncnt) | |
590 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
3
diff
changeset
|
591 if ((*bzd = getbzdsp ()) == NULL) |
0 | 592 return (-1); |
593 if (set_kata_giji_sbn (yomi_sno, yomi_eno, endvect, endvect1, &(*bzd)->sbn) < 0) | |
594 return (-1); | |
595 (*bzd)->j_c = yomi_eno - 1; | |
596 (*bzd)->bend_m = yomi_sno; | |
597 (*bzd)->v_jc = 0; | |
598 (*bzd)->sbn_cnt = 1; | |
599 (*bzd)->kbcnt = buncnt + 1; | |
600 return (1); | |
601 } |