Mercurial > freewnn
annotate Wnn/jserver/daibn_kai.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 | 338478efe78d |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * $Id: daibn_kai.c,v 1.4 2002/05/12 22:51:16 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 * 大文節解析 * | |
34 ************************************************/ | |
35 #ifdef HAVE_CONFIG_H | |
36 # include <config.h> | |
37 #endif | |
38 | |
39 #include <stdio.h> | |
40 #if STDC_HEADERS | |
41 # include <stdlib.h> | |
42 #elif HAVE_MALLOC_H | |
43 # include <malloc.h> | |
44 #endif /* STDC_HEADERS */ | |
45 #include "commonhd.h" | |
46 #include "de_header.h" | |
47 #include "kaiseki.h" | |
48 #include "fzk.h" | |
49 | |
50 static int yomi_sno_tmp; | |
51 int _status = 0; | |
52 static int edagari_hyouka; | |
53 | |
54 int | |
55 #ifdef NO_FZK | |
56 dbn_kai (yomi_sno, yomi_eno, beginvect, endvect, endvect1, nmax, rbzd) | |
57 #else | |
58 dbn_kai (yomi_sno, yomi_eno, beginvect, fzkchar, endvect, endvect1, nmax, rbzd) | |
59 #endif /* NO_FZK */ | |
60 int yomi_sno; /* 被解析文字開始位置 */ | |
61 register int yomi_eno; /* 被解析文字終了位置(の次) */ | |
62 int beginvect; /* 前端ベクタ(-1:文節先頭、-2:なんでも)品詞No. */ | |
63 #ifndef NO_FZK | |
64 w_char *fzkchar; /* 前端の付属語文字列 */ | |
65 #endif /* NO_FZK */ | |
66 int endvect; /* 終端ベクトル */ | |
67 int endvect1; /* 終端ベクトル */ | |
68 register int nmax; | |
69 struct BZD **rbzd; | |
70 /* struct BZD *p; p = NULL; として &p を使う。ここに大文節候補の | |
71 リストが入る */ | |
72 { | |
73 /* 大文節候補リストのカレントポインタ */ | |
74 int tmp; | |
75 struct SYO_BNSETSU *db_set; | |
76 register struct SYO_BNSETSU **sb_que_head; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
77 struct BZD *bzd = NULL; |
0 | 78 int dbncnt = 0; |
79 int setflg; | |
80 register struct SYO_BNSETSU *sb_one; | |
81 struct SYO_BNSETSU *sb_set; | |
82 register struct SYO_BNSETSU **sb_que_newcomer; | |
83 int divid; | |
84 int edagari_hyouka_sbn; | |
85 | |
86 edagari_hyouka = _MININT; | |
87 edagari_hyouka_sbn = _MININT; | |
88 yomi_sno_tmp = yomi_sno; | |
89 | |
90 sb_que_head = &db_set; | |
91 *sb_que_head = NULL; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
92 if ((tmp = sbn_kai (yomi_sno, yomi_eno, endvect, endvect1, sb_que_head, 1, NULL)) <= 0) |
0 | 93 return (tmp); |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
94 for (sb_one = *sb_que_head; sb_one != NULL; sb_one = sb_one->lnk_br) |
0 | 95 sb_one->son_v = sum_hyouka (sb_one); |
96 | |
97 while (*sb_que_head != NULL) | |
98 { | |
99 sb_one = *sb_que_head; | |
100 *sb_que_head = sb_one->lnk_br; | |
101 sb_one->son_v = sum_hyouka (sb_one); | |
102 setflg = 0; | |
103 if (yomi_eno <= sb_one->j_c + 1) | |
104 { | |
105 #ifdef NO_FZK | |
106 divid = get_status (sb_one->kangovect, beginvect, &sb_one->status); | |
107 #else | |
108 divid = get_status (sb_one->kangovect, beginvect, fzkchar, &sb_one->status); | |
109 #endif /* NO_FZK */ | |
110 if (beginvect != WNN_ALL_HINSI && bzd != 0 && | |
111 bzd->j_c == sb_one->j_c && ((sb_one->status == WNN_SENTOU && bzd->sbn->status != WNN_SENTOU) || (sb_one->status == WNN_CONNECT && bzd->sbn->status != WNN_CONNECT))) | |
112 bzd->v_jc = 0; | |
113 if ((tmp = set_daibnsetu (rbzd, &bzd, sb_one, &setflg, divid)) < 0) | |
114 return (tmp); | |
115 dbncnt += tmp; | |
116 if (setflg == 0) | |
117 clr_sbn_node (sb_one); | |
118 } | |
119 else | |
120 { | |
121 if (kan_ckvt (sentou_no, sb_one->kangovect) == WNN_CONNECT_BK) | |
122 { | |
123 divid = 0; | |
124 sb_one->status = WNN_SENTOU; | |
125 } | |
126 else | |
127 { | |
128 /* divid = 2; */ | |
129 divid = -1; | |
130 sb_one->status = WNN_GIJI; | |
131 } | |
132 if ((tmp = set_daibnsetu (rbzd, &bzd, sb_one, &setflg, divid)) < 0) | |
133 return (tmp); | |
134 dbncnt += tmp; | |
135 | |
136 if (nmax > sb_one->kbcnt) | |
137 { | |
138 /****************************/ | |
139 if (_DIVID (edagari_hyouka_sbn, 3) < sb_one->son_v) | |
140 { | |
141 if (edagari_hyouka_sbn < sb_one->son_v) | |
142 { | |
143 edagari_hyouka_sbn = sb_one->son_v; | |
144 } | |
145 /****************************/ | |
146 sb_que_newcomer = &sb_set; | |
147 *sb_que_newcomer = NULL; | |
148 if ((tmp = sbn_kai (sb_one->j_c + 1, yomi_eno, sb_one->kangovect, WNN_VECT_NO, sb_que_newcomer, sb_one->kbcnt + 1, sb_one)) < 0) | |
149 return (tmp); /* ERROR */ | |
150 /****************************/ | |
151 } | |
152 else | |
153 { | |
154 tmp = 0; | |
155 } | |
156 /****************************/ | |
157 if (tmp > 0) | |
158 { | |
159 sb_one->reference += tmp; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
160 for (sb_one = *sb_que_newcomer; sb_one != NULL; sb_one = sb_one->lnk_br) |
0 | 161 sb_one->son_v = sum_hyouka (sb_one); |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
162 if (*sb_que_head != NULL) |
0 | 163 *sb_que_head = que_reorder (*sb_que_head, *sb_que_newcomer); |
164 else | |
165 *sb_que_head = *sb_que_newcomer; | |
166 } | |
167 else | |
168 { | |
169 if (setflg == 0) | |
170 clr_sbn_node (sb_one); | |
171 } | |
172 } | |
173 else | |
174 { | |
175 if (setflg == 0) | |
176 clr_sbn_node (sb_one); | |
177 } | |
178 } | |
179 } | |
180 /**********/ | |
181 { | |
182 struct BZD *bzd_sv; | |
183 bzd = *rbzd; | |
184 while (dbncnt > 0 && bzd->v_jc < _DIVID (edagari_hyouka, 2)) | |
185 { | |
186 *rbzd = bzd->lnk_br; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
187 bzd->lnk_br = NULL; |
0 | 188 clr_node (bzd); |
189 bzd = *rbzd; | |
190 dbncnt--; | |
191 } | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
192 for (; bzd != NULL && bzd->lnk_br != NULL; bzd = bzd->lnk_br) |
0 | 193 { |
194 if (bzd->lnk_br->v_jc < _DIVID (edagari_hyouka, 2)) | |
195 { | |
196 bzd_sv = bzd->lnk_br->lnk_br; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
197 bzd->lnk_br->lnk_br = NULL; |
0 | 198 clr_node (bzd->lnk_br); |
199 bzd->lnk_br = bzd_sv; | |
200 dbncnt--; | |
201 } | |
202 } | |
203 } | |
204 /**********/ | |
205 return (dbncnt); | |
206 } | |
207 | |
208 /* 前(beginvect,fzkchar)と接続できるか調べ、 | |
209 接続できるとき 1 | |
210 大文節の先頭の時 0 | |
211 接続できないとき -1 | |
212 を返す | |
213 get_jkt_status 参照 | |
214 */ | |
215 int | |
216 #ifdef NO_FZK | |
217 get_status (kangovect, beginvect, status) | |
218 #else | |
219 get_status (kangovect, beginvect, fzkchar, status) | |
220 #endif /* NO_FZK */ | |
221 register int kangovect; | |
222 int beginvect; | |
223 #ifndef NO_FZK | |
224 w_char *fzkchar; | |
225 #endif /* NO_FZK */ | |
226 register short *status; | |
227 { | |
228 #ifdef NO_FZK | |
229 if (zentan_able (kangovect, beginvect) == YES) | |
230 { | |
231 #else | |
232 if (zentan_able (kangovect, beginvect, fzkchar) == YES) | |
233 { | |
234 #endif /* NO_FZK */ | |
235 _status = 2; | |
236 if (beginvect == WNN_ALL_HINSI) | |
237 { | |
238 if (kan_ckvt (sentou_no, kangovect) == WNN_CONNECT_BK) | |
239 { | |
240 *status = WNN_SENTOU; | |
241 /* | |
242 } else if (jentptr == 0) { | |
243 *status = WNN_GIJI; | |
244 return (-1); | |
245 */ | |
246 } | |
247 else | |
248 { | |
249 *status = WNN_NOT_CONNECT; | |
250 return (-1); | |
251 } | |
252 } | |
253 else if (beginvect == WNN_BUN_SENTOU) | |
254 { | |
255 *status = WNN_SENTOU; | |
256 } | |
257 else | |
258 { | |
259 if ( | |
260 #ifndef NO_FZK | |
5 | 261 (fzkchar == NULL || *fzkchar == 0) && |
0 | 262 #endif /* NO_FZK */ |
263 beginvect == sentou_no) | |
264 { | |
265 *status = WNN_SENTOU; | |
266 } | |
267 else | |
268 { | |
269 *status = WNN_CONNECT; | |
270 return (1); | |
271 } | |
272 } | |
273 } | |
274 else if (_status < 2 && kan_ckvt (sentou_no, kangovect) == WNN_CONNECT_BK) | |
275 { | |
276 _status = 1; | |
277 *status = WNN_SENTOU; | |
278 } | |
279 else | |
280 { | |
281 /* | |
282 if (jentptr == 0) | |
283 *status = WNN_GIJI; | |
284 else | |
285 */ | |
286 *status = WNN_NOT_CONNECT; | |
287 return (-1); | |
288 } | |
289 return (0); | |
290 } | |
291 | |
292 /* 文節先頭になれるか */ | |
293 /* 前端ベクタのチェック */ | |
294 int | |
295 #ifdef NO_FZK | |
296 zentan_able (v, hinsi) | |
297 #else | |
298 zentan_able (v, hinsi, fzkchar) | |
299 #endif /* NO_FZK */ | |
300 int v; | |
301 register int hinsi; /* 前端ベクタ(-1:文節先頭、-2:なんでも)品詞No. */ | |
302 #ifndef NO_FZK | |
303 w_char *fzkchar; | |
304 #endif /* NO_FZK */ | |
305 { | |
306 #ifndef NO_FZK | |
307 register int ll; | |
308 unsigned short *buf; | |
309 struct ICHBNP *ichbnpbp; | |
310 w_char *fzk_buf; | |
311 int fzkcnt; | |
312 int fzklen; | |
313 w_char *rev_fzk (); | |
314 #endif /* NO_FZK */ | |
315 | |
316 if (hinsi == WNN_ALL_HINSI) | |
317 { | |
318 return (YES); | |
319 } | |
320 else if (hinsi == WNN_BUN_SENTOU) | |
321 { | |
322 return (kan_ckvt (sentou_no, v)); | |
323 } | |
324 #ifndef NO_FZK | |
325 else | |
326 { | |
5 | 327 if (fzkchar == NULL || *fzkchar == 0) |
0 | 328 { |
329 if ((ll = wnn_get_fukugou_component_body (hinsi, &buf)) == 0) | |
330 { | |
331 error1 ("wnn_get_fukugou_component:error in zentan_able."); | |
332 return (-1); | |
333 } | |
334 for (; ll > 0; ll--) | |
335 { | |
336 if (kan_ckvt (*buf, v) == WNN_CONNECT_BK) | |
337 return (YES); | |
338 buf++; | |
339 } | |
340 } | |
341 else | |
342 { | |
343 fzklen = Strlen (fzkchar); | |
344 fzk_buf = rev_fzk (fzkchar, fzklen); | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
345 if (fzk_buf == NULL) |
0 | 346 return (NO); /* ええかげん */ |
347 | |
348 fzkcnt = fzk_kai (fzk_buf, fzk_buf + fzklen, v, WNN_VECT_NO, &ichbnpbp); | |
349 if ((fzkcnt <= 0) || (getfzkoh (ichbnpbp, fzkcnt - 1)->offset != fzklen)) | |
350 { | |
351 freeibsp (ichbnpbp); | |
352 return (NO); | |
353 } | |
354 for (ll = wnn_get_fukugou_component_body (hinsi, &buf); ll > 0; ll--) | |
355 { | |
356 if (kan_ck_vector (*buf, getfzkoh (ichbnpbp, fzkcnt - 1)->vector) == WNN_CONNECT_BK) | |
357 { | |
358 freeibsp (ichbnpbp); | |
359 return (YES); | |
360 } | |
361 buf++; | |
362 } | |
363 freeibsp (ichbnpbp); | |
364 } | |
365 } | |
366 #endif /* NO_FZK */ | |
367 return (NO); | |
368 } | |
369 | |
370 #ifndef NO_FZK | |
371 w_char * | |
372 rev_fzk (fzkchar, len) | |
373 register w_char *fzkchar; | |
374 int len; | |
375 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
376 static w_char *fzk = NULL; |
0 | 377 static int fzk_len = 0; |
378 | |
379 if (fzk_len < len) | |
380 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
381 if (fzk != NULL) |
0 | 382 free (fzk); |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
383 if ((fzk = (w_char *) malloc ((len + 1) * sizeof (w_char))) == NULL) |
0 | 384 { |
385 wnn_errorno = WNN_MALLOC_ERR; | |
386 fzk_len = 0; | |
387 return (fzk); | |
388 } | |
389 fzk_len = len; | |
390 } | |
391 | |
392 (void) Sreverse (fzk, fzkchar); | |
393 return (fzk); | |
394 } | |
395 #endif /* NO_FZK */ | |
396 | |
397 /* 小文節の並び替え 長さとベクタでソートする */ | |
398 /* que の先頭を返す */ | |
399 /* 長さもベクタも同じなら評価値の高い方だけにする */ | |
400 struct SYO_BNSETSU * | |
401 que_reorder (que, new) | |
402 register struct SYO_BNSETSU *que, *new; | |
403 { | |
404 struct SYO_BNSETSU *que_sv; | |
405 register struct SYO_BNSETSU *q; | |
406 register struct SYO_BNSETSU *tmp; | |
407 register struct SYO_BNSETSU *next; | |
408 int flg; | |
409 | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
410 if (new == NULL) |
0 | 411 return (que); |
412 if ((flg = sbjunjo (que, new)) < 0) | |
413 { | |
414 if (flg == -2) | |
415 { | |
416 if (cmp_hyouka (new, que) > 0) | |
417 { | |
418 tmp = que->lnk_br; | |
419 next = new->lnk_br; | |
420 clr_sbn_node (que); | |
421 que = new; | |
422 que->lnk_br = tmp; | |
423 } | |
424 else | |
425 { | |
426 next = new->lnk_br; | |
427 clr_sbn_node (new); | |
428 } | |
429 que_sv = que; | |
430 new = next; | |
431 } | |
432 else | |
433 que_sv = new; | |
434 } | |
435 else | |
436 que_sv = que; | |
437 | |
438 while (new != NULL) | |
439 { | |
440 next = new->lnk_br; | |
441 if ((flg = sbjunjo (que, new)) < 0) | |
442 { | |
443 if (flg == -2) | |
444 { | |
445 if (cmp_hyouka (new, que) > 0) | |
446 { | |
447 for (q = que_sv; q->lnk_br != que; q = q->lnk_br); | |
448 tmp = que->lnk_br; | |
449 clr_sbn_node (que); | |
450 que = q->lnk_br = new; | |
451 que->lnk_br = tmp; | |
452 } | |
453 else | |
454 { | |
455 clr_sbn_node (new); | |
456 } | |
457 } | |
458 else | |
459 { | |
460 tmp = que; | |
461 que = new; | |
462 que->lnk_br = tmp; | |
463 } | |
464 new = next; | |
465 continue; | |
466 } | |
467 while (((flg = sbjunjo (que, new)) > 0) && (que)->lnk_br != NULL) | |
468 que = (que->lnk_br); | |
469 tmp = que->lnk_br; | |
470 if (flg == -2) | |
471 { | |
472 if (cmp_hyouka (new, que) > 0) | |
473 { | |
474 for (q = que_sv; q->lnk_br != que; q = q->lnk_br); | |
475 clr_sbn_node (que); | |
476 que = q->lnk_br = new; | |
477 que->lnk_br = tmp; | |
478 } | |
479 else | |
480 { | |
481 clr_sbn_node (new); | |
482 } | |
483 } | |
484 else | |
485 { | |
486 que->lnk_br = new; | |
487 new->lnk_br = tmp; | |
488 } | |
489 new = next; | |
490 } | |
491 return (que_sv); | |
492 } | |
493 | |
494 /* que と new の順序 | |
495 1: que が前 | |
496 0: que の後に new | |
497 -1:new が前 | |
498 -2:同一順位 */ | |
499 int | |
500 sbjunjo (que, new) | |
501 register struct SYO_BNSETSU *que, *new; | |
502 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
503 if (new == NULL) |
0 | 504 return (1); |
505 if (que->j_c > new->j_c) | |
506 return (-1); | |
507 if (que->j_c < new->j_c) | |
508 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
509 if (que->lnk_br == NULL) |
0 | 510 return (0); |
511 if (que->lnk_br->j_c > new->j_c) | |
512 return (0); | |
513 if (que->lnk_br->j_c < new->j_c) | |
514 return (1); | |
515 if (que->lnk_br->kangovect > new->kangovect) | |
516 return (0); | |
517 return (1); | |
518 } | |
519 if (que->kangovect == new->kangovect) | |
520 return (-2); | |
521 if (que->kangovect > new->kangovect) | |
522 return (-1); | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
523 if (que->lnk_br == NULL) |
0 | 524 return (0); |
525 if (que->lnk_br->j_c > new->j_c) | |
526 return (0); | |
527 if (que->lnk_br->kangovect > new->kangovect) | |
528 return (0); | |
529 return (1); | |
530 } | |
531 | |
532 | |
533 /* 文節の先頭になれれば、大文節の候補をセットする | |
534 bzd に小文節を追加したなら 1 追加しなければ 0 を返す。 */ | |
535 int | |
536 set_daibnsetu (rbzd, bzd, sbn, setflg, divid) | |
537 struct BZD **rbzd; | |
538 register struct BZD **bzd; | |
539 register struct SYO_BNSETSU *sbn; | |
540 int *setflg; | |
541 int divid; | |
542 { | |
543 register int ret; | |
544 int hyouka; | |
545 | |
546 hyouka = DIVID_HYOUKA (ave_hyouka (sbn), divid); | |
547 if (hyouka > edagari_hyouka) | |
548 edagari_hyouka = hyouka; | |
549 else if (hyouka < _DIVID (edagari_hyouka, 2)) | |
550 return (0); | |
551 | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
552 if (*bzd != NULL) |
0 | 553 { |
554 if ((*bzd)->j_c == sbn->j_c) | |
555 { | |
556 /* 同じ長さ */ | |
557 if ((*bzd)->v_jc >= hyouka) | |
558 return (0); | |
559 clr_sbn_node ((*bzd)->sbn); | |
560 ret = 0; | |
561 } | |
562 else | |
563 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
564 if (((*bzd)->lnk_br = getbzdsp ()) == NULL) |
0 | 565 return (-1); |
566 (*bzd) = (*bzd)->lnk_br; | |
567 ret = 1; | |
568 } | |
569 } | |
570 else | |
571 { | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
572 if ((*rbzd = *bzd = getbzdsp ()) == NULL) |
0 | 573 return (-1); |
574 ret = 1; | |
575 } | |
576 (*bzd)->v_jc = hyouka; | |
577 (*bzd)->j_c = sbn->j_c; | |
578 (*bzd)->sbn_cnt = sbn->kbcnt; | |
25
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
579 (*bzd)->lnk_br = NULL; |
466fe6732d8d
- fixed more NULL pointer related errata
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
5
diff
changeset
|
580 (*bzd)->lnk_son = NULL; |
0 | 581 (*bzd)->son_v = 0; |
582 (*bzd)->sbn = sbn; | |
583 (*bzd)->kbcnt = 1; | |
584 sbn->reference++; | |
585 (*bzd)->bend_m = yomi_sno_tmp; | |
586 *setflg = 1; | |
587 return (ret); | |
588 } | |
589 | |
590 /* 大文節の評価関数 とりあえず */ | |
591 | |
592 /* sbn に含まれる小文節の評価値の合計 */ | |
593 int | |
594 sum_hyouka (sbn) | |
595 register struct SYO_BNSETSU *sbn; | |
596 { | |
597 return (sbn->v_jc + (sbn->parent ? sbn->parent->son_v : 0)); | |
598 } | |
599 | |
600 int | |
601 ave_hyouka (sbn) | |
602 register struct SYO_BNSETSU *sbn; | |
603 { | |
604 register int len; /* 大文節長 */ | |
605 | |
606 len = sbn->j_c - yomi_sno_tmp + 1; | |
607 return (hyoka_dbn (sbn->son_v, sbn->kbcnt, len)); | |
608 } | |
609 | |
610 /* 大文節の評価値 | |
611 長さが同じで、前端ベクタも同じ2つの大文節のどちらを | |
612 選ぶか決めるために使う | |
613 小文節のリスト sbn1 の方が高いと正の値を返す | |
614 */ | |
615 int | |
616 cmp_hyouka (sbn1, sbn2) | |
617 register struct SYO_BNSETSU *sbn1; | |
618 register struct SYO_BNSETSU *sbn2; | |
619 { | |
620 /* 取りあえず大文節の評価値は、小文節の評価値の平均と考えている */ | |
621 return (ave_hyouka (sbn1) - ave_hyouka (sbn2)); | |
622 } |