1 #include <unordered_set>
2 #include "xml-tree.hpp"
3 #include "common_stub.hpp"
7 static xml_tree*& XMLTREE(value v)
9 return Obj_val<xml_tree*>(v);
12 static xml_tree::node_t TREENODE(value i)
14 return static_cast<xml_tree::node_t>(Int_val(i));
17 static xml_tree::tag_t TAG(value i)
19 return static_cast<xml_tree::tag_t>(Int_val(i));
22 static std::unordered_set<xml_tree::tag_t>*& HSET(value x)
24 return Obj_val<std::unordered_set<xml_tree::tag_t>*>(x);
28 NoAlloc extern "C" value caml_unordered_set_length(value hset)
30 return (Val_int((HSET(hset))->size()));
33 extern "C" value caml_unordered_set_alloc(value unit)
37 hset = sxsi_alloc_custom<std::unordered_set<xml_tree::tag_t>*>();
38 HSET(hset) = new std::unordered_set<xml_tree::tag_t>();
42 NoAlloc extern "C" value caml_unordered_set_set(value set, value v)
44 HSET(set)->insert(TAG(v));
48 extern "C" value caml_xml_tree_save(value tree, value fd, value prefix)
50 CAMLparam3(tree, fd, prefix);
51 XMLTREE(tree)->save(Int_val(fd), String_val(prefix));
52 CAMLreturn (Val_unit);
56 caml_xml_tree_load(value fd, value prefix, value load_tc, value sf)
58 CAMLparam4(fd, prefix, load_tc, sf);
63 tree = xml_tree::load(Int_val(fd),
68 result = sxsi_alloc_custom<xml_tree*>();
69 XMLTREE(result) = tree;
72 catch (const std::exception& e){ sxsi_raise_msg(e.what()); }
73 catch (std::string msg){ sxsi_raise_msg(msg.c_str()); }
74 catch (char const * msg){ sxsi_raise_msg(msg); };
79 NoAlloc extern "C" value caml_xml_tree_root(value tree)
81 return (Val_int(XMLTREE(tree)->root()));
84 NoAlloc extern "C" value caml_xml_tree_size(value tree)
86 return (Val_int(XMLTREE(tree)->size()));
89 NoAlloc extern "C" value caml_xml_tree_num_tags(value tree)
91 return (Val_int(XMLTREE(tree)->num_tags()));
94 NoAlloc extern "C" value caml_xml_tree_subtree_size(value tree, value node)
96 return (Val_int(XMLTREE(tree)->subtree_size(TREENODE(node))));
99 NoAlloc extern "C" value
100 caml_xml_tree_subtree_tags(value tree, value node, value tag)
102 return (Val_int(XMLTREE(tree)->subtree_tags(TREENODE(node),
106 NoAlloc extern "C" value caml_xml_tree_subtree_elements(value tree, value node)
108 return (Val_int(XMLTREE(tree)->subtree_elements(TREENODE(node))));
111 NoAlloc extern "C" value caml_xml_tree_is_leaf(value tree, value node){
112 return (Val_bool(XMLTREE(tree)->is_leaf(TREENODE(node))));
115 NoAlloc extern "C" value
116 caml_xml_tree_is_ancestor(value tree, value node1, value node2)
118 return (Val_bool(XMLTREE(tree)->is_ancestor(TREENODE(node1),
122 NoAlloc extern "C" value
123 caml_xml_tree_is_child(value tree, value node1, value node2)
125 return (Val_bool(XMLTREE(tree)->is_child(TREENODE(node1),
129 NoAlloc extern "C" value caml_xml_tree_is_first_child(value tree, value node)
131 return (Val_bool(XMLTREE(tree)->is_first_child(TREENODE(node))));
134 NoAlloc extern "C" value
135 caml_xml_tree_is_right_descendant(value tree, value x, value y)
137 return (Val_bool(XMLTREE(tree)->is_right_descendant(TREENODE(x),
141 NoAlloc extern "C" value caml_xml_tree_num_children(value tree, value node)
143 return (Val_int(XMLTREE(tree)->num_children(TREENODE(node))));
146 NoAlloc extern "C" value caml_xml_tree_child_pos(value tree, value node)
148 return (Val_int(XMLTREE(tree)->child_pos(TREENODE(node))));
151 NoAlloc extern "C" value caml_xml_tree_depth(value tree, value node)
153 return (Val_int(XMLTREE(tree)->depth(TREENODE(node))));
156 NoAlloc extern "C" value caml_xml_tree_preorder(value tree, value node)
158 return (Val_int(XMLTREE(tree)->preorder(TREENODE(node))));
161 NoAlloc extern "C" value caml_xml_tree_postorder(value tree, value node)
163 return (Val_int(XMLTREE(tree)->postorder(TREENODE(node))));
166 NoAlloc extern "C" value caml_xml_tree_tag(value tree, value node)
168 return (Val_int(XMLTREE(tree)->tag(TREENODE(node))));
171 NoAlloc extern "C" value caml_xml_tree_parent(value tree, value node)
173 return (Val_int(XMLTREE(tree)->parent(TREENODE(node))));
176 NoAlloc extern "C" value caml_xml_tree_child(value tree, value node, value idx)
178 return (Val_int(XMLTREE(tree)->child(TREENODE(node), Int_val(idx))));
181 NoAlloc extern "C" value caml_xml_tree_first_child(value tree, value node)
183 return (Val_int(XMLTREE(tree)->first_child(TREENODE(node))));
186 NoAlloc extern "C" value caml_xml_tree_first_element(value tree, value node)
188 return (Val_int(XMLTREE(tree)->first_element(TREENODE(node))));
191 NoAlloc extern "C" value caml_xml_tree_last_child(value tree, value node)
193 return (Val_int(XMLTREE(tree)->last_child(TREENODE(node))));
196 NoAlloc extern "C" value caml_xml_tree_next_sibling(value tree, value node)
198 return (Val_int(XMLTREE(tree)->next_sibling(TREENODE(node))));
201 NoAlloc extern "C" value caml_xml_tree_next_element(value tree, value node)
203 return (Val_int(XMLTREE(tree)->next_element(TREENODE(node))));
206 NoAlloc extern "C" value caml_xml_tree_prev_sibling(value tree, value node)
208 return (Val_int(XMLTREE(tree)->prev_sibling(TREENODE(node))));
211 NoAlloc extern "C" value
212 caml_xml_tree_tagged_child(value tree, value node, value tag)
214 return (Val_int(XMLTREE(tree)->tagged_child(TREENODE(node),
218 NoAlloc extern "C" value
219 caml_xml_tree_select_child(value tree, value node, value tags)
221 return (Val_int(XMLTREE(tree)->select_child(TREENODE(node), HSET(tags))));
224 NoAlloc extern "C" value
225 caml_xml_tree_tagged_sibling(value tree, value node, value tag)
227 return (Val_int(XMLTREE(tree)->tagged_sibling(TREENODE(node),
231 NoAlloc extern "C" value
232 caml_xml_tree_select_sibling(value tree, value node, value tags)
234 return (Val_int(XMLTREE(tree)->select_sibling(TREENODE(node),
238 NoAlloc extern "C" value
239 caml_xml_tree_tagged_descendant(value tree, value node, value tag)
241 return (Val_int(XMLTREE(tree)->tagged_descendant(TREENODE(node),
245 NoAlloc extern "C" value
246 caml_xml_tree_tagged_next(value tree, value node, value tag)
248 return (Val_int(XMLTREE(tree)->tagged_next(TREENODE(node),
252 NoAlloc extern "C" value
253 caml_xml_tree_select_descendant(value tree, value node, value tags)
255 return (Val_int(XMLTREE(tree)->select_descendant(TREENODE(node),
259 NoAlloc extern "C" value caml_xml_tree_tagged_following_before(value tree,
264 return (Val_int(XMLTREE(tree)->tagged_following_before(TREENODE(node),
266 TREENODE(closing))));
269 NoAlloc extern "C" value caml_xml_tree_select_following_before(value tree,
274 return (Val_int(XMLTREE(tree)->select_following_before(TREENODE(node),
276 TREENODE(closing))));
281 extern "C" value caml_xml_tree_get_text_collection(value tree)
285 text = sxsi_alloc_custom<TextCollection*>();
286 Obj_val<TextCollection*>(text) = XMLTREE(tree)->get_text_collection();
290 NoAlloc extern "C" value caml_xml_tree_closing(value tree, value node)
292 return (Val_int(XMLTREE(tree)->closing(TREENODE(node))));
295 NoAlloc extern "C" value caml_xml_tree_nullt(value unit){
296 return (Val_int(xml_tree::NIL));
300 extern "C" value caml_xml_tree_print(value tree, value node, value fd)
302 CAMLparam3(tree, node, fd);
303 XMLTREE(tree)->print(TREENODE(node), Int_val(fd));
304 CAMLreturn(Val_unit);
308 extern "C" value caml_xml_tree_get_tag_name(value tree, value tag)
310 CAMLparam2(tree, tag);
312 const char* s = XMLTREE(tree)->get_tag_name_by_ref(TAG(tag));
313 res = caml_copy_string(s);
317 NoAlloc extern "C" value caml_xml_tree_flush(value tree, value fd)
319 XMLTREE(tree)->flush(Int_val(fd));
323 extern "C" value caml_xml_tree_register_tag(value tree, value str)
325 CAMLparam2(tree, str);
327 res = Val_int(XMLTREE(tree)->register_tag(String_val(str)));
332 /** Full reporting into a bit vector
334 static std::vector<int32_t> sort_results(std::vector<int32_t> v)
336 std::vector<int32_t> res;
337 std::sort(v.begin(), v.end());
339 for(auto i = v.begin(); i != v.end(); ++i){
342 if (i == v.end()) return res;
350 #define BV_QUERY(pref, Pref) \
351 extern "C" value caml_text_collection_## pref ##_bv(value tree, value str, value dobvv){ \
352 CAMLparam3(tree, str, dobvv); \
353 CAMLlocal3(res, res_bv, res_array); \
355 uchar * cstr = (uchar *) strdup(String_val(str)); \
356 std::vector<int32_t> uresults = XMLTREE(tree)->Pref(cstr); \
357 std::vector<int32_t> results = sort_results(uresults); \
358 bool dobv = Bool_val(dobvv); \
359 res_bv = caml_alloc_string(dobv ? ((XMLTREE(tree)->size() / 4) + 2) : 0); \
360 unsigned long slen = caml_string_length(res_bv); \
362 memset(&(Byte(res_bv,0)), 0, slen); \
363 res_array = caml_alloc_shr(results.size(), 0); \
364 for (unsigned int i = 0; i < results.size(); ++i) { \
365 j = XMLTREE(tree)->parent_node(results[i]); \
367 Byte(res_bv, j >> 3) |= (1 << (j & 7)); \
369 caml_initialize(&Field(res_array, i), Val_int(j)); \
372 res = caml_alloc(2, 0); \
373 Store_field(res, 0, res_bv); \
374 Store_field(res, 1, res_array); \
379 BV_QUERY(prefix, prefix)
380 BV_QUERY(suffix, suffix)
381 BV_QUERY(equals, equals)
382 BV_QUERY(contains, contains)
383 BV_QUERY(lessthan, less_than)