Safety before Techfest
[SXSI/xpathcomp.git] / OCamlDriver.cpp
index e231a45..35d03b8 100644 (file)
@@ -25,11 +25,12 @@ extern "C" {
 #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
@@ -127,15 +128,15 @@ extern "C" CAMLprim value caml_xml_tree_save(value tree,value fd){
   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()); }
@@ -143,8 +144,6 @@ extern "C" CAMLprim value caml_xml_tree_load(value fd){
   catch (char const * msg){ CAMLRAISEMSG(msg);  };
 }
 
-
-
 extern "C" CAMLprim value caml_text_collection_get_text(value tree, value id){
   CAMLparam2(tree,id);
   CAMLlocal1(str);
@@ -188,13 +187,13 @@ extern "C" CAMLprim value caml_text_collection_count(value tree,value 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);
@@ -205,12 +204,65 @@ extern "C" CAMLprim value caml_text_collection_contains(value tree,value str){
   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);  
 }
 
 
@@ -248,8 +300,15 @@ extern "C" CAMLprim value caml_xml_tree_is_first_child(value tree, value id){
 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){
@@ -261,7 +320,7 @@ extern "C" CAMLprim value caml_xml_tree_next_sibling(value tree, value id){
 }
 
 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){
@@ -284,13 +343,18 @@ extern "C" CAMLprim value caml_xml_tree_tagged_foll(value tree, value id, value
 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)))));
 }
@@ -320,6 +384,10 @@ extern "C" CAMLprim value caml_xml_tree_subtree_size(value tree,value 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);
@@ -370,6 +438,11 @@ extern "C" CAMLprim value caml_xml_tree_select_foll_below(value tree, value 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){
@@ -382,31 +455,62 @@ 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));
+}
+