X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fxml-tree_stub.cpp;h=1d52a9dfcd6385e1d6e5df14a1545875a0e1630b;hb=refs%2Fheads%2Ftrack-xml-tree-better-doc;hp=2551c665f1efba3ffe4f736bac4210dab6712377;hpb=83e9f9d8f219fece86afbedd1332d5ad97971d1c;p=SXSI%2Fxpathcomp.git diff --git a/src/xml-tree_stub.cpp b/src/xml-tree_stub.cpp index 2551c66..1d52a9d 100644 --- a/src/xml-tree_stub.cpp +++ b/src/xml-tree_stub.cpp @@ -1,6 +1,5 @@ -#include #include "xml-tree.hpp" -#include "common_stub.hpp" +#include "utils_stub.hpp" #include using namespace SXSI; @@ -20,32 +19,6 @@ static xml_tree::tag_t TAG(value i) return static_cast(Int_val(i)); } -static std::unordered_set*& HSET(value x) -{ - return Obj_val*>(x); -} - - -NoAlloc extern "C" value caml_unordered_set_length(value hset) -{ - return (Val_int((HSET(hset))->size())); -} - -extern "C" value caml_unordered_set_alloc(value unit) -{ - CAMLparam1(unit); - CAMLlocal1(hset); - hset = sxsi_alloc_custom*>(); - HSET(hset) = new std::unordered_set(); - CAMLreturn (hset); -} - -NoAlloc extern "C" value caml_unordered_set_set(value set, value v) -{ - HSET(set)->insert(TAG(v)); - return (Val_unit); -} - extern "C" value caml_xml_tree_save(value tree, value fd, value prefix) { CAMLparam3(tree, fd, prefix); @@ -104,7 +77,8 @@ caml_xml_tree_subtree_tags(value tree, value node, value tag) TAG(tag)))); } -NoAlloc extern "C" value caml_xml_tree_subtree_elements(value tree, value node) +NoAlloc extern "C" value caml_xml_tree_subtree_elements(value tree, + value node) { return (Val_int(XMLTREE(tree)->subtree_elements(TREENODE(node)))); } @@ -219,7 +193,7 @@ caml_xml_tree_tagged_child(value tree, value node, value tag) NoAlloc extern "C" value caml_xml_tree_select_child(value tree, value node, value tags) { - return (Val_int(XMLTREE(tree)->select_child(TREENODE(node), HSET(tags)))); + return (Val_int(XMLTREE(tree)->select_child(TREENODE(node), TAGLIST(tags)))); } NoAlloc extern "C" value @@ -233,7 +207,7 @@ NoAlloc extern "C" value caml_xml_tree_select_sibling(value tree, value node, value tags) { return (Val_int(XMLTREE(tree)->select_sibling(TREENODE(node), - HSET(tags)))); + TAGLIST(tags)))); } NoAlloc extern "C" value @@ -254,7 +228,7 @@ NoAlloc extern "C" value caml_xml_tree_select_descendant(value tree, value node, value tags) { return (Val_int(XMLTREE(tree)->select_descendant(TREENODE(node), - HSET(tags)))); + TAGLIST(tags)))); } NoAlloc extern "C" value caml_xml_tree_tagged_following_before(value tree, @@ -273,7 +247,7 @@ NoAlloc extern "C" value caml_xml_tree_select_following_before(value tree, value closing) { return (Val_int(XMLTREE(tree)->select_following_before(TREENODE(node), - HSET(tags), + TAGLIST(tags), TREENODE(closing)))); } @@ -332,7 +306,13 @@ extern "C" value caml_xml_tree_register_tag(value tree, value str) /** Full reporting into a bit vector */ -static std::vector sort_results(std::vector v) +static void pr_vector(std::vector v) +{ + for(auto i = v.begin(); i!= v.end(); ++i) + fprintf(stderr, "%i ", *i); + fprintf(stderr, "\n"); +} +static std::vector sort_results(std::vector v, xml_tree *t) { std::vector res; std::sort(v.begin(), v.end()); @@ -343,19 +323,19 @@ static std::vector sort_results(std::vector v) if (i == v.end()) return res; }; prev = *i; - res.push_back(prev); + res.push_back(t->parent_node(prev)); }; return res; } #define BV_QUERY(pref, Pref) \ extern "C" value caml_text_collection_## pref ##_bv(value tree, value str, value dobvv){ \ - CAMLparam3(tree, str, dobvv); \ + CAMLparam3(tree, str, dobvv); \ CAMLlocal3(res, res_bv, res_array); \ int j; \ uchar * cstr = (uchar *) strdup(String_val(str)); \ std::vector uresults = XMLTREE(tree)->Pref(cstr); \ - std::vector results = sort_results(uresults); \ + std::vector results = sort_results(uresults, XMLTREE(tree)); \ bool dobv = Bool_val(dobvv); \ res_bv = caml_alloc_string(dobv ? ((XMLTREE(tree)->size() / 4) + 2) : 0); \ unsigned long slen = caml_string_length(res_bv); \ @@ -363,12 +343,13 @@ static std::vector sort_results(std::vector v) memset(&(Byte(res_bv,0)), 0, slen); \ res_array = caml_alloc_shr(results.size(), 0); \ for (unsigned int i = 0; i < results.size(); ++i) { \ - j = XMLTREE(tree)->parent_node(results[i]); \ + j = results[i]; \ if (dobv) { \ Byte(res_bv, j >> 3) |= (1 << (j & 7)); \ }; \ caml_initialize(&Field(res_array, i), Val_int(j)); \ }; \ + fprintf(stderr, "Raw results: %lu, Sorted reulsts %lu\n", uresults.size(), results.size()); \ free(cstr); \ res = caml_alloc(2, 0); \ Store_field(res, 0, res_bv); \