X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=OCamlDriver.cpp;h=39190d6693eba1ba22175df906ca1448116b44bc;hb=1b4d4c7a0537d30e21068f06535c5d3a1af92f88;hp=8f841945b40c9c91d03b85a164fc9ce145e95ffb;hpb=1ff2494510cb02d136cbde3a064c0c8c94ec4216;p=SXSI%2Fxpathcomp.git diff --git a/OCamlDriver.cpp b/OCamlDriver.cpp index 8f84194..39190d6 100644 --- a/OCamlDriver.cpp +++ b/OCamlDriver.cpp @@ -117,7 +117,7 @@ extern "C" value caml_call_shredder_string(value data,value sf, value iet, valu CAMLparam1(data); CAMLlocal1(doc); XMLDocShredder * shredder; - unsigned int ln = string_length(data); + unsigned int ln = caml_string_length(data); unsigned char *fn = (unsigned char*) String_val(data); try { shredder = new XMLDocShredder (fn,ln,Int_val(sf),Bool_val(iet),Bool_val(dtc)); @@ -130,18 +130,18 @@ extern "C" value caml_call_shredder_string(value data,value sf, value iet, valu CAMLreturn(doc); } -extern "C" value caml_xml_tree_save(value tree,value fd){ - CAMLparam2(tree,fd); - XMLTREE(tree)->Save(Int_val(fd)); +extern "C" value caml_xml_tree_save(value tree,value fd, value str){ + CAMLparam3(tree,fd,str); + XMLTREE(tree)->Save(Int_val(fd), String_val(str)); CAMLreturn (Val_unit); } -extern "C" value caml_xml_tree_load(value fd, value load_tc,value sf){ - CAMLparam3(fd,load_tc,sf); +extern "C" value caml_xml_tree_load(value fd, value str, value load_tc,value sf){ + CAMLparam4(fd,str,load_tc,sf); CAMLlocal1(doc); XMLTree * tree; try { - tree = XMLTree::Load(Int_val(fd),Bool_val(load_tc),Int_val(sf)); + tree = XMLTree::Load(Int_val(fd),String_val(str),Bool_val(load_tc),Int_val(sf)); printf("Pointer to tree is %p\n", (void*) tree); doc = caml_alloc_custom(&ops,sizeof(XMLTree*),1,2); memcpy(Data_custom_val(doc),&tree,sizeof(XMLTree*)); @@ -255,13 +255,14 @@ extern "C" value caml_text_collection_count_lessthan(value tree,value str){ } static value sort_alloc_array(std::vector results, value resarray){ - std::sort(results.begin(), results.end(), docId_comp); + 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])); }; - return resarray; + return resarray; + } /** @@ -429,6 +430,10 @@ NoAlloc extern "C" value caml_xml_tree_size(value tree){ return (Val_int(XMLTREE(tree)->Size())); } +NoAlloc extern "C" value caml_xml_tree_num_tags(value tree){ + return (Val_int(XMLTREE(tree)->NumTags())); +} + NoAlloc extern "C" value caml_xml_tree_subtree_size(value tree, value node){ return (Val_int(XMLTREE(tree)->SubtreeSize(TREENODEVAL(node)))); } @@ -695,7 +700,7 @@ NoAlloc extern "C" value caml_result_set_count(value result){ NoAlloc extern "C" value caml_xml_tree_print(value tree,value node,value fd){ CAMLparam3(tree,node,fd); - XMLTREE(tree)->Print(Int_val(fd),TREENODEVAL(node)); + XMLTREE(tree)->Print(Int_val(fd),TREENODEVAL(node), false); CAMLreturn(Val_unit); } @@ -773,8 +778,10 @@ int iterjump(XMLTree* tree, treeNode node, TagType tag, treeNode anc){ if (node == NULLT) return 0; else { - return /*1+iterjump(tree,tree->TaggedDescendant(node,tag),tag,node) - +*/ iterjump(tree,tree->TaggedFollowingBelow(node,tag,anc),tag,anc); + return + 1 + + iterjump(tree,tree->TaggedDescendant(node,tag),tag,node) + + iterjump(tree,tree->TaggedFollowingBelow(node,tag,anc),tag,anc); }; } @@ -783,31 +790,43 @@ extern "C" value caml_benchmark_jump(value tree,value tag){ treeNode root = XMLTREE(tree)->FirstChild(0); root = XMLTREE(tree)->FirstChild(root); count = iterjump(XMLTREE(tree), root , Int_val(tag),0); - return Val_unit; + return Val_int(count); } int iterfcns(XMLTree* tree, treeNode node){ if (node == NULLT) return 0; else { - return /*1+ iterfcns(tree,tree->FirstChild(node)) +*/ - iterfcns(tree,tree->NextSibling(node)); + int tmp = 1; + tmp += iterfcns(tree,tree->FirstChild(node)); + tmp += iterfcns(tree,tree->NextSibling(node)); + return tmp; }; } -/* -extern "C" value caml_benchmark_fcns(value tree){ - int i = iterfcns(XMLTREE(tree),0); - return Val_unit; +int iterfene(XMLTree* tree, treeNode node){ + if (node == NULLT) + return 0; + else { + int tmp = 1; + tmp += iterfene(tree,tree->FirstElement(node)); + tmp += iterfene(tree,tree->NextElement(node)); + return tmp; + }; } -*/ + extern "C" value caml_benchmark_fcns(value tree){ - treeNode root = XMLTREE(tree)->FirstChild(0); - root = XMLTREE(tree)->FirstChild(root); - iterfcns(XMLTREE(tree),root); - return Val_unit; + int i = iterfcns(XMLTREE(tree),0); + return Val_int(i); + +} +extern "C" value caml_benchmark_fene(value tree){ + int i = iterfene(XMLTREE(tree),0); + return Val_int(i); + } + int iterlcps(XMLTree* tree, treeNode node){ if (node == NULLT) return 0; @@ -819,6 +838,33 @@ int iterlcps(XMLTree* tree, treeNode node){ }; } +int fulliterative(XMLTree* tree){ + treeNode current = tree->Root(); + treeNode next = NULLT; + int count = 1; //the root + + do { + + + while ((next = tree->FirstChild(current)) != NULLT) { + current = next; + count++; + }; + + while ( (next = tree->NextSibling(current)) == NULLT){ + current = tree->Parent(current); + if (current == NULLT) return count; + } + current = next; + count++; + } while (true); + +} + +extern "C" value caml_benchmark_iter(value tree){ + return Val_int(fulliterative(XMLTREE(tree))); +} + extern "C" value caml_benchmark_lcps(value tree){ iterlcps(XMLTREE(tree),0); return Val_unit; @@ -851,14 +897,17 @@ extern "C" { return; } - dummy_node * create_tree(XMLTree* tree, treeNode i){ + dummy_node * create_tree(XMLTree* tree, treeNode i, int mode){ if (i == NULLT) return NULL; else { dummy_node * f, *n, *r; - f = create_tree(tree,tree->FirstChild(i)); - n = create_tree(tree,tree->NextSibling(i)); - r = new_dummy_node(); + //mode = i % 3; + if (mode == 0) r = new_dummy_node(); + f = create_tree(tree,tree->FirstChild(i), mode); + if (mode == 1) r = new_dummy_node(); + n = create_tree(tree,tree->NextSibling(i), mode); + if (mode == 2) r = new_dummy_node(); r->first = f; r->next = n; return r; @@ -868,14 +917,12 @@ extern "C" { int iter_tree(dummy_node * n){ if (n == NULL) return 0; - else { - return (1+ iter_tree(n->first) + iter_tree(n->next)); - }; + else + return 1 + iter_tree (n->first) + iter_tree (n->next); } - } -extern "C" value caml_build_pointers(value tree){ - return ((value) create_tree(XMLTREE(Field(tree,0)),0)); +extern "C" value caml_build_pointers(value tree, value mode){ + return ((value) create_tree(XMLTREE(Field(tree,0)),0, Int_val(mode))); } extern "C" value caml_iter_pointers (value node){