+ FILE *fp;\r
+ char filenameaux[1024];\r
+ int i;\r
+\r
+ fp = fdopen(fd, "wa");\r
+ // first stores the tree topology\r
+ saveTree(Par, fp);\r
+\r
+ // stores the table with tag names\r
+ int ntags = TagName->size();\r
+\r
+ ufwrite(&ntags, sizeof(int), 1, fp);\r
+ for (i = 0; i<ntags;i++)\r
+ fprintf(fp, "%s\n",TagName->at(i).c_str());\r
+ \r
+\r
+ // stores the tags\r
+ Tags->save(fp);\r
+ ufwrite(&tags_blen,sizeof(uint),1,fp);\r
+ ufwrite(&tags_len,sizeof(uint),1,fp);\r
+ ufwrite(tags_fix,sizeof(uint),uint_len(tags_blen,tags_len),fp);\r
+\r
+ // flags \r
+ ufwrite(&disable_tc, sizeof(bool),1,fp);\r
+ \r
+ //text positions\r
+ EBVector->save(fp);\r
+ \r
+ // stores the texts \r
+ if (!disable_tc) {\r
+ Text->Save(fp);\r
+ };\r
+\r
+\r
+ }\r
+\r
+\r
+// Load: loads XML tree data structure from file. Returns\r
+// a pointer to the loaded data structure\r
+XMLTree *XMLTree::Load(int fd, bool load_tc,int sample_factor) \r
+ {\r
+\r
+ FILE *fp;\r
+ char buffer[1024];\r
+ XMLTree *XML_Tree;\r
+ int i;\r
+\r
+ buffer[1023] = '\0';\r
+\r
+ fp = fdopen(fd, "r");\r
+\r
+ XML_Tree = new XMLTree();\r
+ STARTTIMER();\r
+ // Load the tree structure\r
+ XML_Tree->Par = (bp *)umalloc(sizeof(bp));\r
+\r
+ loadTree(XML_Tree->Par, fp); \r
+ STOPTIMER(Loading);\r
+ PRINTTIME("Loading parenthesis struct", Loading);\r
+ STARTTIMER();\r
+\r
+ XML_Tree->TagName = new std::vector<std::string>();\r
+ XML_Tree->tIdMap = new std::unordered_map<std::string,int>();\r
+ std::string s;\r
+ int ntags;\r
+ \r
+ // Load the tag names\r
+ ufread(&ntags, sizeof(int), 1, fp);\r
+\r
+ for (i=0; i<ntags;i++) {\r
+ if (fgets(buffer,1022,fp) != buffer)\r
+ throw "Cannot read tag list";\r
+ s = buffer;\r
+ // remove the trailing \n\r
+ s.erase(s.size()-1); \r
+ XML_Tree->TagName->push_back(s); \r
+ XML_Tree->tIdMap->insert(std::make_pair(s,i));\r
+ \r
+ };\r
+ STOPTIMER(Loading);\r
+ PRINTTIME("Loading tag names struct", Loading);\r
+ STARTTIMER();\r
+\r
+ // loads the tag structure\r
+ XML_Tree->Tags = static_sequence::load(fp);\r
+ ufread(&XML_Tree->tags_blen,sizeof(uint),1,fp);\r
+ std::cerr << "tags_blen is "<< XML_Tree->tags_blen <<"\n"; \r
+ ufread(&XML_Tree->tags_len,sizeof(uint),1,fp);\r
+ XML_Tree->tags_fix = new uint[uint_len(XML_Tree->tags_blen,XML_Tree->tags_len)];\r
+ ufread(XML_Tree->tags_fix,sizeof(uint),uint_len(XML_Tree->tags_blen,XML_Tree->tags_len),fp);\r
+\r
+ // TODO ask francisco about this\r
+ /// FIXME:UGLY tests!\r
+ //uint * seq = new uint[XML_Tree->tags_len];\r
+ //for(uint i=0;i<XML_Tree->tags_len;i++)\r
+ // seq[i] = get_field(XML_Tree->tags_fix,XML_Tree->tags_blen,i);\r
+ //cout << "Tags test: " << XML_Tree->Tags->test(seq,XML_Tree->tags_len) << endl;\r
+ //XML_Tree->Tags->test(seq,XML_Tree->tags_len);\r
+ //delete [] seq;\r
+ /// End ugly tests\r
+ \r
+ STOPTIMER(Loading);\r
+ std::cerr << (uint_len(XML_Tree->tags_blen,XML_Tree->tags_len)*sizeof(uint))/(1024*1024) << " MB for tag sequence" << std::endl;\r
+ PRINTTIME("Loading tag struct", Loading);\r
+ STARTTIMER();\r
+\r
+ // loads the flags\r
+ \r
+ ufread(&(XML_Tree->disable_tc), sizeof(bool), 1, fp);\r
+ if (load_tc) {\r
+ XML_Tree->EBVector = static_bitsequence_rrr02::load(fp);\r
+ //XML_Tree->EBVector = static_bitsequence_sdarray::load(fp);\r
+\r
+ STOPTIMER(Loading);\r
+ PRINTTIME("Loading text bitvector struct", Loading);\r
+ STARTTIMER();\r
+\r
+ // Not used \r
+ // loads the texts\r
+ if (!XML_Tree->disable_tc){\r
+ XML_Tree->Text = TextCollection::Load(fp,sample_factor);\r
+ }\r
+ else XML_Tree->Text = NULL;\r
+ STOPTIMER(Loading);\r
+ PRINTTIME("Loading TextCollection", Loading);\r
+ STARTTIMER(); \r