/**************************************
* OCamlDriver.cpp
* -------------------
- * A Test Ocaml Driver which calls the C++ methods and
+ * An Ocaml Driver which calls the C++ methods and
* adds a C wrapper interface with OCaml code.
*
* Author: Kim Nguyen
* Date: 04/11/08
*/
-/* OCaml memory managment */
+
+
#include <unordered_set>
+#include <algorithm>
+#include "XMLDocShredder.h"
+#include "XMLTree.h"
+#include "Utils.h"
+
extern "C" {
+/* OCaml memory managment */
#include <caml/mlvalues.h>
#include <caml/alloc.h>
#include <caml/memory.h>
#include <caml/callback.h>
#include <caml/fail.h>
#include <caml/custom.h>
-
-
-} //extern C
-
-
-//#include "TextCollection/TextCollection.h"
-#include "XMLDocShredder.h"
-#include "XMLTree.h"
-#include "Utils.h"
+#include "results.h"
#define CAMLRAISEMSG(msg) (caml_raise_with_string(*cpp_exception,(msg) ))
#define NOT_IMPLEMENTED(s) (caml_failwith(s))
#define TEXTCOLLECTION(x)
#define TREENODEVAL(i) ((treeNode) (Int_val(i)))
#define XMLTREE_ROOT 0
-
-
-
-extern "C" {
+
static struct custom_operations ops;
static struct custom_operations set_ops;
static value * cpp_exception = NULL;
static bool ops_initialized = false;
-
+
}
+
extern "C" void caml_xml_tree_finalize(value tree){
delete XMLTREE(tree);
return;
}
+
extern "C" void caml_hset_finalize(value hblock){
delete HSET(hblock);
return;
extern "C" CAMLprim value caml_init_lib (value unit) {
CAMLparam1(unit);
if (!ops_initialized){
-
+
ops.identifier = (char*) "XMLTree";
ops.finalize = caml_xml_tree_finalize;
set_ops.finalize = caml_hset_finalize;
cpp_exception = caml_named_value("CPlusPlusError");
+ if (cpp_exception == NULL){
+ string s = "FATAL: Unregistered exception ";
+ s += "CPlusPlusError";
+ caml_failwith(s.c_str());
+ };
ops_initialized = true;
CAMLlocal1(str);
uchar* txt = XMLTREE(tree)->GetText((DocID) Int_val(id));
str = caml_copy_string((const char*)txt);
- delete (txt);
CAMLreturn (str);
}
extern "C" CAMLprim value caml_text_collection_get_cached_text(value tree, value id){
CAMLparam2(tree,id);
CAMLlocal1(str);
- char* txt = (char*) XMLTREE(tree)->GetCachedText((DocID) Int_val(id));
+ char* txt = (char*) XMLTREE(tree)->GetText((DocID) Int_val(id));
str = caml_copy_string(txt);
- free(txt);
CAMLreturn (str);
}
CAMLreturn (Val_unit);
}
+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);
std::vector<DocID> results;
results = XMLTREE(tree)->Contains(cstr);
//free(cstr);
- resarray = caml_alloc_tuple(results.size());
+ std::sort(results.begin(), results.end(), docId_comp);
+ size_t s = results.size();
+ resarray = caml_alloc_tuple(s);
- for (unsigned int i=0; i<results.size();i++){
+ 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);
uchar * cstr = (uchar *) String_val(str);
return (Val_int (XMLTREE(tree)->ParentNode((DocID) Int_val(id))));
}
-
extern "C" CAMLprim value caml_xml_tree_is_ancestor(value tree,value id1, value id2) {
CAMLparam3(tree,id1,id2);
CAMLreturn(Val_bool (XMLTREE(tree)->IsAncestor(TREENODEVAL(id1),TREENODEVAL(id2))));
return (Val_int(XMLTREE(tree)->SubtreeTags(TREENODEVAL(id),Int_val(tag))));
}
+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_register_tag(value tree,value str){
CAMLparam2(tree,str);
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));
+ CAMLreturn (Val_unit);
+}
+
+extern "C" CAMLprim value caml_result_set_clear(value result,value p1,value p2){
+ CAMLparam3(result,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))));
+}
+
+