X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=OCamlDriver.cpp;h=e2c6f00b459eb899135e374b19ee8ebec14be0f0;hb=d550133ad7afdf65c5e284c2bcf67a5bdde6faa7;hp=a35cd75c922b4f7e13b1daad308e059880de5da5;hpb=04639fe524ee20f7f84c8b08387312d714c9bd56;p=SXSI%2Fxpathcomp.git diff --git a/OCamlDriver.cpp b/OCamlDriver.cpp index a35cd75..e2c6f00 100644 --- a/OCamlDriver.cpp +++ b/OCamlDriver.cpp @@ -1,16 +1,23 @@ /************************************** * 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 @@ -19,14 +26,6 @@ extern "C" { #include -} //extern C - - -//#include "TextCollection/TextCollection.h" -#include "XMLDocShredder.h" -#include "XMLTree.h" -#include "Utils.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))) @@ -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; @@ -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))));