1 #include "xml-tree.hpp"
2 #include "utils_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 extern "C" value caml_xml_tree_save(value tree, value fd, value prefix)
24 CAMLparam3(tree, fd, prefix);
25 XMLTREE(tree)->save(Int_val(fd), String_val(prefix));
26 CAMLreturn (Val_unit);
30 caml_xml_tree_load(value fd, value prefix, value load_tc, value sf)
32 CAMLparam4(fd, prefix, load_tc, sf);
37 tree = xml_tree::load(Int_val(fd),
42 result = sxsi_alloc_custom<xml_tree*>();
43 XMLTREE(result) = tree;
46 catch (const std::exception& e){ sxsi_raise_msg(e.what()); }
47 catch (std::string msg){ sxsi_raise_msg(msg.c_str()); }
48 catch (char const * msg){ sxsi_raise_msg(msg); };
53 NoAlloc extern "C" value caml_xml_tree_root(value tree)
55 return (Val_int(XMLTREE(tree)->root()));
58 NoAlloc extern "C" value caml_xml_tree_size(value tree)
60 return (Val_int(XMLTREE(tree)->size()));
63 NoAlloc extern "C" value caml_xml_tree_num_tags(value tree)
65 return (Val_int(XMLTREE(tree)->num_tags()));
68 NoAlloc extern "C" value caml_xml_tree_subtree_size(value tree, value node)
70 return (Val_int(XMLTREE(tree)->subtree_size(TREENODE(node))));
73 NoAlloc extern "C" value
74 caml_xml_tree_subtree_tags(value tree, value node, value tag)
76 return (Val_int(XMLTREE(tree)->subtree_tags(TREENODE(node),
80 NoAlloc extern "C" value caml_xml_tree_subtree_elements(value tree, value node,
83 return (Val_int(XMLTREE(tree)->subtree_elements(TREENODE(node),
87 NoAlloc extern "C" value caml_xml_tree_is_leaf(value tree, value node){
88 return (Val_bool(XMLTREE(tree)->is_leaf(TREENODE(node))));
91 NoAlloc extern "C" value
92 caml_xml_tree_is_ancestor(value tree, value node1, value node2)
94 return (Val_bool(XMLTREE(tree)->is_ancestor(TREENODE(node1),
98 NoAlloc extern "C" value
99 caml_xml_tree_is_child(value tree, value node1, value node2)
101 return (Val_bool(XMLTREE(tree)->is_child(TREENODE(node1),
105 NoAlloc extern "C" value caml_xml_tree_is_first_child(value tree, value node)
107 return (Val_bool(XMLTREE(tree)->is_first_child(TREENODE(node))));
110 NoAlloc extern "C" value
111 caml_xml_tree_is_right_descendant(value tree, value x, value y)
113 return (Val_bool(XMLTREE(tree)->is_right_descendant(TREENODE(x),
117 NoAlloc extern "C" value caml_xml_tree_num_children(value tree, value node)
119 return (Val_int(XMLTREE(tree)->num_children(TREENODE(node))));
122 NoAlloc extern "C" value caml_xml_tree_child_pos(value tree, value node)
124 return (Val_int(XMLTREE(tree)->child_pos(TREENODE(node))));
127 NoAlloc extern "C" value caml_xml_tree_depth(value tree, value node)
129 return (Val_int(XMLTREE(tree)->depth(TREENODE(node))));
132 NoAlloc extern "C" value caml_xml_tree_preorder(value tree, value node)
134 return (Val_int(XMLTREE(tree)->preorder(TREENODE(node))));
137 NoAlloc extern "C" value caml_xml_tree_postorder(value tree, value node)
139 return (Val_int(XMLTREE(tree)->postorder(TREENODE(node))));
142 NoAlloc extern "C" value caml_xml_tree_tag(value tree, value node)
144 return (Val_int(XMLTREE(tree)->tag(TREENODE(node))));
147 NoAlloc extern "C" value caml_xml_tree_parent(value tree, value node)
149 return (Val_int(XMLTREE(tree)->parent(TREENODE(node))));
152 NoAlloc extern "C" value caml_xml_tree_child(value tree, value node, value idx)
154 return (Val_int(XMLTREE(tree)->child(TREENODE(node), Int_val(idx))));
157 NoAlloc extern "C" value caml_xml_tree_first_child(value tree, value node)
159 return (Val_int(XMLTREE(tree)->first_child(TREENODE(node))));
162 NoAlloc extern "C" value caml_xml_tree_first_element(value tree, value node)
164 return (Val_int(XMLTREE(tree)->first_element(TREENODE(node))));
167 NoAlloc extern "C" value caml_xml_tree_last_child(value tree, value node)
169 return (Val_int(XMLTREE(tree)->last_child(TREENODE(node))));
172 NoAlloc extern "C" value caml_xml_tree_next_sibling(value tree, value node)
174 return (Val_int(XMLTREE(tree)->next_sibling(TREENODE(node))));
177 NoAlloc extern "C" value caml_xml_tree_next_element(value tree, value node)
179 return (Val_int(XMLTREE(tree)->next_element(TREENODE(node))));
182 NoAlloc extern "C" value caml_xml_tree_prev_sibling(value tree, value node)
184 return (Val_int(XMLTREE(tree)->prev_sibling(TREENODE(node))));
187 NoAlloc extern "C" value
188 caml_xml_tree_tagged_child(value tree, value node, value tag)
190 return (Val_int(XMLTREE(tree)->tagged_child(TREENODE(node),
194 NoAlloc extern "C" value
195 caml_xml_tree_select_child(value tree, value node, value tags)
197 return (Val_int(XMLTREE(tree)->select_child(TREENODE(node), TAGLIST(tags))));
200 NoAlloc extern "C" value
201 caml_xml_tree_tagged_sibling(value tree, value node, value tag)
203 return (Val_int(XMLTREE(tree)->tagged_sibling(TREENODE(node),
207 NoAlloc extern "C" value
208 caml_xml_tree_select_sibling(value tree, value node, value tags)
210 return (Val_int(XMLTREE(tree)->select_sibling(TREENODE(node),
214 NoAlloc extern "C" value
215 caml_xml_tree_tagged_descendant(value tree, value node, value tag)
217 return (Val_int(XMLTREE(tree)->tagged_descendant(TREENODE(node),
221 NoAlloc extern "C" value
222 caml_xml_tree_tagged_next(value tree, value node, value tag)
224 return (Val_int(XMLTREE(tree)->tagged_next(TREENODE(node),
228 NoAlloc extern "C" value
229 caml_xml_tree_select_descendant(value tree, value node, value tags)
231 return (Val_int(XMLTREE(tree)->select_descendant(TREENODE(node),
235 NoAlloc extern "C" value caml_xml_tree_tagged_following_before(value tree,
240 return (Val_int(XMLTREE(tree)->tagged_following_before(TREENODE(node),
242 TREENODE(closing))));
245 NoAlloc extern "C" value caml_xml_tree_select_following_before(value tree,
250 return (Val_int(XMLTREE(tree)->select_following_before(TREENODE(node),
252 TREENODE(closing))));
257 extern "C" value caml_xml_tree_get_text_collection(value tree)
261 text = sxsi_alloc_custom<TextCollection*>();
262 Obj_val<TextCollection*>(text) = XMLTREE(tree)->get_text_collection();
266 NoAlloc extern "C" value caml_xml_tree_closing(value tree, value node)
268 return (Val_int(XMLTREE(tree)->closing(TREENODE(node))));
271 NoAlloc extern "C" value caml_xml_tree_nullt(value unit){
272 return (Val_int(xml_tree::NIL));
276 extern "C" value caml_xml_tree_print(value tree, value node, value fd)
278 CAMLparam3(tree, node, fd);
279 XMLTREE(tree)->print(TREENODE(node), Int_val(fd));
280 CAMLreturn(Val_unit);
284 extern "C" value caml_xml_tree_get_tag_name(value tree, value tag)
286 CAMLparam2(tree, tag);
288 const char* s = XMLTREE(tree)->get_tag_name_by_ref(TAG(tag));
289 res = caml_copy_string(s);
293 NoAlloc extern "C" value caml_xml_tree_flush(value tree, value fd)
295 XMLTREE(tree)->flush(Int_val(fd));
299 extern "C" value caml_xml_tree_register_tag(value tree, value str)
301 CAMLparam2(tree, str);
303 res = Val_int(XMLTREE(tree)->register_tag(String_val(str)));
308 /** Full reporting into a bit vector
310 static void pr_vector(std::vector<int32_t> v)
312 for(auto i = v.begin(); i!= v.end(); ++i)
313 fprintf(stderr, "%i ", *i);
314 fprintf(stderr, "\n");
316 static std::vector<int32_t> sort_results(std::vector<int32_t> v, xml_tree *t)
318 std::vector<int32_t> res;
319 std::sort(v.begin(), v.end());
321 for(auto i = v.begin(); i != v.end(); ++i){
324 if (i == v.end()) return res;
327 res.push_back(t->parent_node(prev));
332 #define BV_QUERY(pref, Pref) \
333 extern "C" value caml_text_collection_## pref ##_bv(value tree, value str, value dobvv){ \
334 CAMLparam3(tree, str, dobvv); \
335 CAMLlocal3(res, res_bv, res_array); \
337 uchar * cstr = (uchar *) strdup(String_val(str)); \
338 std::vector<int32_t> uresults = XMLTREE(tree)->Pref(cstr); \
339 std::vector<int32_t> results = sort_results(uresults, XMLTREE(tree)); \
340 bool dobv = Bool_val(dobvv); \
341 res_bv = caml_alloc_string(dobv ? ((XMLTREE(tree)->size() / 4) + 2) : 0); \
342 unsigned long slen = caml_string_length(res_bv); \
344 memset(&(Byte(res_bv,0)), 0, slen); \
345 res_array = caml_alloc_shr(results.size(), 0); \
346 for (unsigned int i = 0; i < results.size(); ++i) { \
349 Byte(res_bv, j >> 3) |= (1 << (j & 7)); \
351 caml_initialize(&Field(res_array, i), Val_int(j)); \
353 fprintf(stderr, "Raw results: %i, Sorted reulsts %i\n", uresults.size(), results.size()); \
355 res = caml_alloc(2, 0); \
356 Store_field(res, 0, res_bv); \
357 Store_field(res, 1, res_array); \
362 BV_QUERY(prefix, prefix)
363 BV_QUERY(suffix, suffix)
364 BV_QUERY(equals, equals)
365 BV_QUERY(contains, contains)
366 BV_QUERY(lessthan, less_than)