#include <caml/fail.h>
#include <caml/custom.h>
#include "results.h"
+#include <stdio.h>
#define CAMLRAISEMSG(msg) (caml_raise_with_string(*cpp_exception,(msg) ))
#define NOT_IMPLEMENTED(s) (caml_failwith(s))
#define XMLTREE(x) ((XMLTree *)(* (XMLTree**) Data_custom_val(x)))
-#define HSET(x) ((std::unordered_set<int>*)((* (XMLTree**) Data_custom_val(x))))
+#define HSET(x) ((std::unordered_set<int>*)((* (std::unordered_set<int>**) Data_custom_val(x))))
#define TEXTCOLLECTION(x)
#define TREENODEVAL(i) ((treeNode) (Int_val(i)))
#define XMLTREE_ROOT 0
CAMLreturn (Val_unit);
}
-extern "C" CAMLprim value caml_xml_tree_load(value fd){
- CAMLparam1(fd);
+extern "C" CAMLprim value caml_xml_tree_load(value fd, value load_tc,value sf){
+ CAMLparam3(fd,load_tc,sf);
CAMLlocal1(doc);
XMLTree * tree;
try {
- tree = XMLTree::Load(Int_val(fd));
- doc = caml_alloc_custom(&ops,sizeof(XMLTree*),1,2);
- memcpy(Data_custom_val(doc),&tree,sizeof(XMLTree*));
- CAMLreturn(doc);
+ tree = XMLTree::Load(Int_val(fd),Bool_val(load_tc),Int_val(sf));
+ doc = caml_alloc_custom(&ops,sizeof(XMLTree*),1,2);
+ memcpy(Data_custom_val(doc),&tree,sizeof(XMLTree*));
+ CAMLreturn(doc);
}
catch (const xmlpp::internal_error& e){ CAMLRAISEMSG(e.what()); }
catch (const std::exception& e){ CAMLRAISEMSG(e.what()); }
catch (char const * msg){ CAMLRAISEMSG(msg); };
}
-
-
extern "C" CAMLprim value caml_text_collection_get_text(value tree, value id){
CAMLparam2(tree,id);
CAMLlocal1(str);
uchar* txt = XMLTREE(tree)->GetText((DocID) Int_val(id));
str = caml_copy_string((const char*)txt);
- delete (txt);
CAMLreturn (str);
}
CAMLlocal1(str);
char* txt = (char*) XMLTREE(tree)->GetText((DocID) Int_val(id));
str = caml_copy_string(txt);
- free(txt);
CAMLreturn (str);
}
}
bool docId_comp(DocID x, DocID y) { return x < y; };
+
extern "C" CAMLprim value caml_text_collection_contains(value tree,value str){
CAMLparam2(tree,str);
CAMLlocal1(resarray);
uchar * cstr = (uchar *) String_val(str);
std::vector<DocID> results;
results = XMLTREE(tree)->Contains(cstr);
- //free(cstr);
std::sort(results.begin(), results.end(), docId_comp);
size_t s = results.size();
resarray = caml_alloc_tuple(s);
CAMLreturn (resarray);
}
+extern "C" CAMLprim value caml_text_collection_equals(value tree,value str){
+ CAMLparam2(tree,str);
+ CAMLlocal1(resarray);
+ uchar * cstr = (uchar *) String_val(str);
+ std::vector<DocID> results;
+ results = XMLTREE(tree)->Equal(cstr);
+ std::sort(results.begin(), results.end(), docId_comp);
+ size_t s = results.size();
+ resarray = caml_alloc_tuple(s);
+
+ for (size_t i = 0; i < s ;i++){
+ caml_initialize(&Field(resarray,i),Val_int(results[i]));
+ };
+ CAMLreturn (resarray);
+}
+extern "C" CAMLprim value caml_text_collection_startswith(value tree,value str){
+ CAMLparam2(tree,str);
+ CAMLlocal1(resarray);
+ uchar * cstr = (uchar *) String_val(str);
+ std::vector<DocID> results;
+ results = XMLTREE(tree)->Prefix(cstr);
+ std::sort(results.begin(), results.end(), docId_comp);
+ size_t s = results.size();
+ resarray = caml_alloc_tuple(s);
+
+ for (size_t i = 0; i < s ;i++){
+ caml_initialize(&Field(resarray,i),Val_int(results[i]));
+ };
+ CAMLreturn (resarray);
+}
+extern "C" CAMLprim value caml_text_collection_endswith(value tree,value str){
+ CAMLparam2(tree,str);
+ CAMLlocal1(resarray);
+ uchar * cstr = (uchar *) String_val(str);
+ std::vector<DocID> results;
+ results = XMLTREE(tree)->Suffix(cstr);
+ std::sort(results.begin(), results.end(), docId_comp);
+ size_t s = results.size();
+ resarray = caml_alloc_tuple(s);
+
+ for (size_t i = 0; i < s ;i++){
+ caml_initialize(&Field(resarray,i),Val_int(results[i]));
+ };
+ CAMLreturn (resarray);
+}
+
+
+
extern "C" CAMLprim value caml_text_collection_unsorted_contains(value tree,value str){
CAMLparam2(tree,str);
+ CAMLlocal1(resarray);
uchar * cstr = (uchar *) String_val(str);
std::vector<DocID> results;
results = XMLTREE(tree)->Contains(cstr);
- CAMLreturn (Val_unit);
+ resarray = caml_alloc_tuple(results.size());
+ for (size_t i = 0; i < results.size() ;i++){
+ caml_initialize(&Field(resarray,i),Val_int(results[i]));
+ };
+ CAMLreturn (resarray);
}
extern "C" CAMLprim value caml_xml_tree_first_child(value tree, value id){
return(Val_int (XMLTREE(tree)->FirstChild(TREENODEVAL(id))));
}
+extern "C" CAMLprim value caml_xml_tree_closing(value tree, value id){
+ return(Val_int (XMLTREE(tree)->Closing(TREENODEVAL(id))));
+}
+extern "C" CAMLprim value caml_xml_tree_is_open(value tree, value id){
+ return(Val_bool (XMLTREE(tree)->IsOpen(TREENODEVAL(id))));
+}
+
extern "C" CAMLprim value caml_xml_tree_first_element(value tree, value id){
- return(Val_int (XMLTREE(tree)->FirstElement(TREENODEVAL(id))));
+ return(Val_int (XMLTREE(Field(tree,0))->FirstElement(TREENODEVAL(id))));
}
extern "C" CAMLprim value caml_xml_tree_tagged_child(value tree, value id, value tag){
}
extern "C" CAMLprim value caml_xml_tree_next_element(value tree, value id){
- return(Val_int (XMLTREE(tree)->NextSibling(TREENODEVAL(id))));
+ return(Val_int (XMLTREE(Field(tree,0))->NextElement(TREENODEVAL(id))));
}
extern "C" CAMLprim value caml_xml_tree_tagged_sibling(value tree, value id, value tag){
extern "C" CAMLprim value caml_xml_tree_tagged_foll_below(value tree, value id, value tag,value root){
return(Val_int (XMLTREE(tree)->TaggedFollBelow(TREENODEVAL(id),(TagType) Int_val(tag),TREENODEVAL(root))));
}
-
-
+extern "C" CAMLprim value caml_xml_tree_tagged_foll_before(value tree, value id, value tag,value root){
+ return(Val_int (XMLTREE(tree)->TaggedFollBefore(TREENODEVAL(id),(TagType) Int_val(tag),TREENODEVAL(root))));
+}
extern "C" CAMLprim value caml_xml_tree_my_text(value tree, value id){
return(Val_int((XMLTREE(tree)->MyText(TREENODEVAL(id)))));
}
+extern "C" CAMLprim value caml_xml_tree_my_text_unsafe(value tree, value id){
+ return(Val_int((XMLTREE(tree)->MyTextUnsafe(TREENODEVAL(id)))));
+}
+
extern "C" CAMLprim value caml_xml_tree_text_xml_id(value tree, value id){
return(Val_int((XMLTREE(tree)->TextXMLId(TREENODEVAL(id)))));
}
return (Val_int(XMLTREE(tree)->SubtreeSize(TREENODEVAL(id))));
}
+extern "C" CAMLprim value caml_xml_tree_subtree_elements(value tree,value id){
+ return (Val_int(XMLTREE(tree)->SubtreeElements(TREENODEVAL(id))));
+}
+
extern "C" CAMLprim value caml_xml_tree_register_tag(value tree,value str){
CAMLparam2(tree,str);
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){
CAMLreturn (tuple);
}
-extern "C" CAMLprim value caml_result_set_create(value size){
- CAMLparam1(size);
+extern "C" value caml_result_set_create(value size){
results* res = (results*) malloc(sizeof(results));
- results r = createResults (Int_val(size));
+ results r = createResults (Int_val(size));
res->n = r.n;
res->lgn = r.lgn;
res->tree = r.tree;
- CAMLreturn ((value) (res));
+ return ((value) (res));
}
extern "C" CAMLprim value caml_result_set_set(value result,value p){
- CAMLparam2(result,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){
- CAMLparam3(result,p1,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){
- CAMLparam2(result,p);
- CAMLreturn (Val_int(nextResult(*((results*) result), Int_val(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));
+}
+