/* * mecab.c * * 2009.3.13 by naoya_t * */ #include #include #include #include "mecab.h" // mecab_t mecab_t* unwrap_mecab_t(ScmObj obj) { return SCM_MECAB(obj)->m; } ScmObj wrap_mecab_t(mecab_t *m) { ScmMeCab *obj = SCM_NEW(ScmMeCab); SCM_SET_CLASS(obj, SCM_CLASS_MECAB); obj->m = m; return SCM_OBJ(obj); } // mecab_node_t const mecab_node_t* unwrap_mecab_node_t(ScmObj obj) { return SCM_MECAB_NODE(obj)->mn; } ScmObj wrap_mecab_node_t(const mecab_node_t *mn) { ScmMeCabNode *obj = SCM_NEW(ScmMeCabNode); SCM_SET_CLASS(obj, SCM_CLASS_MECAB_NODE); obj->mn = mn; return SCM_OBJ(obj); } // mecab_dictionary_info_t const mecab_dictionary_info_t* unwrap_mecab_dictionary_info_t(ScmObj obj) { return SCM_MECAB_DICTIONARY_INFO(obj)->mdi; } ScmObj wrap_mecab_dictionary_info_t(const mecab_dictionary_info_t *mdi) { ScmMeCabDictionaryInfo *obj = SCM_NEW(ScmMeCabDictionaryInfo); SCM_SET_CLASS(obj, SCM_CLASS_MECAB_DICTIONARY_INFO); obj->mdi = mdi; return SCM_OBJ(obj); } /* APIs with (int argc, char **argv) */ #define mecab_call_func(result_type,fn,args) do{ \ result_type result; \ if (SCM_NULLP(args)) { \ char *argv[] = {""}; \ result = (fn)(1,argv); \ } else { \ int argc, i=0; \ ScmObj argl; \ char **argv = NULL; \ if (SCM_INTEGERP(Scm_Car(args))) { \ argc = SCM_INT_VALUE(Scm_Car(args)); argl = Scm_Cadr(args); \ } else { \ argc = 1 + Scm_Length(args); i++; argl = args; \ } \ argv = (char**)malloc(sizeof(char*) * argc); \ if (i) argv[0] = ""; \ if (argv) { \ if (SCM_VECTORP(argl)) { \ for (;i