X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fxml-tree_stub.cpp;h=9744694e4589b08158f3afa804b591f96a7a5e6f;hb=e4e34e687798285e65df74561915f7721b066631;hp=47b6c639d2d77f1b6c7553f602bf8ac447836114;hpb=431946f30b0733498ffa731cfa97692b2c942208;p=SXSI%2Fxpathcomp.git diff --git a/src/xml-tree_stub.cpp b/src/xml-tree_stub.cpp index 47b6c63..9744694 100644 --- a/src/xml-tree_stub.cpp +++ b/src/xml-tree_stub.cpp @@ -77,9 +77,11 @@ 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, + value atts) { - return (Val_int(XMLTREE(tree)->subtree_elements(TREENODE(node)))); + return (Val_int(XMLTREE(tree)->subtree_elements(TREENODE(node), + TAGLIST(atts)))); } NoAlloc extern "C" value caml_xml_tree_is_leaf(value tree, value node){ @@ -305,7 +307,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()); @@ -316,19 +324,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); \ @@ -336,12 +344,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: %i, Sorted reulsts %i\n", uresults.size(), results.size()); \ free(cstr); \ res = caml_alloc(2, 0); \ Store_field(res, 0, res_bv); \