X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=XMLTree.cpp;h=cdfe95296d6e4310ac04356d18e374af0688600d;hb=39ee9d4c866fd5e4ba478ef65dc7e714e80c0b91;hp=f155d3e8e18ec4c55f3171fdc0b19894e2e7fdc4;hpb=683339b3175e9eb1cbc88eaa28a3817cb94b48b4;p=SXSI%2FXMLTree.git diff --git a/XMLTree.cpp b/XMLTree.cpp index f155d3e..cdfe952 100644 --- a/XMLTree.cpp +++ b/XMLTree.cpp @@ -105,7 +105,15 @@ void XMLTree::Save(unsigned char *filename) // stores the texts if (!disable_tc) Text->Save(fp); - + if (!disable_tc){ + int st = CachedText.size(); + ufwrite(&st, sizeof(int),1,fp); + for (int i = 0; i< CachedText.size(); ++i){ + st = CachedText.at(i).size(); + ufwrite(&st, sizeof(int),1,fp); + ufwrite(CachedText.at(i).c_str(),sizeof(char),(1+strlen(CachedText.at(i).c_str())),fp); + }; + }; fclose(fp); } @@ -192,11 +200,27 @@ XMLTree *XMLTree::Load(unsigned char *filename, int sample_rate_text) if (!XML_Tree->disable_tc){ XML_Tree->Text = TextCollection::InitTextCollection(sample_rate_text); XML_Tree->Text->Load(fp,sample_rate_text); + int sst; + int st; + ufread(&sst, sizeof(int),1,fp); + for (int i=0;iCachedText.push_back(cppstr); + free(str); + }; + } else XML_Tree->Text = NULL; s_text = ftell(fp) - s_text; + + + + fclose(fp); std::cerr << "Tree part is " << s_tree/1024 << " Kbytes,\n" @@ -268,6 +292,9 @@ int XMLTree::SubtreeTags(treeNode x, TagType tag) fprintf(stderr, "Error: data structure has not been constructed properly\n"); exit(1); } + if (x == Root()) + x = first_child(Par,x); + int s = x + 2*subtree_size(Par, x) - 1; @@ -368,7 +395,7 @@ TagType XMLTree::Tag(treeNode x) fprintf(stderr, "Error: data structure has not been constructed properly\n"); exit(1); } - + return Tags->access(node2tagpos(x)); } @@ -496,6 +523,9 @@ treeNode XMLTree::TaggedDesc(treeNode x, TagType tag) int r, s; treeNode y; + if (isleaf(Par,x)) + return NULLT; + r = (int) Tags->rank(tag, node2tagpos(x)); s = (int) Tags->select(tag, r+1); if (s == -1) return NULLT; // there is no such node @@ -504,6 +534,28 @@ treeNode XMLTree::TaggedDesc(treeNode x, TagType tag) else return y; } +// TaggedNext(x,tag): returns the first node tagged tag with larger preorder than x +// Returns NULLT if there is none. +treeNode XMLTree::TaggedNext(treeNode x, TagType tag) + { + if (!finished) { + fprintf(stderr, "Error: data structure has not been constructed properly\n"); + exit(1); + } + + int r, s; + treeNode y; + if (x==NULLT) + return NULLT; + + r = (int) Tags->rank(tag, node2tagpos(x)); + s = (int) Tags->select(tag, r+1); + if (s == -1) return NULLT; // there is no such node + y = tagpos2node(s); // transforms the tag position into a node position + return (y<=x ? NULLT : y); + } + + // TaggedPrec(x,tag): returns the first node tagged tag with smaller preorder than x and not an // ancestor of x. Returns NULLT if there is none. treeNode XMLTree::TaggedPrec(treeNode x, TagType tag) @@ -539,6 +591,9 @@ treeNode XMLTree::TaggedFoll(treeNode x, TagType tag) } int r, s; + if (x ==NULLT || x == Root()|| (next_sibling(Par,x) == -1 )) + return NULLT; + r = (int) Tags->rank(tag, node2tagpos(next_sibling(Par, x))-1); s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag. if (s==-1) return NULLT; @@ -811,7 +866,7 @@ int XMLTree::NewOpenTag(unsigned char *tagname) tags_aux[npar] = i; // inserts the new tag id within the preorder sequence of tags npar++; - + return 1; } @@ -884,6 +939,8 @@ int XMLTree::NewText(unsigned char *s) } Text->InsertText(s); + string cpps = (char*) s; + CachedText.push_back(cpps); return 1; // success }