Initial revision
[chise/kage.git] / tools / chise_tools.i
1 // chise_tools.i\r
2 //\r
3 // Copyright (C) 2005 Koichi Kamichi.\r
4 //\r
5 // reference : http://www.swig.org/Doc1.3/Perl5.html\r
6 //             sample.c included to libchise\r
7 \r
8 %module chise_tools\r
9 \r
10 // This tells SWIG to treat char ** as a special case\r
11 %typemap(in) char ** {\r
12         AV *tempav;\r
13         I32 len;\r
14         int i;\r
15         SV  **tv;\r
16         if (!SvROK($input))\r
17             croak("Argument $argnum is not a reference.");\r
18         if (SvTYPE(SvRV($input)) != SVt_PVAV)\r
19             croak("Argument $argnum is not an array.");\r
20         tempav = (AV*)SvRV($input);\r
21         len = av_len(tempav);\r
22         $1 = (char **) malloc((len+2)*sizeof(char *));\r
23         for (i = 0; i <= len; i++) {\r
24             tv = av_fetch(tempav, i, 0);        \r
25             $1[i] = (char *) SvPV(*tv,PL_na);\r
26         }\r
27         $1[i] = NULL;\r
28 };\r
29 \r
30 // This cleans up the char ** array after the function call\r
31 %typemap(freearg) char ** {\r
32         free($1);\r
33 }\r
34 \r
35 // Creates a new Perl array and places a NULL-terminated char ** into it\r
36 %typemap(out) char ** {\r
37         AV *myav;\r
38         SV **svs;\r
39         int i = 0,len = 0;\r
40         /* Figure out how many elements we have */\r
41         while ($1[len])\r
42            len++;\r
43         svs = (SV **) malloc(len*sizeof(SV *));\r
44         for (i = 0; i < len ; i++) {\r
45             svs[i] = sv_newmortal();\r
46             sv_setpv((SV*)svs[i],$1[i]);\r
47         };\r
48         myav =  av_make(len,svs);\r
49         free(svs);\r
50         $result = newRV((SV*)myav);\r
51         sv_2mortal($result);\r
52         argvi++;\r
53 }\r
54 \r
55 %inline %{\r
56 \r
57 #include <chise.h>\r
58 \r
59 unsigned char *get_uchar(char *argv){\r
60   return (unsigned char *)argv;\r
61 }\r
62 \r
63 char *get_char(unsigned char *argv){\r
64   return (char *)argv;\r
65 }\r
66 \r
67 unsigned char buffer[1024];\r
68 int buffer_size = 1024;\r
69 \r
70 void clear_buffer(){\r
71   int i;\r
72   for(i = 0; i < buffer_size; i++){\r
73     buffer[i] = 0;\r
74   }\r
75 }\r
76 \r
77 unsigned char feature[10240];\r
78 int feature_size = 10240;\r
79 \r
80 static int\r
81 name_map_func (CHISE_DS *ds, unsigned char *name)\r
82 {\r
83   strcat((char *)feature, (char *)name);\r
84   strcat((char *)feature, (char *)"\n");\r
85   return 0;\r
86 }\r
87 \r
88 void listup_feature(CHISE_DS *ds){\r
89   int i;\r
90   for(i = 0; i < feature_size; i++){\r
91     feature[i] = 0;\r
92   }\r
93   chise_ds_foreach_char_feature_name (ds, &name_map_func);\r
94 }\r
95 \r
96 %}\r