X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=xml-tree.cpp;h=758c1b4d9b5ffce3bbdb2022ca57a9a642b58ca5;hb=429f734c9f9241dfb9c587e8b333777f3540625f;hp=6d3387873a49f34fc11e2df22560c1d1557f8e85;hpb=cd438c6db9deacac203891fd76a49a768ba53e70;p=SXSI%2FXMLTree.git diff --git a/xml-tree.cpp b/xml-tree.cpp index 6d33878..758c1b4 100644 --- a/xml-tree.cpp +++ b/xml-tree.cpp @@ -13,6 +13,10 @@ extern "C" { using namespace SXSI; +const xml_tree::node_t xml_tree::NIL; +const xml_tree::node_t xml_tree::ROOT; + + const xml_tree::tag_t xml_tree::NIL_TAG_ID; const char* xml_tree::NIL_TAG = ""; const xml_tree::tag_t xml_tree::DOCUMENT_OPEN_TAG_ID; @@ -26,6 +30,7 @@ const char* xml_tree::ATTRIBUTE_DATA_OPEN_TAG = "<@$>"; const xml_tree::tag_t xml_tree::CLOSE_TAG_ID; const char* xml_tree::CLOSE_TAG = ""; + static int bits8 (int t ) { int r = bits(t); if (r <= 8) @@ -78,6 +83,7 @@ xml_tree::xml_tree(std::vector *tags, size_t npar = parbitmap->size(); parbitmap->pack(); + par = bp_construct(npar, parbitmap->get_vector_ptr(), OPT_DEGREE); @@ -92,7 +98,8 @@ xml_tree::xml_tree(std::vector *tags, uint32_t max_tag = tag_names->size() - 1; static_bitsequence_builder *bmb = new static_bitsequence_builder_sdarray(); alphabet_mapper *am = new alphabet_mapper_none(); - this->tags = new static_sequence_bs((uint32_t *) &tags[0], npar, am, bmb); + + this->tags = new static_sequence_bs((uint32_t*)&((*tags)[0]), npar, am, bmb); bits_per_tag = bits8(max_tag); tag_seq_len = npar; tag_seq = new uint32_t[uint_len(bits_per_tag, tag_seq_len)]; @@ -110,10 +117,15 @@ xml_tree::xml_tree(std::vector *tags, text_positions = new static_bitsequence_rrr02(textbm, npar, 32); - delete [] textbm; + //delete [] textbm; + delete textbitmap; this->text_index_type = idx_type; + fprintf(stderr, "Before!\n"); + fflush(stderr); text_collection = tc_builder->InitTextCollection(); + fprintf(stderr, "After!\n"); + fflush(stderr); delete tc_builder; }; @@ -177,15 +189,18 @@ xml_tree::select_descendant(xml_tree::node_t x, return min; } - xml_tree::node_t xml_tree::select_sibling(xml_tree::node_t x, std::unordered_set *tags) const { xml_tree::node_t sibling = next_sibling(x); - while(!is_nil(sibling) && tags->find(tag(sibling)) == tags->end()) + xml_tree::tag_t t; + while(!is_nil(sibling)) { + t = tag(sibling); + if (tags->find(t) != tags->end()) return sibling; sibling = next_sibling(sibling); - return (sibling); + }; + return sibling; } xml_tree::node_t @@ -225,10 +240,12 @@ void xml_tree::save(int fd, char* s) ufwrite(tag_seq, sizeof(uint), uint_len(bits_per_tag, tag_seq_len), fp); bool disable_tc = text_collection == 0 || text_positions == 0; - ufwrite(&disable_tc, sizeof(bool),1,fp); - text_positions->save(fp); + ufwrite(&disable_tc, sizeof(bool),1,fp); + fprintf(stderr, "whoot\n"); + fflush(stderr); if (!disable_tc) { + text_positions->save(fp); ufwrite(&text_index_type, sizeof(TextCollectionBuilder::index_type_t), 1, fp); @@ -253,8 +270,7 @@ void xml_tree::save(int fd, char* s) fclose(fp); } -//static xml_tree* load(char*, bool, int); -// void print(int, node_t, bool no_text=false); + xml_tree* xml_tree::load(int fd, char* name, bool load_tc, int sf) { FILE *fp; @@ -263,7 +279,6 @@ xml_tree* xml_tree::load(int fd, char* name, bool load_tc, int sf) int i; buffer[1023] = '\0'; fp = fdopen(fd, "r"); - xml_tree *tree = new xml_tree(); tree->par = loadTree(fp); //TODO use new api @@ -576,5 +591,5 @@ void xml_tree::print(int fd, xml_tree::node_t x, bool no_text) text_collection->DeleteText(orig_text - 1); else text_collection->DeleteText(orig_text); - + }