safety commit
[SXSI/xpathcomp.git] / OCamlDriver.cpp
index a57e0c6..85cc813 100644 (file)
@@ -25,6 +25,7 @@ extern "C" {
 #include <caml/fail.h>
 #include <caml/custom.h>
 #include "results.h"
+#include <stdio.h>
 
 #define CAMLRAISEMSG(msg) (caml_raise_with_string(*cpp_exception,(msg) ))
 #define NOT_IMPLEMENTED(s)  (caml_failwith(s))
@@ -143,8 +144,6 @@ extern "C" CAMLprim value caml_xml_tree_load(value fd){
   catch (char const * msg){ CAMLRAISEMSG(msg);  };
 }
 
-
-
 extern "C" CAMLprim value caml_text_collection_get_text(value tree, value id){
   CAMLparam2(tree,id);
   CAMLlocal1(str);
@@ -256,7 +255,7 @@ extern "C" CAMLprim value caml_xml_tree_is_open(value tree, value id){
 }
 
 extern "C" CAMLprim value caml_xml_tree_first_element(value tree, value id){
-  return(Val_int (XMLTREE(tree)->FirstElement(TREENODEVAL(id))));
+  return(Val_int (XMLTREE(Field(tree,0))->FirstElement(TREENODEVAL(id))));
 }
 
 extern "C" CAMLprim value caml_xml_tree_tagged_child(value tree, value id, value tag){
@@ -268,7 +267,7 @@ extern "C" CAMLprim value caml_xml_tree_next_sibling(value tree, value id){
 }
 
 extern "C" CAMLprim value caml_xml_tree_next_element(value tree, value id){
-  return(Val_int (XMLTREE(tree)->NextElement(TREENODEVAL(id))));
+  return(Val_int (XMLTREE(Field(tree,0))->NextElement(TREENODEVAL(id))));
 }
 
 extern "C" CAMLprim value caml_xml_tree_tagged_sibling(value tree, value id, value tag){
@@ -291,6 +290,9 @@ extern "C" CAMLprim value caml_xml_tree_tagged_foll(value tree, value id, value
 extern "C" CAMLprim value caml_xml_tree_tagged_foll_below(value tree, value id, value tag,value root){
   return(Val_int (XMLTREE(tree)->TaggedFollBelow(TREENODEVAL(id),(TagType) Int_val(tag),TREENODEVAL(root))));
 }
+extern "C" CAMLprim value caml_xml_tree_tagged_foll_before(value tree, value id, value tag,value root){
+  return(Val_int (XMLTREE(tree)->TaggedFollBefore(TREENODEVAL(id),(TagType) Int_val(tag),TREENODEVAL(root))));
+}
 
 extern "C" CAMLprim value caml_xml_tree_my_text(value tree, value id){
   return(Val_int((XMLTREE(tree)->MyText(TREENODEVAL(id)))));
@@ -383,6 +385,11 @@ extern "C" CAMLprim value caml_xml_tree_select_foll_below(value tree, value node
                                                  HSET(tags),
                                                  TREENODEVAL(ctx))));
 }
+extern "C" CAMLprim value caml_xml_tree_select_foll_before(value tree, value node, value tags,value ctx){
+  return (Val_int (XMLTREE(tree)->SelectFollBelow(TREENODEVAL(node),
+                                                 HSET(tags),
+                                                 TREENODEVAL(ctx))));
+}
 
 
 extern "C" CAMLprim value caml_xml_tree_doc_ids(value tree, value node){
@@ -406,7 +413,6 @@ extern "C" value caml_result_set_create(value size){
 
 extern "C" CAMLprim value caml_result_set_set(value result,value p){
   CAMLparam1(p);
-  results r;
   setResult (  *((results*) result), Int_val(p));
   CAMLreturn (Val_unit);
 }
@@ -430,3 +436,21 @@ extern "C" CAMLprim value caml_xml_tree_print(value tree,value node,value fd){
   CAMLreturn(Val_unit);
 }
 
+extern "C" CAMLprim value caml_set_tag_bits(value result, value tag, value tree, value node)
+{
+  CAMLparam3(tag,tree,node);
+  results r;
+  XMLTree *t = XMLTREE(Field(tree,0));
+  treeNode opening = TREENODEVAL(node);
+  treeNode closing = t->Closing(opening);
+  TagType target_tag = Int_val(tag);
+  treeNode first = t->TaggedDesc(opening,target_tag);
+  r = *( (results *) result);
+  opening = first;
+  while (opening != NULLT){
+    setResult(r,opening);
+    opening = t->TaggedFollBefore(opening,target_tag,closing);
+  };
+  CAMLreturn(Val_int(first));
+}
+