root/lang/gauche/mecab-gauche-0.98pre1/mecab/mecab.c @ 82

Revision 82, 4.1 kB (checked in by naoya_t, 16 years ago)

mecab-gauche binding by naoya_t ; first import

Line 
1/*
2 * mecab.c
3 *
4 *  2009.3.13 by naoya_t
5 *
6 */
7
8#include <gauche.h>
9#include <gauche/extend.h>
10
11#include <mecab.h>
12#include "mecab.h"
13
14//ScmClass *Scm_MeCabClass;
15// mecab_t
16mecab_t* unwrap_mecab_t(ScmObj obj)
17{
18  return SCM_MECAB(obj)->m;
19}
20ScmObj wrap_mecab_t(mecab_t *m)
21{
22  ScmMeCab *obj = SCM_NEW(ScmMeCab);
23  SCM_SET_CLASS(obj, SCM_CLASS_MECAB);
24  obj->m = m;
25  return SCM_OBJ(obj);
26}
27
28// mecab_node_t
29const mecab_node_t* unwrap_mecab_node_t(ScmObj obj)
30{
31  return SCM_MECAB_NODE(obj)->mn;
32}
33ScmObj wrap_mecab_node_t(const mecab_node_t *mn)
34{
35  ScmMeCabNode *obj = SCM_NEW(ScmMeCabNode);
36  SCM_SET_CLASS(obj, SCM_CLASS_MECAB_NODE);
37  obj->mn = mn;
38  return SCM_OBJ(obj);
39}
40
41// mecab_dictionary_info_t
42const mecab_dictionary_info_t* unwrap_mecab_dictionary_info_t(ScmObj obj)
43{
44  return SCM_MECAB_DICTIONARY_INFO(obj)->mdi;
45}
46ScmObj wrap_mecab_dictionary_info_t(const mecab_dictionary_info_t *mdi)
47{
48  ScmMeCabDictionaryInfo *obj = SCM_NEW(ScmMeCabDictionaryInfo);
49  SCM_SET_CLASS(obj, SCM_CLASS_MECAB_DICTIONARY_INFO);
50  obj->mdi = mdi;
51  return SCM_OBJ(obj);
52}
53
54/* APIs with (int argc, char **argv) */
55#define mecab_call_func(result_type,fn,args) do{  \
56  result_type result;         \
57  if (SCM_NULLP(args)) {      \
58    char *argv[] = {""};      \
59    result = (fn)(1,argv);    \
60  } else {                    \
61    int argc, i=0;              \
62    ScmObj argl;                \
63    char **argv = NULL;         \
64    if (SCM_INTEGERP(Scm_Car(args))) {                              \
65      argc = SCM_INT_VALUE(Scm_Car(args)); argl = Scm_Cadr(args);   \
66    } else {                                                        \
67      argc = 1 + Scm_Length(args); i++; argl = args;                \
68    }                                                               \
69    argv = (char**)malloc(sizeof(char*) * argc);                    \
70    if (i) argv[0] = "";                                                \
71    if (argv) {                                                         \
72      if (SCM_VECTORP(argl)) {                                          \
73        for (;i<argc;i++)                                        \
74          argv[i] = (char *)Scm_GetStringConst((ScmString *)SCM_VECTOR_ELEMENT(argl,i)); \
75      } else {                                                          \
76        for (;i<argc && !SCM_NULLP(argl); argl=Scm_Cdr(argl),i++) \
77          argv[i] = (char *)Scm_GetStringConst((ScmString *)Scm_Car(argl)); \
78      }                                                                 \
79      result = (fn)(argc,argv);                                         \
80    }                                                                   \
81    free((void *)argv);                                                 \
82  }                                                                     \
83  return result;                                                        \
84} while(0)
85
86mecab_t *mecab_call_mecab_func(mecab_func_with_args fn, ScmObj args)
87{
88  mecab_call_func(mecab_t*,fn,args);
89}
90int mecab_call_int_func(int_func_with_args fn, ScmObj args)
91{
92  mecab_call_func(int,fn,args);
93}
94
95/*
96static void MeCab_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
97{
98  ScmMeCab *m = SCM_MECAB(obj);//SCM_MECAB_UNBOX(obj);
99  //  const char *queue_name = q->getName().c_str();
100  Scm_Printf(out, "#<<mecab> 0x%x>", m->m);
101}
102
103static void MeCab_cleanup(ScmObj obj)
104{
105  ScmMeCab *m = SCM_MECAB(obj);
106  if (m->m) {
107    mecab_destroy(m->m);
108    m->m = NULL;
109  }
110}
111*/
112
113/*
114 * Module initialization function.
115 */
116extern void Scm_Init_mecablib(ScmModule*);
117
118void Scm_Init_mecab(void)
119{
120    ScmModule *mod;
121
122    /* Register this DSO to Gauche */
123    SCM_INIT_EXTENSION(mecab);
124
125    /* Create the module if it doesn't exist yet. */
126    mod = SCM_MODULE(SCM_FIND_MODULE("mecab", TRUE));
127    /*
128    Scm_MeCabClass =
129        Scm_MakeForeignPointerClass(mod, "<mecab>",
130                                    MeCab_print,
131                                    MeCab_cleanup,
132                                    SCM_FOREIGN_POINTER_KEEP_IDENTITY|SCM_FOREIGN_POINTER_MAP_NULL);
133    */
134    /* Register stub-generated procedures */
135    Scm_Init_mecablib(mod);
136}
Note: See TracBrowser for help on using the browser.