1 /**************************************
4 * A Test Ocaml Driver which calls the C++ methods and
5 * adds a C wrapper interface with OCaml code.
11 /* OCaml memory managment */
12 #include <unordered_set>
14 #include <caml/mlvalues.h>
15 #include <caml/alloc.h>
16 #include <caml/memory.h>
17 #include <caml/callback.h>
18 #include <caml/fail.h>
19 #include <caml/custom.h>
25 //#include "TextCollection/TextCollection.h"
26 #include "XMLDocShredder.h"
30 #define CAMLRAISEMSG(msg) (caml_raise_with_string(*cpp_exception,(msg) ))
31 #define NOT_IMPLEMENTED(s) (caml_failwith(s))
32 #define XMLTREE(x) ((XMLTree *)(* (XMLTree**) Data_custom_val(x)))
33 #define HSET(x) ((std::unordered_set<int>*)((* (XMLTree**) Data_custom_val(x))))
34 #define TEXTCOLLECTION(x)
35 #define TREENODEVAL(i) ((treeNode) (Int_val(i)))
36 #define XMLTREE_ROOT 0
41 static struct custom_operations ops;
42 static struct custom_operations set_ops;
43 static value * cpp_exception = NULL;
44 static bool ops_initialized = false;
47 extern "C" void caml_xml_tree_finalize(value tree){
51 extern "C" void caml_hset_finalize(value hblock){
56 extern "C" CAMLprim value caml_init_lib (value unit) {
58 if (!ops_initialized){
61 ops.identifier = (char*) "XMLTree";
62 ops.finalize = caml_xml_tree_finalize;
63 set_ops.identifier = (char*) "unordered_set";
64 set_ops.finalize = caml_hset_finalize;
66 cpp_exception = caml_named_value("CPlusPlusError");
68 ops_initialized = true;
74 extern "C" CAMLprim value caml_shredder_parse(XMLDocShredder *shredder){
78 shredder->processStartDocument("");
80 shredder->processEndDocument();
81 doc = caml_alloc_custom(&ops,sizeof(XMLTree*),1,2);
82 tree = (XMLTree *) shredder->getXMLTree();
83 memcpy(Data_custom_val(doc),&tree,sizeof(XMLTree*));
88 extern "C" CAMLprim value caml_call_shredder_uri(value uri,value sf, value iet, value dtc){
91 char *fn = String_val(uri);
92 XMLDocShredder * shredder;
94 shredder = new XMLDocShredder(fn,Int_val(sf),Bool_val(iet),Bool_val(dtc));
95 doc = caml_shredder_parse(shredder);
98 catch (const std::exception& e){ CAMLRAISEMSG(e.what()); }
99 catch (string msg){ CAMLRAISEMSG(msg.c_str()); }
100 catch (char const * msg){ CAMLRAISEMSG(msg); };
104 extern "C" CAMLprim value caml_call_shredder_string(value data,value sf, value iet, value dtc){
107 XMLDocShredder * shredder;
108 unsigned int ln = string_length(data);
109 unsigned char *fn = (unsigned char*) String_val(data);
111 shredder = new XMLDocShredder (fn,ln,Int_val(sf),Bool_val(iet),Bool_val(dtc));
112 doc = caml_shredder_parse(shredder);
115 catch (const std::exception& e){ CAMLRAISEMSG(e.what()); }
116 catch (string msg){ CAMLRAISEMSG(msg.c_str()); }
117 catch (char const * msg){ CAMLRAISEMSG(msg); };
121 extern "C" CAMLprim value caml_xml_tree_save(value tree,value fd){
123 XMLTREE(tree)->Save(Int_val(fd));
124 CAMLreturn (Val_unit);
127 extern "C" CAMLprim value caml_xml_tree_load(value fd){
132 tree = XMLTree::Load(Int_val(fd));
133 doc = caml_alloc_custom(&ops,sizeof(XMLTree*),1,2);
134 memcpy(Data_custom_val(doc),&tree,sizeof(XMLTree*));
137 catch (const xmlpp::internal_error& e){ CAMLRAISEMSG(e.what()); }
138 catch (const std::exception& e){ CAMLRAISEMSG(e.what()); }
139 catch (string msg){ CAMLRAISEMSG(msg.c_str()); }
140 catch (char const * msg){ CAMLRAISEMSG(msg); };
145 extern "C" CAMLprim value caml_text_collection_get_text(value tree, value id){
148 uchar* txt = XMLTREE(tree)->GetText((DocID) Int_val(id));
149 str = caml_copy_string((const char*)txt);
154 extern "C" CAMLprim value caml_text_collection_get_cached_text(value tree, value id){
157 char* txt = (char*) XMLTREE(tree)->GetCachedText((DocID) Int_val(id));
158 str = caml_copy_string(txt);
164 extern "C" CAMLprim value caml_text_collection_empty_text(value tree,value id){
166 CAMLreturn ( Val_int((XMLTREE(tree))->EmptyText((DocID) Int_val(id))));
169 extern "C" CAMLprim value caml_text_collection_is_contains(value tree,value str){
170 CAMLparam2(tree,str);
171 uchar * cstr = (uchar *) String_val(str);
172 CAMLreturn ( Val_bool((int) XMLTREE(tree)->IsContains(cstr)));
175 extern "C" CAMLprim value caml_text_collection_count_contains(value tree,value str){
176 CAMLparam2(tree,str);
177 uchar * cstr = (uchar *) String_val(str);
178 CAMLreturn (Val_int((XMLTREE(tree)->CountContains(cstr))));
181 extern "C" CAMLprim value caml_text_collection_count(value tree,value str){
182 CAMLparam2(tree,str);
183 uchar * cstr = (uchar *) String_val(str);
184 CAMLreturn (Val_int((XMLTREE(tree)->Count(cstr))));
185 CAMLreturn (Val_unit);
189 extern "C" CAMLprim value caml_text_collection_contains(value tree,value str){
190 CAMLparam2(tree,str);
191 CAMLlocal1(resarray);
192 uchar * cstr = (uchar *) String_val(str);
193 std::vector<DocID> results;
194 results = XMLTREE(tree)->Contains(cstr);
196 resarray = caml_alloc_tuple(results.size());
198 for (unsigned int i=0; i<results.size();i++){
199 caml_initialize(&Field(resarray,i),Val_int(results[i]));
201 CAMLreturn (resarray);
203 extern "C" CAMLprim value caml_text_collection_unsorted_contains(value tree,value str){
204 CAMLparam2(tree,str);
205 uchar * cstr = (uchar *) String_val(str);
206 std::vector<DocID> results;
207 results = XMLTREE(tree)->Contains(cstr);
208 CAMLreturn (Val_unit);
212 extern "C" CAMLprim value caml_xml_tree_root(value tree){
214 CAMLreturn (Val_int(TREENODEVAL(XMLTREE_ROOT)));
216 extern "C" CAMLprim value caml_xml_tree_text_collection(value tree){
218 CAMLreturn((value) XMLTREE(tree)->getTextCollection());
220 extern "C" CAMLprim value caml_xml_tree_parent(value tree, value id){
221 return(Val_int (XMLTREE(tree)->Parent(TREENODEVAL(id))));
223 extern "C" CAMLprim value caml_xml_tree_prev_sibling(value tree, value id){
224 return(Val_int (XMLTREE(tree)->PrevSibling(TREENODEVAL(id))));
227 extern "C" CAMLprim value caml_xml_tree_parent_doc(value tree, value id){
228 return (Val_int (XMLTREE(tree)->ParentNode((DocID) Int_val(id))));
232 extern "C" CAMLprim value caml_xml_tree_is_ancestor(value tree,value id1, value id2) {
233 CAMLparam3(tree,id1,id2);
234 CAMLreturn(Val_bool (XMLTREE(tree)->IsAncestor(TREENODEVAL(id1),TREENODEVAL(id2))));
237 extern "C" CAMLprim value caml_xml_tree_last_child(value tree, value id){
238 return(Val_int (XMLTREE(tree)->LastChild(TREENODEVAL(id))));
241 extern "C" CAMLprim value caml_xml_tree_is_first_child(value tree, value id){
242 return Val_bool (XMLTREE(tree)->IsFirstChild(TREENODEVAL(id)));
244 extern "C" CAMLprim value caml_xml_tree_first_child(value tree, value id){
245 return(Val_int (XMLTREE(tree)->FirstChild(TREENODEVAL(id))));
247 extern "C" CAMLprim value caml_xml_tree_first_element(value tree, value id){
248 return(Val_int (XMLTREE(tree)->FirstElement(TREENODEVAL(id))));
251 extern "C" CAMLprim value caml_xml_tree_tagged_child(value tree, value id, value tag){
252 return(Val_int (XMLTREE(tree)->TaggedChild(TREENODEVAL(id),Int_val(tag))));
255 extern "C" CAMLprim value caml_xml_tree_next_sibling(value tree, value id){
256 return(Val_int (XMLTREE(tree)->NextSibling(TREENODEVAL(id))));
259 extern "C" CAMLprim value caml_xml_tree_next_element(value tree, value id){
260 return(Val_int (XMLTREE(tree)->NextSibling(TREENODEVAL(id))));
263 extern "C" CAMLprim value caml_xml_tree_tagged_sibling(value tree, value id, value tag){
264 return(Val_int (XMLTREE(tree)->TaggedFollSibling(TREENODEVAL(id),Int_val(tag))));
268 extern "C" CAMLprim value caml_xml_tree_is_leaf(value tree, value id){
269 return(Val_bool (XMLTREE(tree)->IsLeaf(TREENODEVAL(id))));
272 extern "C" CAMLprim value caml_xml_tree_tagged_desc(value tree, value id, value tag){
273 return(Val_int (XMLTREE(tree)->TaggedDesc(TREENODEVAL(id),(TagType) Int_val(tag))));
277 extern "C" CAMLprim value caml_xml_tree_tagged_foll(value tree, value id, value tag){
278 return(Val_int (XMLTREE(tree)->TaggedFoll(TREENODEVAL(id),(TagType) Int_val(tag))));
280 extern "C" CAMLprim value caml_xml_tree_tagged_foll_below(value tree, value id, value tag,value root){
281 return(Val_int (XMLTREE(tree)->TaggedFollBelow(TREENODEVAL(id),(TagType) Int_val(tag),TREENODEVAL(root))));
286 extern "C" CAMLprim value caml_xml_tree_my_text(value tree, value id){
287 return(Val_int((XMLTREE(tree)->MyText(TREENODEVAL(id)))));
290 extern "C" CAMLprim value caml_xml_tree_text_xml_id(value tree, value id){
291 return(Val_int((XMLTREE(tree)->TextXMLId(TREENODEVAL(id)))));
293 extern "C" CAMLprim value caml_xml_tree_node_xml_id(value tree, value id){
294 return(Val_int((XMLTREE(tree)->NodeXMLId(TREENODEVAL(id)))));
297 extern "C" CAMLprim value caml_xml_tree_tag_name(value tree, value tagid){
298 CAMLparam2(tree,tagid);
301 tag = (char*) XMLTREE(tree)->GetTagNameByRef((TagType) (Int_val(tagid)));
302 str = caml_copy_string((const char*) tag);
307 extern "C" CAMLprim value caml_xml_tree_tag_id(value tree,value id){
308 return (Val_int(XMLTREE(tree)->Tag(TREENODEVAL(id))));
311 extern "C" CAMLprim value caml_xml_tree_subtree_tags(value tree,value id,value tag){
312 return (Val_int(XMLTREE(tree)->SubtreeTags(TREENODEVAL(id),Int_val(tag))));
316 extern "C" CAMLprim value caml_xml_tree_register_tag(value tree,value str){
317 CAMLparam2(tree,str);
320 tag = (unsigned char*) (String_val(str));
321 id = Val_int(XMLTREE(tree)->RegisterTag(tag));
325 extern "C" CAMLprim value caml_xml_tree_nullt(value unit){
329 extern "C" CAMLprim value caml_unordered_set_length(value hset){
331 CAMLreturn (Val_int((HSET(hset))->size()));
334 extern "C" CAMLprim value caml_unordered_set_alloc(value len){
337 hset = caml_alloc_custom(&set_ops,sizeof(std::unordered_set<int>*),1,2);
338 std::unordered_set<int>* ht = new std::unordered_set<int>();
339 memcpy(Data_custom_val(hset),&ht,sizeof(std::unordered_set<int>*));
343 extern "C" CAMLprim value caml_unordered_set_set(value vec, value v){
344 HSET(vec)->insert((int) Int_val(v));
348 extern "C" CAMLprim value caml_xml_tree_select_desc(value tree, value node, value tags){
349 return (Val_int (XMLTREE(tree)->SelectDesc(TREENODEVAL(node),
352 extern "C" CAMLprim value caml_xml_tree_select_child(value tree, value node, value tags){
353 return (Val_int (XMLTREE(tree)->SelectChild(TREENODEVAL(node),
356 extern "C" CAMLprim value caml_xml_tree_select_foll_sibling(value tree, value node, value tags){
357 return (Val_int (XMLTREE(tree)->SelectFollSibling(TREENODEVAL(node),
360 extern "C" CAMLprim value caml_xml_tree_select_foll_below(value tree, value node, value tags,value ctx){
361 return (Val_int (XMLTREE(tree)->SelectFollBelow(TREENODEVAL(node),
367 extern "C" CAMLprim value caml_xml_tree_doc_ids(value tree, value node){
368 CAMLparam2(tree,node);
370 tuple = caml_alloc_tuple(2);
371 range r = (XMLTREE(tree)->DocIds(TREENODEVAL(node)));
372 caml_initialize(&Field(tuple,0),Val_int(r.min));
373 caml_initialize(&Field(tuple,1),Val_int(r.max));