summaryrefslogtreecommitdiff
path: root/src-worddic/wtype.c
diff options
context:
space:
mode:
Diffstat (limited to 'src-worddic/wtype.c')
-rw-r--r--src-worddic/wtype.c292
1 files changed, 292 insertions, 0 deletions
diff --git a/src-worddic/wtype.c b/src-worddic/wtype.c
new file mode 100644
index 0000000..df29de3
--- /dev/null
+++ b/src-worddic/wtype.c
@@ -0,0 +1,292 @@
+/*
+ * 品詞型を管理する
+ * 中身はwtype_tの内部のレイアウトに強く依存する。
+ *
+ * Copyright (C) 2000-2007 TABATA Yusuke
+ */
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <stdio.h>
+#include <string.h>
+
+#include <anthy/wtype.h>
+#include "dic_main.h"
+
+wtype_t anthy_wt_none, anthy_wt_all;
+
+struct wttable {
+ const char *name;
+ int pos;
+ int cos;
+ int scos;
+ int cc;
+ int ct;/*カ変など*/
+ int flags;
+};
+
+/* 品詞の日本語の名前を品詞に変換するテーブル */
+static struct wttable pos_name_tab[]= {
+#include "ptab.h"
+};
+
+/* 辞書中の品詞の名前を品詞に変換するテーブル */
+static struct wttable wt_name_tab[]= {
+#include "wtab.h"
+};
+
+static struct wttable *
+find_wttab(struct wttable *array, const char *name)
+{
+ struct wttable *w;
+ for (w = array; w->name; w++) {
+ if (!strcmp(w->name, name)) {
+ return w;
+ }
+ }
+ return NULL;
+}
+
+void
+anthy_init_wtypes(void)
+{
+ anthy_wt_all.pos = POS_NONE;
+ anthy_wt_all.cc = CC_NONE;
+ anthy_wt_all.ct = CT_NONE;
+ anthy_wt_all.cos = COS_NONE;
+ anthy_wt_all.scos = SCOS_NONE;
+ anthy_wt_all.wf = WF_NONE;
+
+ anthy_wt_none = anthy_wt_all;
+ anthy_wt_none.pos = POS_INVAL;
+}
+
+/*
+ * 返り値には品詞の名前
+ * tには品詞が返される
+ */
+const char *
+anthy_type_to_wtype(const char *s, wtype_t *t)
+{
+ struct wttable *w;
+ if (s[0] != '#') {
+ *t = anthy_wt_none;
+ return NULL;
+ }
+ w = find_wttab(wt_name_tab, s);
+ if (!w) {
+ *t = anthy_wt_all;
+ return NULL;
+ }
+ *t = anthy_get_wtype(w->pos, w->cos, w->scos, w->cc, w->ct, w->flags);
+ return w->name;
+}
+
+wtype_t
+anthy_init_wtype_by_name(const char *name)
+{
+ struct wttable *p;
+ p = find_wttab(pos_name_tab, name);
+
+ if (p) {
+ return anthy_get_wtype(p->pos, p->cos, p->scos, p->cc, p->ct, p->flags);
+ }
+
+ printf("Failed to find wtype(%s).\n", name);
+ return anthy_wt_all;
+}
+
+/* 二つの品詞が完全に一致しているかどうか */
+int
+anthy_wtype_equal(wtype_t lhs, wtype_t rhs)
+{
+ if (lhs.pos == rhs.pos &&
+ lhs.cos == rhs.cos &&
+ lhs.scos == rhs.scos &&
+ lhs.cc == rhs.cc &&
+ lhs.ct == rhs.ct &&
+ lhs.wf == rhs.wf) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+/* n は hs の一部かどうか? */
+int
+anthy_wtype_include(wtype_t hs, wtype_t n)
+{
+ /*printf("POS %d,%d\n", hs.type[WT_POS], n.type[WT_POS]);*/
+ if (hs.pos != POS_NONE &&
+ hs.pos != n.pos) {
+ return 0;
+ }
+ if (hs.cc != CC_NONE &&
+ hs.cc != n.cc) {
+ return 0;
+ }
+ if (hs.ct != CT_NONE &&
+ hs.ct != n.ct) {
+ return 0;
+ }
+ if (hs.cos != COS_NONE &&
+ hs.cos != n.cos) {
+ return 0;
+ }
+ if (hs.scos != SCOS_NONE &&
+ hs.scos != n.scos) {
+ return 0;
+ }
+ return 1;
+}
+
+int
+anthy_wtype_get_cc(wtype_t t)
+{
+ return t.cc;
+}
+
+int
+anthy_wtype_get_ct(wtype_t t)
+{
+ return t.ct;
+}
+
+int
+anthy_wtype_get_pos(wtype_t t)
+{
+ return t.pos;
+}
+
+int
+anthy_wtype_get_cos(wtype_t t)
+{
+ return t.cos;
+}
+
+int
+anthy_wtype_get_scos(wtype_t t)
+{
+ return t.scos;
+}
+
+int
+anthy_wtype_get_wf(wtype_t t)
+{
+ return t.wf;
+}
+
+int
+anthy_wtype_get_indep(wtype_t t)
+{
+ return t.wf & WF_INDEP;
+}
+
+int
+anthy_wtype_get_meisi(wtype_t w)
+{
+ return w.wf & WF_MEISI;
+}
+
+int
+anthy_wtype_get_sv(wtype_t w)
+{
+ return w.wf & WF_SV;
+}
+
+int
+anthy_wtype_get_ajv(wtype_t w)
+{
+ return w.wf & WF_AJV;
+}
+
+void
+anthy_wtype_set_cc(wtype_t *w, int cc)
+{
+ w->cc = cc;
+}
+
+void
+anthy_wtype_set_ct(wtype_t *w, int ct)
+{
+ w->ct = ct;
+}
+
+void
+anthy_wtype_set_pos(wtype_t *w, int pos)
+{
+ w->pos = pos;
+}
+
+void
+anthy_wtype_set_cos(wtype_t *w, int cs)
+{
+ w->cos = cs;
+}
+
+void
+anthy_wtype_set_scos(wtype_t *w, int sc)
+{
+ w->scos = sc;
+}
+
+void
+anthy_wtype_set_dep(wtype_t *w, int isDep)
+{
+ if (isDep) {
+ w->wf &= (~WF_INDEP);
+ }else{
+ w->wf |= WF_INDEP;
+ }
+}
+
+void
+anthy_print_wtype(wtype_t w)
+{
+ printf("(POS=%d,COS=%d,SCOS=%d,CC=%d,CT=%d,flags=%d)\n",
+ anthy_wtype_get_pos(w),
+ anthy_wtype_get_cos(w),
+ anthy_wtype_get_scos(w),
+ anthy_wtype_get_cc(w),
+ anthy_wtype_get_ct(w),
+ anthy_wtype_get_wf(w));
+}
+
+wtype_t
+anthy_get_wtype_with_ct(wtype_t base, int ct)
+{
+ wtype_t w;
+
+ w = base;
+ w.ct = ct;
+
+ return w;
+}
+
+wtype_t
+anthy_get_wtype(int pos, int cos, int scos, int cc, int ct, int wf)
+{
+ wtype_t w;
+
+ w.pos = pos;
+ w.cos = cos;
+ w.scos = scos;
+ w.cc = cc;
+ w.ct = ct;
+ w.wf = wf;
+
+ return w;
+}