X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=OCamlDriver.cpp;h=85cc8137155f39ebab0e66bfb1a71df4b1d1b907;hb=329088598ab63bc2d67ff0dfc4f54e90f5d4f283;hp=0d0a24cbbf04d8592ed95d566a31726428cacd65;hpb=f0557f21878be17ddc75b1bc8f4f86da68c8e604;p=SXSI%2Fxpathcomp.git diff --git a/OCamlDriver.cpp b/OCamlDriver.cpp index 0d0a24c..85cc813 100644 --- a/OCamlDriver.cpp +++ b/OCamlDriver.cpp @@ -25,11 +25,12 @@ extern "C" { #include #include #include "results.h" +#include #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*)((* (XMLTree**) Data_custom_val(x)))) +#define HSET(x) ((std::unordered_set*)((* (std::unordered_set**) Data_custom_val(x)))) #define TEXTCOLLECTION(x) #define TREENODEVAL(i) ((treeNode) (Int_val(i))) #define XMLTREE_ROOT 0 @@ -143,14 +144,11 @@ 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); uchar* txt = XMLTREE(tree)->GetText((DocID) Int_val(id)); str = caml_copy_string((const char*)txt); - delete (txt); CAMLreturn (str); } @@ -159,7 +157,6 @@ extern "C" CAMLprim value caml_text_collection_get_cached_text(value tree, value CAMLlocal1(str); char* txt = (char*) XMLTREE(tree)->GetText((DocID) Int_val(id)); str = caml_copy_string(txt); - free(txt); CAMLreturn (str); } @@ -250,8 +247,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){ @@ -263,7 +267,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){ @@ -286,13 +290,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))))); } @@ -322,6 +331,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); @@ -372,6 +385,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){ @@ -384,31 +402,55 @@ 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_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)); +} +