+
+extern "C" CAMLprim value caml_xml_tree_register_tag(value tree,value str){
+ CAMLparam2(tree,str);
+ CAMLlocal1(id);
+ unsigned char* tag;
+ tag = (unsigned char*) (String_val(str));
+ id = Val_int(XMLTREE(tree)->RegisterTag(tag));
+ CAMLreturn (id);
+}
+
+extern "C" CAMLprim value caml_xml_tree_nullt(value unit){
+ return (NULLT);
+}
+
+extern "C" CAMLprim value caml_unordered_set_length(value hset){
+ CAMLparam1(hset);
+ CAMLreturn (Val_int((HSET(hset))->size()));
+}
+
+extern "C" CAMLprim value caml_unordered_set_alloc(value len){
+ CAMLparam1(len);
+ CAMLlocal1(hset);
+ hset = caml_alloc_custom(&set_ops,sizeof(std::unordered_set<int>*),1,2);
+ std::unordered_set<int>* ht = new std::unordered_set<int>();
+ memcpy(Data_custom_val(hset),&ht,sizeof(std::unordered_set<int>*));
+ CAMLreturn (hset);
+}
+
+extern "C" CAMLprim value caml_unordered_set_set(value vec, value v){
+ HSET(vec)->insert((int) Int_val(v));
+ return (Val_unit);
+}
+
+extern "C" CAMLprim value caml_xml_tree_select_desc(value tree, value node, value tags){
+ return (Val_int (XMLTREE(tree)->SelectDesc(TREENODEVAL(node),
+ HSET(tags))));
+}
+extern "C" CAMLprim value caml_xml_tree_select_child(value tree, value node, value tags){
+ return (Val_int (XMLTREE(tree)->SelectChild(TREENODEVAL(node),
+ HSET(tags))));
+}
+extern "C" CAMLprim value caml_xml_tree_select_foll_sibling(value tree, value node, value tags){
+ return (Val_int (XMLTREE(tree)->SelectFollSibling(TREENODEVAL(node),
+ HSET(tags))));
+}
+extern "C" CAMLprim value caml_xml_tree_select_foll_below(value tree, value node, value tags,value ctx){
+ return (Val_int (XMLTREE(tree)->SelectFollBelow(TREENODEVAL(node),
+ HSET(tags),
+ TREENODEVAL(ctx))));
+}
+
+
+extern "C" CAMLprim value caml_xml_tree_doc_ids(value tree, value node){
+ CAMLparam2(tree,node);
+ CAMLlocal1(tuple);
+ tuple = caml_alloc_tuple(2);
+ range r = (XMLTREE(tree)->DocIds(TREENODEVAL(node)));
+ caml_initialize(&Field(tuple,0),Val_int(r.min));
+ caml_initialize(&Field(tuple,1),Val_int(r.max));
+ CAMLreturn (tuple);
+}
+
+extern "C" CAMLprim value caml_result_set_create(value size){
+ CAMLparam1(size);
+ results* res = (results*) malloc(sizeof(results));
+ results r = createResults (Int_val(size));
+ res->n = r.n;
+ res->lgn = r.lgn;
+ res->tree = r.tree;
+ CAMLreturn ((value) (res));
+}
+
+extern "C" CAMLprim value caml_result_set_set(value result,value p){
+ CAMLparam2(result,p);
+ setResult ( *((results*) result), Int_val(p));