+#include "XMLTree.h"
+#include "Utils.h"
+
+#define CAMLRAISEMSG(msg) (caml_raise_with_string(*cpp_exception,(msg) ))
+#define NOT_IMPLEMENTED(s) (caml_failwith(s))
+#define XMLTREE(x) ((XMLTree *)(* (XMLTree**) Data_custom_val(x)))
+#define HSET(x) ((std::unordered_set<int>*)((* (XMLTree**) Data_custom_val(x))))
+#define TEXTCOLLECTION(x)
+#define TREENODEVAL(i) ((treeNode) (Int_val(i)))
+#define XMLTREE_ROOT 0
+
+
+
+extern "C" {
+ static struct custom_operations ops;
+ static struct custom_operations set_ops;
+ static value * cpp_exception = NULL;
+ static bool ops_initialized = false;
+
+}
+extern "C" void caml_xml_tree_finalize(value tree){
+ delete XMLTREE(tree);
+ return;
+}
+extern "C" void caml_hset_finalize(value hblock){
+ delete HSET(hblock);
+ return;
+}
+
+extern "C" CAMLprim value caml_init_lib (value unit) {
+ CAMLparam1(unit);
+ if (!ops_initialized){
+
+
+ ops.identifier = (char*) "XMLTree";
+ ops.finalize = caml_xml_tree_finalize;
+ set_ops.identifier = (char*) "unordered_set";
+ set_ops.finalize = caml_hset_finalize;
+
+ cpp_exception = caml_named_value("CPlusPlusError");
+
+ ops_initialized = true;
+
+ };
+ CAMLreturn(Val_unit);
+
+}
+extern "C" CAMLprim value caml_shredder_parse(XMLDocShredder *shredder){
+ CAMLparam0();
+ CAMLlocal1(doc);
+ XMLTree * tree;
+ shredder->processStartDocument("");
+ shredder->parse();
+ shredder->processEndDocument();
+ doc = caml_alloc_custom(&ops,sizeof(XMLTree*),1,2);
+ tree = (XMLTree *) shredder->getXMLTree();
+ memcpy(Data_custom_val(doc),&tree,sizeof(XMLTree*));
+ CAMLreturn(doc);
+
+}