Silence a format-related warning (%i -> %lu).
[SXSI/xpathcomp.git] / src / xml-tree_stub.cpp
index 2551c66..54f5c9a 100644 (file)
@@ -1,6 +1,5 @@
-#include <unordered_set>
 #include "xml-tree.hpp"
-#include "common_stub.hpp"
+#include "utils_stub.hpp"
 #include <cstdio>
 
 using namespace SXSI;
@@ -20,32 +19,6 @@ static xml_tree::tag_t TAG(value i)
   return static_cast<xml_tree::tag_t>(Int_val(i));
 }
 
-static std::unordered_set<xml_tree::tag_t>*& HSET(value x)
-{
-  return Obj_val<std::unordered_set<xml_tree::tag_t>*>(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<std::unordered_set<xml_tree::tag_t>*>();
-  HSET(hset) = new std::unordered_set<xml_tree::tag_t>();
-  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,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){
@@ -219,7 +194,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 +208,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 +229,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 +248,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 +307,13 @@ extern "C" value caml_xml_tree_register_tag(value tree, value str)
 
 /** Full reporting into a bit vector
  */
-static std::vector<int32_t> sort_results(std::vector<int32_t> v)
+static void pr_vector(std::vector<int32_t> v)
+{
+  for(auto i = v.begin(); i!= v.end(); ++i)
+    fprintf(stderr, "%i ", *i);
+  fprintf(stderr, "\n");
+}
+static std::vector<int32_t> sort_results(std::vector<int32_t> v, xml_tree *t)
 {
   std::vector<int32_t> res;
   std::sort(v.begin(), v.end());
@@ -343,19 +324,19 @@ static std::vector<int32_t> sort_results(std::vector<int32_t> 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<int32_t> uresults = XMLTREE(tree)->Pref(cstr);         \
-    std::vector<int32_t> results = sort_results(uresults);                \
+    std::vector<int32_t> 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 +344,13 @@ static std::vector<int32_t> sort_results(std::vector<int32_t> 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);                                       \