X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=OCamlDriver.cpp;h=0d0a24cbbf04d8592ed95d566a31726428cacd65;hb=f0557f21878be17ddc75b1bc8f4f86da68c8e604;hp=a35cd75c922b4f7e13b1daad308e059880de5da5;hpb=04639fe524ee20f7f84c8b08387312d714c9bd56;p=SXSI%2Fxpathcomp.git diff --git a/OCamlDriver.cpp b/OCamlDriver.cpp index a35cd75..0d0a24c 100644 --- a/OCamlDriver.cpp +++ b/OCamlDriver.cpp @@ -1,31 +1,30 @@ /************************************** * 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 +#include +#include "XMLDocShredder.h" +#include "XMLTree.h" +#include "Utils.h" + extern "C" { +/* OCaml memory managment */ #include #include #include #include #include #include - - -} //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)) @@ -34,20 +33,19 @@ extern "C" { #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; @@ -56,7 +54,7 @@ extern "C" void caml_hset_finalize(value hblock){ extern "C" CAMLprim value caml_init_lib (value unit) { CAMLparam1(unit); if (!ops_initialized){ - + ops.identifier = (char*) "XMLTree"; ops.finalize = caml_xml_tree_finalize; @@ -64,6 +62,11 @@ extern "C" CAMLprim value caml_init_lib (value unit) { 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; @@ -154,7 +157,7 @@ extern "C" CAMLprim value caml_text_collection_get_text(value tree, value id){ 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); @@ -185,6 +188,7 @@ extern "C" CAMLprim value caml_text_collection_count(value tree,value 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); @@ -193,13 +197,16 @@ extern "C" CAMLprim value caml_text_collection_contains(value tree,value str){ std::vector 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; iParentNode((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)))); @@ -312,6 +318,10 @@ extern "C" CAMLprim value caml_xml_tree_subtree_tags(value tree,value id,value t 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); @@ -373,3 +383,32 @@ extern "C" CAMLprim value caml_xml_tree_doc_ids(value tree, value node){ 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)))); +} + +