Mercurial > freewnn
view Wnn/jserver/bnsetu_kai.c @ 23:e1aadb6dcbd4
- fixed the build rule for build_stamp.h. keywords in template for hg tip should surrounded by curly braces instead of hash marks.
- fixed usage of libtool in building jlib.V3. newer libtool does not work without mode specifier.
- replaced some libtool related files. (should remove these?)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Fri, 23 Jan 2009 16:36:13 +0900 |
parents | ed4bb01eb317 |
children | 466fe6732d8d |
line wrap: on
line source
/* * $Id: bnsetu_kai.c,v 1.5 2003/05/11 18:35:54 hiroo Exp $ */ /* * FreeWnn is a network-extensible Kana-to-Kanji conversion system. * This file is part of FreeWnn. * * Copyright Kyoto University Research Institute for Mathematical Sciences * 1987, 1988, 1989, 1990, 1991, 1992 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 * Copyright FreeWnn Project 1999, 2000, 2003 * * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /************************************************ * 小文節解析 * ************************************************/ #include <stdio.h> #include <ctype.h> #include "commonhd.h" #include "de_header.h" #include "jdata.h" #include "fzk.h" #include "kaiseki.h" int sbn_kai (yomi_sno, yomi_eno, endvect, endvect1, tsbnptr, bnst_num, parent) int yomi_sno; int yomi_eno; int endvect; /* 終端ベクタ */ int endvect1; /* 終端ベクタ */ struct SYO_BNSETSU **tsbnptr; /* 小文節解析結果 */ int bnst_num; /* これまでに解析した小文節数 */ struct SYO_BNSETSU *parent; /* 親の幹語ノード */ { int fzkcnt, hyokaval, hyokaval0 = 0, hinsidt, sbncnt; unsigned short *hinsi_buf; int hinsidt_fk; /* 複合品詞のセーブ */ register int i, /* 幹語の終わりのインデックス */ j, /* 文節始めのインデックス */ t, ii; struct jdata *jentptr; register struct SYO_BNSETSU *sbnptr = NULL; struct SYO_BNSETSU *sbnptr_top = 0; struct ICHBNP *ichbnpbp; int k, ll; struct SYO_BNSETSU *kanptr; struct SYO_BNSETSU *kanptr_tmp = NULL; struct SYO_BNSETSU *kanptr_before; struct SYO_BNSETSU *giji_sbn; int get_giji_flg = -1; /* 擬似文節を作れたか */ enum FLG { set, noset } setflg; enum FLG kanflg; /* 同じベクタの品詞があったか否か */ enum GFLG { get, noget } getflg; struct SYO_BNSETSU *getsbnsp (); int kangovect; int connect_flg; if ((yomi_sno == yomi_eno) || (fzk_ckvt (endvect) == NO && fzk_ckvt (endvect1) == NO)) return (NOTHING); if ((fzkcnt = fzk_kai (&bun[yomi_sno], &bun[yomi_eno], endvect, endvect1, &ichbnpbp)) <= 0) return (fzkcnt); /* ERROR */ for (ii = 0; ii < fzkcnt; ii++) getfzkoh (ichbnpbp, ii)->offset += yomi_sno; for (ii = 0; ii < fzkcnt; ii++) { i = getfzkoh (ichbnpbp, ii)->offset; if (jmtp[i] == (struct jdata **) UN_KNOWN) /* もう引いた? */ { jmt_set (i); /* 辞書引き */ } } j = j_max (ichbnpbp, fzkcnt); j = (j >= yomi_eno) ? yomi_eno - 1 : j; setflg = noset; if ((giji_sbn = getsbnsp ()) == NO) return (-1); /* ERROR */ giji_sbn->kbcnt = bnst_num; giji_sbn->bend_m = yomi_sno; giji_sbn->parent = parent; /* 疑似文節を先に取り出します(もしあれば) */ if (getgiji (yomi_sno, yomi_eno, giji_sbn, ichbnpbp, fzkcnt, bnst_num) >= 0) { sbncnt = 1; getflg = get; get_giji_flg = giji_sbn->j_c; if (giji_sbn->j_c > j) { sbnptr_top = giji_sbn; get_giji_flg = -1; kanptr_tmp = giji_sbn->lnk_br; } } else { sbnptr = giji_sbn; sbncnt = 0; getflg = noget; } for (; j >= yomi_sno; j--) { /* 文節の長さ */ if ((setflg == noset) && (get_giji_flg == j)) { giji_sbn->lnk_br = sbnptr_top; sbnptr_top = giji_sbn; setflg = set; kanptr_tmp = giji_sbn->lnk_br; } for (ii = 0; (ii < fzkcnt) && ((i = (getfzkoh (ichbnpbp, ii)->offset)) <= j); ii++) { /* 付属語 */ jentptr = (struct jdata *) C (i, j); for (; jentptr; jentptr = jentptr->jptr) { /* 辞書 */ for (t = 0; t < (jentptr->kosuu); t++) { /* 幹語 */ if (((jentptr->hindo[t] & 0x7f) == 0x7f) || (jentptr->hindo_in && (jentptr->hindo_in[t] & 0x7f) == 0x7f)) continue; /*コメントアウトされた辞書エントリ */ #ifdef CONVERT_with_SiSheng hyokaval = hyoka1 (jentptr->hindo[t], (jentptr->hindo_in == 0 ? 0 : jentptr->hindo_in[t]), (jentptr->sisheng == 0 ? 0 : diff_sisheng (jentptr->sisheng[t], jentptr->sisheng_int)), j - i / 2 - yomi_sno / 2 + 1, dic_table[jentptr->jishono].nice); #else hyokaval = hyoka1 (jentptr->hindo[t], (jentptr->hindo_in == 0 ? 0 : jentptr->hindo_in[t]), j - i + 1, j - yomi_sno + 1, dic_table[jentptr->jishono].nice); #endif /* CONVERT_with_SiSheng */ if (bnst_num != 1) { if (parent != 0 && parent->status_bkwd == NO) /* 前の文節が endvect に接続できないものは、 評価値を下げる */ hyokaval0 = _DIVID (hyokaval, 2); else hyokaval0 = hyokaval; } hinsidt_fk = hinsidt = jentptr->hinsi[t]; if ((ll = wnn_get_fukugou_component_body (hinsidt_fk, &hinsi_buf)) == 0) { error1 ("wnn_get_fukugou_component:erroe in bunsetukai."); return (-1); } for (; ll > 0; ll--) { hinsidt = *hinsi_buf; hinsi_buf++; /* ここから後は単純品詞だけ考えればいい */ connect_flg = kan_ck_vector (hinsidt, (getfzkoh (ichbnpbp, ii)->vector)); if ((connect_flg == WNN_CONNECT_BK || (bnst_num == 1 && kan_ck_vector (hinsidt, (getfzkoh1 (ichbnpbp, ii)->vector)) == WNN_CONNECT_BK))) { /* 接続できる */ if (bnst_num == 1) /* endvect に接続できないものは評価値を下げる */ hyokaval0 = (connect_flg != WNN_NOT_CONNECT_BK) ? hyokaval : _DIVID (hyokaval, 2); kangovect = ft->kango_hinsi_area[hinsidt]; if (getflg == get) { getflg = noget; if (0 == (sbnptr = getsbnsp ())) return (-1); /* ERROR */ sbnptr->kbcnt = bnst_num; sbnptr->bend_m = yomi_sno; sbnptr->parent = parent; } sbnptr->j_c = j; if (setflg == noset) { /* この長さの文節は初めて */ sbnptr->lnk_br = sbnptr_top; sbnptr_top = sbnptr; setflg = set; sbnptr->v_jc = hyokaval0; sbnptr->t_jc = t; sbnptr->jentptr = jentptr; sbnptr->hinsi_fk = hinsidt_fk; sbnptr->kangovect = kangovect; sbnptr->i_jc = i; /* yoku wakaran 9/8 if (endvect1 == WNN_VECT_NO) sbnptr->status_bkwd = WNN_NOT_CONNECT_BK; else */ sbnptr->status_bkwd = connect_flg; kanptr_tmp = sbnptr->lnk_br; getflg = get; sbncnt++; } else { kanflg = noset; for (kanptr_before = kanptr = sbnptr_top; kanptr != kanptr_tmp; kanptr_before = kanptr, kanptr = kanptr->lnk_br) { if (kanptr->kangovect == kangovect) { /* 同じベクタの品詞があった */ if (hyokaval0 > kanptr->v_jc) { /* こっちの方が評価値が高い */ kanptr->v_jc = hyokaval0; kanptr->t_jc = t; kanptr->jentptr = jentptr; kanptr->hinsi_fk = hinsidt_fk; kanptr->i_jc = i; /* yoku wakaran 9/8 if (endvect1 == WNN_VECT_NO) kanptr->status_bkwd = WNN_NOT_CONNECT_BK; else */ kanptr->status_bkwd = connect_flg; } kanflg = set; break; } else if (kanptr->kangovect > kangovect) { /* 同じベクタの品詞がなかった */ break; } } /* SORT & INSERT SYO_BN */ if (kanflg == noset) { /* 同じベクタの品詞がなかった */ if (kanptr == sbnptr_top) { sbnptr->lnk_br = kanptr; sbnptr_top = sbnptr; } else { sbnptr->lnk_br = kanptr; kanptr_before->lnk_br = sbnptr; } sbnptr->v_jc = hyokaval0; sbnptr->t_jc = t; sbnptr->jentptr = jentptr; sbnptr->hinsi_fk = hinsidt_fk; sbnptr->kangovect = kangovect; sbnptr->i_jc = i; /* yoku wakaran 9/8 if (endvect1 == WNN_VECT_NO) sbnptr->status_bkwd = WNN_NOT_CONNECT_BK; else */ sbnptr->status_bkwd = connect_flg; sbncnt++; getflg = get; } } } /* 接続できる */ } /* 単純品詞 */ } /* 幹語 */ } /* 辞書 */ } /* 付属語 */ setflg = noset; /* 次の長さの漢語はまだsetして無い */ } /* 文節の長さ */ if (sbncnt == NOTHING) { /* 幹語がなかった */ for (k = fzkcnt - 1; k >= 0; k--) { if (kan_ck_vector (katakanago_no, getfzkoh (ichbnpbp, k)->vector) == WNN_CONNECT_BK) { k = getgiji (yomi_sno, yomi_eno, sbnptr, ichbnpbp, k + 1, bnst_num); break; } } if (k < 0) { if (bnst_num == 1) { /* 何が何でも疑似文節を作るんだい */ getgiji_f (yomi_sno, sbnptr); sbncnt = 1; sbnptr_top = sbnptr; #ifdef nodef wnn_errorno = WNN_NO_KOUHO; error1 ("Cannot get bunsetsu kouho in bunsetu-kaiseki.\n"); #endif /* nodef */ } else { freesbn (sbnptr); sbncnt = 0; sbnptr_top = 0; } } else { sbncnt = 1; sbnptr_top = sbnptr; } } else if (getflg == noget) { freesbn (sbnptr); } *tsbnptr = sbnptr_top; /* 短いものから並べる */ freeibsp (ichbnpbp); return (sbncnt); } /*******************************************/ /* max value in maxj[] search routine */ /*******************************************/ int j_max (fzkbnp, fzkcnt) register struct ICHBNP *fzkbnp; int fzkcnt; /* max number of fzkkouho table */ { register int i, mxj = -1, k, ofst; for (i = 0; i < fzkcnt; i++) { if ((ofst = getfzkoh (fzkbnp, i)->offset) < maxchg) if ((k = maxj[ofst]) > mxj) mxj = k; } return (mxj); } /**********************************************/ /* 疑似幹語の獲得 */ /**********************************************/ #ifdef KOREAN int getgiji (yomi_sno, yomi_eno, sbnptr, fzkbnp, fzkcnt, bnst_num) int yomi_sno; int yomi_eno; struct SYO_BNSETSU *sbnptr; struct ICHBNP *fzkbnp; int fzkcnt; int bnst_num; { register int j_end; int j_end_sv; int *vector; int *vector1; int giji_hinsi; int giji_hindo; int len = 0; w_char c = (w_char) 0; j_end = getfzkoh (fzkbnp, fzkcnt - 1)->offset; vector = getfzkoh (fzkbnp, fzkcnt - 1)->vector; vector1 = getfzkoh1 (fzkbnp, fzkcnt - 1)->vector; /* 分類 */ if ((isascii (c = bun[j_end]) && isdigit (c)) || isjdigit (c)) { /* 数字 */ giji_hinsi = suuji_no; giji_hindo = c_env->suuji_val; } else if ((isascii (c) && isparen_e (c)) || isjparen_e (c)) { /* 閉括弧 */ giji_hinsi = toji_kakko_no; giji_hindo = c_env->toji_kakko_val; } else if (is_g_eisuu (c)) { /* アスキー(アルファベット, 数字) */ giji_hinsi = eisuu_no; giji_hindo = c_env->eisuu_val; } else if ((isascii (c) && isparen_s (c)) || isjparen_s (c)) { /* 開括弧 */ giji_hinsi = kai_kakko_no; giji_hindo = c_env->kaikakko_val; } else if (ishangul (c)) { /* Hangul */ giji_hinsi = katakanago_no; giji_hindo = 0; } else { /* 記号、漢字 */ giji_hinsi = kigou_no; giji_hindo = c_env->kigou_val; } /* 接続可能か */ if ((sbnptr->status_bkwd = kan_ck_vector (giji_hinsi, vector)) == WNN_CONNECT_BK) goto _Can_connect; if (bnst_num != 1) return (-1); if (kan_ck_vector (giji_hinsi, vector1) == WNN_NOT_CONNECT_BK) { if (giji_hinsi != suuji_no || kan_ck_vector (eisuu_no, vector1) == WNN_NOT_CONNECT_BK) return (-1); else { giji_hinsi = eisuu_no; giji_hindo = c_env->eisuu_val; } } _Can_connect: /* 長さを調べる */ if (giji_hinsi == suuji_no) { for (; (j_end + len < yomi_eno) && ((isascii (bun[j_end + len]) && isdigit (bun[j_end + len])) || isjdigit (bun[j_end + len])); len++) ; if ((j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len])) { /* 英数 */ for (len++; (j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++) ; if (kan_ck_vector (eisuu_no, vector) == WNN_NOT_CONNECT_BK && (bnst_num != 1 || kan_ck_vector (eisuu_no, vector1))) return (-1); giji_hinsi = eisuu_no; } } else if (giji_hinsi == eisuu_no) { for (; ((j_end + len) < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++) ; } else if (giji_hinsi == toji_kakko_no) { /* 閉括弧 */ len = 1; } else if (giji_hinsi == kigou_no) { /* 記号 */ len = 1; } else if (giji_hinsi == kai_kakko_no) { /* 開括弧 */ len = 1; } else if (giji_hinsi == giji_no) { len = 1; } else if (giji_hinsi == katakanago_no) { /* Hangul */ for (len = 1; (j_end + len < yomi_eno) && ishangul (bun[j_end + len]); len++) ; } else { if (j_end >= yomi_eno) len = 0; else len = 1; } /* スペースは、そのあとの疑似文節にくっつける */ if ((giji_hinsi == eisuu_no) || (giji_hinsi == suuji_no) || (giji_hinsi == katakanago_no)) { for (; ((j_end + len) < yomi_eno) && (isspace (bun[j_end + len]) || (isjspace (c))); len++) ; } _Only_Fuzokugo: /* 評価値の決定 */ sbnptr->v_jc = HYOKAVAL (giji_hindo, len, len + j_end - yomi_sno); sbnptr->i_jc = j_end; if (giji_hinsi == katakanago_no) { sbnptr->t_jc = WNN_KATAKANA; sbnptr->v_jc = 0; } else if (giji_hinsi == suuji_no) { sbnptr->t_jc = c_env->giji.number; } else if (isascii (c)) { if (giji_hinsi == eisuu_no) { sbnptr->t_jc = c_env->giji.eisuu; } else if (giji_hinsi == kigou_no || giji_hinsi == toji_kakko_no || giji_hinsi == kai_kakko_no) { sbnptr->t_jc = c_env->giji.kigou; } else { sbnptr->t_jc = -1; } sbnptr->v_jc += 2; /* 次候補よりも評価値を上げるため */ } else { sbnptr->t_jc = -1; } sbnptr->hinsi_fk = giji_hinsi; sbnptr->jentptr = 0; sbnptr->kangovect = ft->kango_hinsi_area[giji_hinsi]; sbnptr->j_c = j_end + len - 1; return (len); } #else /* !KOREAN */ int getgiji (yomi_sno, yomi_eno, sbnptr, fzkbnp, fzkcnt, bnst_num) int yomi_sno; int yomi_eno; struct SYO_BNSETSU *sbnptr; struct ICHBNP *fzkbnp; int fzkcnt; int bnst_num; { register int j_end; int j_end_sv; int *vector; #ifndef CHINESE int *vector1; #endif int giji_hinsi; int giji_hindo; int len = 0; w_char c = (w_char) 0; j_end = getfzkoh (fzkbnp, fzkcnt - 1)->offset; vector = getfzkoh (fzkbnp, fzkcnt - 1)->vector; #ifndef CHINESE vector1 = getfzkoh1 (fzkbnp, fzkcnt - 1)->vector; #endif if (j_end >= yomi_eno) { /* 付属語だけの場合 */ giji_hinsi = fuzokugo_no; giji_hindo = c_env->fuzokogo_val; len = 0; goto _Only_Fuzokugo; } /*#ifdef not_use*/ if (isjhira (bun[j_end])) /* ひらがなならバイバイ */ return (-1); /*#endif*/ for (j_end_sv = j_end; j_end < yomi_eno; j_end++) { /* スペースは、その前の疑似文節にくっつける */ if (!(isspace (c = bun[j_end])) && !(isjspace (c))) { if (TOKUSYU (c) || check_bar_katakana (j_end, yomi_eno) || isjhira (c) || isjkanji (c)) { /* 片仮名 ひらがな 漢字 */ j_end = j_end_sv; } break; } } if (j_end >= yomi_eno) { /* スペースだけの場合 */ giji_hinsi = fuzokugo_no; giji_hindo = c_env->fuzokogo_val; len = 0; goto _Only_Fuzokugo; } /* 分類 */ if ((isascii (c = bun[j_end]) && isdigit (c)) || isjdigit (c)) { /* 数字 */ giji_hinsi = suuji_no; giji_hindo = c_env->suuji_val; } else if ((isascii (c) && isparen_e (c)) || isjparen_e (c)) { /* 閉括弧 */ giji_hinsi = toji_kakko_no; giji_hindo = c_env->toji_kakko_val; } else if (TOKUSYU (c) || check_bar_katakana (j_end, yomi_eno)) { /* 片仮名 */ giji_hinsi = katakanago_no; giji_hindo = c_env->kana_val; } else if (is_g_eisuu (c)) { /* アスキー(アルファベット, 数字) */ giji_hinsi = eisuu_no; giji_hindo = c_env->eisuu_val; } else if ((isascii (c) && isparen_s (c)) || isjparen_s (c)) { /* 開括弧 */ giji_hinsi = kai_kakko_no; giji_hindo = c_env->kaikakko_val; #ifdef nodef } else if (isjhira (c)) { /* ひらがな */ giji_hinsi = giji_no; giji_hindo = 0; #endif } else { /* 記号、漢字 */ giji_hinsi = kigou_no; giji_hindo = c_env->kigou_val; } /* 接続可能か */ if ((sbnptr->status_bkwd = kan_ck_vector (giji_hinsi, vector)) == WNN_CONNECT_BK) goto _Can_connect; #ifdef nodef /* 数字に接続できないが,アスキには接続できる */ if (giji_hinsi == suuji_no && kan_ck_vector (eisuu_no, vector) == WNN_CONNECT_BK) { giji_hinsi = eisuu_no; giji_hindo = c_env->eisuu_val; goto _Can_connect; } #endif /* nodef */ if (bnst_num != 1) return (-1); #ifndef CHINESE if (kan_ck_vector (giji_hinsi, vector1) == WNN_NOT_CONNECT_BK) { if (giji_hinsi != suuji_no || kan_ck_vector (eisuu_no, vector1) == WNN_NOT_CONNECT_BK) return (-1); else { giji_hinsi = eisuu_no; giji_hindo = c_env->eisuu_val; } } #endif /* CHINESE */ _Can_connect: /* 長さを調べる */ if (giji_hinsi == suuji_no) { for (; (j_end + len < yomi_eno) && ((isascii (bun[j_end + len]) && isdigit (bun[j_end + len])) || isjdigit (bun[j_end + len])); len++) ; #ifndef CHINESE if ((j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len])) { /* 英数 */ for (len++; (j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++) ; if (kan_ck_vector (eisuu_no, vector) == WNN_NOT_CONNECT_BK && (bnst_num != 1 || kan_ck_vector (eisuu_no, vector1))) return (-1); giji_hinsi = eisuu_no; #ifdef nodef /* 半角数字 */ } else { if (kan_ck_vector (suuji_no, vector) == WNN_NOT_CONNECT_BK) return (-1); #endif /* nodef */ } #endif /* CHINESE */ } else if (giji_hinsi == eisuu_no) { for (; ((j_end + len) < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++) ; } else if (giji_hinsi == toji_kakko_no) { /* 閉括弧 */ len = 1; } else if (giji_hinsi == kigou_no) { /* 記号 */ len = 1; } else if (giji_hinsi == kai_kakko_no) { /* 開括弧 */ len = 1; } else if (giji_hinsi == giji_no) { len = 1; } else if (giji_hinsi == katakanago_no) { /* カタカナ 半角カタカナ 濁点 半濁点 */ for (len = 1; (j_end + len < yomi_eno) && (TOKUSYU (bun[j_end + len]) || check_bar_katakana (j_end + len, yomi_eno)); len++) ; } else { if (j_end >= yomi_eno) len = 0; else len = 1; } /* スペースは、そのあとの疑似文節にくっつける */ if ((giji_hinsi == eisuu_no) || (giji_hinsi == suuji_no)) { for (; ((j_end + len) < yomi_eno) && (isspace (bun[j_end + len]) || (isjspace (c))); len++) ; } _Only_Fuzokugo: /* 評価値の決定 */ sbnptr->v_jc = HYOKAVAL (giji_hindo, len, len + j_end - yomi_sno); sbnptr->i_jc = j_end; if (giji_hinsi == katakanago_no) { sbnptr->t_jc = WNN_KATAKANA; } else if (giji_hinsi == suuji_no) { sbnptr->t_jc = c_env->giji.number; } else if (isascii (c)) { if (giji_hinsi == eisuu_no) { sbnptr->t_jc = c_env->giji.eisuu; } else if (giji_hinsi == kigou_no || giji_hinsi == toji_kakko_no || giji_hinsi == kai_kakko_no) { sbnptr->t_jc = c_env->giji.kigou; } else { sbnptr->t_jc = -1; } sbnptr->v_jc += 2; /* 次候補よりも評価値を上げるため */ } else { sbnptr->t_jc = -1; } sbnptr->hinsi_fk = giji_hinsi; sbnptr->jentptr = 0; sbnptr->kangovect = ft->kango_hinsi_area[giji_hinsi]; sbnptr->j_c = j_end + len - 1; return (len); } #endif /* KOREAN */ int is_g_eisuu (c) register w_char c; { register int i; if ((isascii (c) && isalnum (c)) || isjalnum (c)) return (YES); else { for (i = 0; i < 20; i++) { if (giji_eisuu[i] == 0xffff) return (NO); else if (giji_eisuu[i] == c) return (YES); } } return (NO); } /* 何が何でも疑似文節を作るんだい */ int getgiji_f (yomi_sno, sbnptr) register int yomi_sno; register struct SYO_BNSETSU *sbnptr; { sbnptr->v_jc = HYOKAVAL (0, 1, 1); sbnptr->i_jc = yomi_sno; sbnptr->t_jc = -1; sbnptr->hinsi_fk = giji_no; sbnptr->jentptr = 0; sbnptr->kangovect = ft->kango_hinsi_area[kigou_no]; sbnptr->j_c = yomi_sno; return (1); } /* カタカナか? 長音記号の前は、カタカナでないとダメ */ int check_bar_katakana (i, yomi_eno) register int i; register int yomi_eno; { register int j; for (j = i; j < yomi_eno; j++) { if (isjkata (bun[j])) return (YES); if (!(BAR_CODE (bun[j]))) return (NO); } return (NO); } /* * kan_ckvt hinsi の品詞がvectorに接続できるか */ int kan_ckvt (hinsi, vector) register unsigned short hinsi; /* 品詞No. */ register int vector; /* 付属語前端ベクタ */ { register int *v; v = (int *) ((word_vector *) ft->kango_vect_area + vector); return (kan_ck_vector (hinsi, v)); /* return (kan_ck_vector(hinsi, ((word_vector *) ft->kango_vect_area + vector))); */ } #ifdef change_macro int kan_ck_vector (hinsi, vector) unsigned short hinsi; /* 品詞No. */ int vector[]; /* 付属語前端ベクタ */ { register int wvect; wvect = vector[hinsi / (sizeof (int) << 3)]; /* << 3 == * 8 */ wvect >>= (hinsi % (sizeof (int) << 3)); if ((wvect & 0x00000001) == 1) return (WNN_CONNECT_BK); else return (WNN_NOT_CONNECT_BK); } #endif /* change_macro */