+ 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_select_foll_before(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" value caml_result_set_create(value 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;
+ return ((value) (res));
+}
+
+extern "C" CAMLprim value caml_result_set_set(value result,value p){
+ CAMLparam1(p);
+ setResult ( *((results*) result), Int_val(p));
+ CAMLreturn (Val_unit);
+}
+
+extern "C" CAMLprim value caml_result_set_clear(value result,value p1,value p2){
+ CAMLparam2(p1,p2);
+ clearRange ( *((results*) result), Int_val(p1), Int_val(p2));
+ CAMLreturn (Val_unit);
+}
+
+extern "C" CAMLprim value caml_result_set_next(value result,value p){
+ CAMLparam1(p);
+ results r;
+ r = *( (results *) result);
+ CAMLreturn (Val_int(nextResult(r, Int_val(p))));
+}
+
+extern "C" CAMLprim value caml_result_set_count(value result){
+ CAMLparam0();
+ results r;
+ r = *( (results *) result);
+ CAMLreturn (Val_int(countResult(r)));
+}
+
+extern "C" CAMLprim value caml_xml_tree_print(value tree,value node,value fd){
+ CAMLparam3(tree,node,fd);
+ XMLTREE(tree)->Print(Int_val(fd),TREENODEVAL(node));
+ CAMLreturn(Val_unit);
+}
+
+extern "C" CAMLprim value caml_set_tag_bits(value result, value tag, value tree, value node)
+{
+ CAMLparam3(tag,tree,node);
+ results r;
+ XMLTree *t = XMLTREE(Field(tree,0));
+ treeNode opening = TREENODEVAL(node);
+ treeNode closing = t->Closing(opening);
+ TagType target_tag = Int_val(tag);
+ treeNode first = t->TaggedDesc(opening,target_tag);
+ r = *( (results *) result);
+ opening = first;
+ while (opening != NULLT){
+ setResult(r,opening);
+ opening = t->TaggedFollBefore(opening,target_tag,closing);
+ };
+ CAMLreturn(Val_int(first));