.
[SXSI/xpathcomp.git] / OCamlDriver.cpp
1 /**************************************
2  * OCamlDriver.cpp
3  * -------------------
4  * A Test Ocaml Driver which calls the C++ methods and
5  * adds a C wrapper interface with OCaml code.
6  * 
7  * Author: Kim Nguyen
8  * Date: 04/11/08
9  */
10
11 /* OCaml memory managment */
12 extern "C" {
13 #include <caml/mlvalues.h>
14 #include <caml/alloc.h>
15 #include <caml/memory.h>
16 #include <caml/callback.h>
17 #include <caml/fail.h>
18 } //extern C
19
20 #include "TextCollection/TextCollection.h"
21 #include "XMLDocShredder.h"
22 #include "XMLTree.h"
23 #include "Utils.h"
24
25 #define CAMLRAISECPP(e) (caml_failwith( ((e).what())))
26 #define NOT_IMPLEMENTED(s)  (caml_failwith(s))
27 #define XMLTREE(x) ((XMLTree *)(x))
28 #define TEXTCOLLECTION(x)
29 #define TREENODEVAL(i) ((treeNode) (Int_val(i)))
30
31 extern "C" CAMLprim value caml_call_shredder_uri(value uri){
32   CAMLparam1(uri);
33   CAMLlocal1(doc);
34   char *fn = String_val(uri);
35   try {
36   XMLDocShredder shredder(fn);  
37   shredder.processStartDocument(fn);  
38   shredder.parse();  
39   shredder.processEndDocument();
40   doc = (value) shredder.storageIfc_->returnDocument();
41
42   CAMLreturn(doc);
43   }
44   catch (const std::exception& e){
45     CAMLRAISECPP(e);
46   };
47   
48 }
49
50 extern "C" CAMLprim value caml_call_shredder_string(value data){
51   CAMLparam1(data);
52   CAMLlocal1(doc);
53   unsigned int ln = string_length(data);
54   unsigned char *fn = (unsigned char*) String_val(data);
55   
56   try {
57     XMLDocShredder shredder(fn,ln);  
58     shredder.processStartDocument("");  
59     shredder.parse();  
60     shredder.processEndDocument();
61     doc = (value) shredder.storageIfc_->returnDocument();
62     
63     CAMLreturn(doc);
64   }
65   catch (const std::exception& e) {
66     CAMLRAISECPP(e);
67   };
68 }
69
70 void traversal_rec(XMLTree* tree, treeNode id){
71  DocID tid; 
72   if (id == NULLT)
73     return;
74   int tag = tree->Tag(id);
75    if (id) {
76         tid = tree->PrevText(id);
77         char * data = (char *) (tree->getTextCollection())->GetText(tid);
78         if (tree->IsLeaf(id)){
79           tid = tree->MyText(id);
80
81           data = (char*) (tree->getTextCollection())->GetText(tid);
82         };
83   
84         if (tree->NextSibling(id) == NULLT){
85           tid = tree->NextText(id);
86           data = (char*) (tree->getTextCollection())->GetText(tid);
87         }; 
88    };
89    traversal_rec(tree,tree->FirstChild(id));
90    traversal_rec(tree,tree->NextSibling(id));
91    return;
92 }
93
94 extern "C" CAMLprim value caml_cpp_traversal(value tree){
95   CAMLparam1(tree);
96   traversal_rec(XMLTREE(tree),XMLTREE(tree)->Root());
97   CAMLreturn(Val_unit);
98 }
99
100
101 extern "C" CAMLprim value caml_text_collection_get_text(value tc, value id){
102   CAMLparam2(tc,id);
103   
104   const char* txt = (const char*) ((TextCollection*) tc)->GetText((DocID) Int_val(id)); 
105   CAMLreturn (caml_copy_string(txt));
106 }
107 extern "C" CAMLprim value caml_text_collection_empty_text(value tc,value id){
108   CAMLparam2(tc,id);
109   CAMLreturn ( Val_int(((TextCollection*) tc)->EmptyText((DocID) Int_val(id))));
110 }
111
112 extern "C" CAMLprim value caml_text_collection_is_contains(value tc,value str){
113   CAMLparam2(tc,str);
114   uchar * cstr = (uchar *) String_val(str);  
115   CAMLreturn ( Val_bool((int) ((TextCollection*) tc)->IsContains(cstr)));
116 }
117
118 extern "C" CAMLprim value caml_text_collection_count_contains(value tc,value str){
119   CAMLparam2(tc,str);
120   uchar * cstr = (uchar *) String_val(str);  
121   CAMLreturn ( Val_int(((TextCollection*) tc)->CountContains(cstr)));
122   
123 }
124
125 extern "C" CAMLprim value caml_text_collection_contains(value tc,value str){
126   CAMLparam2(tc,str);
127   CAMLlocal1(resarray);
128   uchar * cstr = (uchar *) String_val(str);  
129   std::vector<DocID> results;
130   results = ((TextCollection*) tc)->Contains(cstr);
131
132   resarray = caml_alloc_tuple(results.size());
133
134   for (int i=0; i<results.size();i++){
135     caml_initialize(&Field(resarray,i),Val_int(results[i]));
136   };
137   CAMLreturn (resarray);  
138 }
139
140
141 extern "C" CAMLprim value caml_xml_tree_root(value tree){
142   CAMLparam1(tree);
143   CAMLreturn (TREENODEVAL(XMLTREE(tree)->Root()));
144 }
145 extern "C" CAMLprim value caml_xml_tree_text_collection(value tree){
146   CAMLparam1(tree);
147   CAMLreturn((value) XMLTREE(tree)->getTextCollection());
148 }
149 extern "C" CAMLprim value caml_xml_tree_parent(value tree, value id){
150   CAMLparam2(tree,id);
151   CAMLreturn(Val_int (XMLTREE(tree)->Parent(TREENODEVAL(id))));
152 }
153 extern "C" CAMLprim value caml_xml_tree_parent_doc(value tree, value id){
154   CAMLparam2(tree,id);
155   CAMLreturn(Val_int (XMLTREE(tree)->ParentNode(TREENODEVAL(id))));
156 }
157
158 extern "C" CAMLprim value caml_xml_tree_is_ancestor(value tree,value id1, value id2) {
159   CAMLparam3(tree,id1,id2);
160   CAMLreturn(Val_bool (XMLTREE(tree)->IsAncestor(TREENODEVAL(id1),TREENODEVAL(id2))));
161 }
162
163 extern "C" CAMLprim value caml_xml_tree_serialize(value tree, value filename){
164   CAMLparam2(tree,filename);
165   NOT_IMPLEMENTED("caml_xml_tree_serialize");
166   CAMLreturn(Val_unit);
167 }
168
169 extern "C" CAMLprim value caml_xml_tree_unserialize(value filename){
170   CAMLparam1(filename);
171   NOT_IMPLEMENTED("caml_xml_tree_unserialize");
172   CAMLreturn(Val_unit);
173 }
174
175
176 extern "C" CAMLprim value caml_xml_tree_first_child(value tree, value id){
177   CAMLparam2(tree,id);
178   CAMLreturn(Val_int (XMLTREE(tree)->FirstChild(TREENODEVAL(id))));
179 }
180
181 extern "C" CAMLprim value caml_xml_tree_is_leaf(value tree, value id){
182   CAMLparam2(tree,id);
183   CAMLreturn(Val_bool (XMLTREE(tree)->IsLeaf(TREENODEVAL(id))));
184 }
185
186 extern "C" CAMLprim value caml_xml_tree_next_sibling(value tree, value id){
187   CAMLparam2(tree,id);
188   CAMLreturn(Val_int (XMLTREE(tree)->NextSibling(TREENODEVAL(id))));
189 }
190
191 extern "C" CAMLprim value caml_xml_tree_prev_text(value tree, value id){
192   CAMLparam2(tree,id);
193   CAMLlocal1(res);
194   CAMLreturn(Val_int((XMLTREE(tree)->PrevText(TREENODEVAL(id)))));
195   CAMLreturn(res);
196 }
197 extern "C" CAMLprim value caml_xml_tree_next_text(value tree, value id){
198   CAMLparam2(tree,id);
199   CAMLreturn(Val_int((XMLTREE(tree)->NextText(TREENODEVAL(id)))));
200 }
201 extern "C" CAMLprim value caml_xml_tree_my_text(value tree, value id){
202   CAMLparam2(tree,id);
203   CAMLreturn(Val_int((XMLTREE(tree)->MyText(TREENODEVAL(id)))));
204 }
205
206 extern "C" CAMLprim value caml_xml_tree_text_xml_id(value tree, value id){
207   CAMLparam2(tree,id);
208   CAMLreturn(Val_int((XMLTREE(tree)->TextXMLId(TREENODEVAL(id)))));
209 }
210 extern "C" CAMLprim value caml_xml_tree_node_xml_id(value tree, value id){
211   CAMLparam2(tree,id);
212   CAMLreturn(Val_int((XMLTREE(tree)->NodeXMLId(TREENODEVAL(id)))));
213 }
214 extern "C" CAMLprim value caml_xml_tree_tag(value tree, value id){
215   CAMLparam2(tree,id);
216   const char* tag;
217   tag =(const char*) XMLTREE(tree)->GetTagName(XMLTREE(tree)->Tag(TREENODEVAL(id)));
218
219   CAMLreturn (caml_copy_string(tag));
220 }
221 extern "C" CAMLprim value caml_xml_tree_tag_id(value tree,value id){
222   CAMLparam2(tree,id);
223   
224   int tag =XMLTREE(tree)->Tag(TREENODEVAL(id));
225
226   CAMLreturn (Val_unit);
227 }
228 extern "C" CAMLprim value caml_xml_tree_nullt(value unit){
229   CAMLparam1(unit);
230   CAMLreturn (NULLT);
231 }