+
+extern "C" {
+
+ typedef struct dummy_node_ {
+ struct dummy_node_* first;
+ struct dummy_node_* next;
+ } dummy_node;
+
+
+ dummy_node * new_dummy_node () {
+
+ dummy_node * node = (dummy_node*) malloc(sizeof(dummy_node));
+ if (!node)
+ printf("%s","Cannot allocate memory\n");
+
+ return node;
+ }
+
+ void free_tree(dummy_node * node){
+ if (node){
+ free_tree(node->first);
+ free_tree(node->next);
+ free(node);
+ };
+ return;
+ }
+
+ dummy_node * create_tree(XMLTree* tree, treeNode i){
+ if (i == NULLT)
+ return NULL;
+ else {
+ dummy_node * f, *n, *r;
+ f = create_tree(tree,tree->FirstChild(i));
+ n = create_tree(tree,tree->NextSibling(i));
+ r = new_dummy_node();
+ r->first = f;
+ r->next = n;
+ return r;
+ };
+ }
+
+ int iter_tree(dummy_node * n){
+ if (n == NULL)
+ return 0;
+ else {
+ return (1+ iter_tree(n->next)+ iter_tree(n->first) );
+ };
+ }
+
+}
+extern "C" value caml_build_pointers(value tree){
+ return ((value) create_tree(XMLTREE(Field(tree,0)),0));
+}
+
+extern "C" value caml_iter_pointers (value node){
+ return Val_int(iter_tree((dummy_node*) node));
+
+}
+
+extern "C" value caml_free_pointers(value node){
+ free_tree((dummy_node*) node);
+ return Val_unit;
+}