X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=OCamlStorageInterface.cpp;fp=OCamlStorageInterface.cpp;h=0000000000000000000000000000000000000000;hb=b821684aac2e3114c2eb28188020d7a09b5de2a5;hp=52f3cb5656d917ec1f956fd0bbe9a3fff9dc9287;hpb=04630ec1de987f525c6594fcada17bb49ee79d6a;p=SXSI%2Fxpathcomp.git diff --git a/OCamlStorageInterface.cpp b/OCamlStorageInterface.cpp deleted file mode 100644 index 52f3cb5..0000000 --- a/OCamlStorageInterface.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/******************************************* - * OCamlStorageInterface.cpp - * ------------------------ - * - * - * Author: Kim Nguyen - * Date: 04/11/08 - */ - - -#include "OCamlStorageInterface.h" -#include "Utils.h" - -/* see caml/mlvalues.h - */ -/* tags */ -#define NODE 0 -#define STRING 1 - -/* fields */ -#define PCDATA 0 -#define ID 0 -#define TAG 1 -#define LEFT 2 -#define RIGHT 3 -#define FATHER 4 - -#define NIL (Val_unit) - -/* The OCaml function which computes the hash value of a tag */ -static value *caml_hash_tag = NULL; - -OCamlStorageInterface::OCamlStorageInterface() -{ - CAMLparam0(); - CAMLlocal4(node,nodeptr,dummytag,father); - nodeid=1; - if (caml_hash_tag == NULL) { - /* First time around, look up by name */ - caml_hash_tag = caml_named_value("caml_hash_tag"); - - } - - dummytag = caml_callback(*caml_hash_tag, caml_copy_string("")); - - // Atomic block, initialize must be called for every field - // Before any other allocation takes place. In particular, - // One should NOT place the call to caml_callback as an argument to - // caml_initialize but rather store its result in a variable. - father = caml_alloc_shr(1,0); - caml_initialize(&Field(father,0),NIL); - - node = caml_alloc_shr(5,0); - caml_initialize(&Field(node,ID),Val_int(nodeid++)); - caml_initialize(&Field(node,TAG),dummytag); - caml_initialize(&Field(node,LEFT),NIL); - caml_initialize(&Field(node,RIGHT),NIL); - caml_initialize(&Field(node,FATHER),father); - - nodeptr = caml_alloc_shr(1,LEFT); - caml_initialize(&Field(nodeptr,0),node); - - stack.push_front(nodeptr); - caml_register_global_root(&stack.front()); - - CAMLreturn0; -} - -OCamlStorageInterface::~OCamlStorageInterface() -{ - caml_remove_global_root(&stack.back()); -} - -void OCamlStorageInterface::newChild(string name) -{ - CAMLparam0(); - CAMLlocal5(nnode,onode,tag,taghash,id); - CAMLlocal3(father,nnodeptr,onodeptr); - DPRINT("newChild " << name <<"\n") - onode = stack.front(); - /* Allocate the new Node(tag,l,r) */ - - /* Compute the new tag hash and store it in the new block */ - tag = caml_copy_string(name.c_str()); - taghash = caml_callback(*caml_hash_tag, tag); - id = Val_int(nodeid++); - - /* Again, initialization must be atomic */ - father=caml_alloc_shr(1,0); - caml_initialize(&Field(father,0),onode); - - nnode = caml_alloc_shr(5,0); - caml_initialize(&Field(nnode,ID),id); - caml_initialize(&Field(nnode,TAG),taghash); - caml_initialize(&Field(nnode,LEFT),NIL); - caml_initialize(&Field(nnode,RIGHT),NIL); - caml_initialize(&Field(nnode,FATHER),father); - - nnodeptr = caml_alloc_shr(1,LEFT); - caml_initialize(&Field(nnodeptr,0),nnode); - - switch (Tag_val(onode)){ - case LEFT: - caml_modify(&Field(Field(onode,0),LEFT),nnodeptr); - Tag_val(onode) = RIGHT; - break; - - case RIGHT: - caml_modify(&Field(Field(onode,0),RIGHT),nnodeptr); - Tag_val(onode) = NODE; - break; - }; - - stack.push_front(nnodeptr); - - CAMLreturn0; -} - - - -void OCamlStorageInterface::newText(string text) -{ - CAMLparam0(); - CAMLlocal3(pcdata,snode,node); - DPRINT("newText " << text <<"\n") - - pcdata = caml_copy_string(text.c_str()); - snode = caml_alloc_shr(1,STRING); - caml_initialize(&(Field(snode,PCDATA)),pcdata); - node = stack.front(); - - switch (Tag_val(node)){ - case LEFT: - caml_modify(&Field(Field(node,0),LEFT),snode); - Tag_val(node) = RIGHT; - break; - case RIGHT: - caml_modify(&Field(Field(node,0),RIGHT),snode); - Tag_val(node) = NODE; - break; - - - }; - - CAMLreturn0; -} - - - -void OCamlStorageInterface::nodeFinished() -{ - - CAMLparam0(); - CAMLlocal1(node); - DPRINT("nodeFinished\n") - node = stack.front(); - - switch (Tag_val(node)){ - case LEFT: - DPRINT("Tagged left\n") - Tag_val(node) = RIGHT; - break; - - case RIGHT: - DPRINT("Tagged right\n") - Tag_val(node) = NODE; - - case NODE: - DPRINT("Under NODE\n"); - while (Tag_val(node) == NODE){ - stack.pop_front(); - node = stack.front(); - }; - break; - }; - - CAMLreturn0; -} - - void OCamlStorageInterface::parsingFinished() -{ - CAMLparam0(); - CAMLlocal1(rnode); - caml_register_global_root(&document); - document = stack.front(); - - stack.pop_front(); /* removes the root */ - rnode = stack.front(); - - DPRINT ("Stack size is "<< stack.size() <<"\n") - /* reinitializes the stack */ - caml_modify(&Field(Field(rnode,0),ID),Val_int(nodeid=1)); - caml_modify(&Field(Field(rnode,0),LEFT),NIL); - caml_modify(&Field(Field(rnode,0),RIGHT),NIL); - caml_modify(&Field(Field(Field(rnode,0),FATHER),0),NIL); - Tag_val(rnode) = LEFT; - - - caml_modify(&Field(Field(Field(document,0),FATHER),0),NIL); - Tag_val(document) = NODE; - - CAMLreturn0; - - -} -value OCamlStorageInterface::getDocument (){ - CAMLparam0(); - CAMLlocal1(doc); - doc = document; - caml_remove_global_root(&document); - CAMLreturn(doc); -} -void *OCamlStorageInterface::returnDocument(){ - - return ((void *) getDocument()); - -}