From e14c659f34538d21aca8f1446c39b51a220b309b Mon Sep 17 00:00:00 2001
From: Siqi Ling <lsq0473@gmail.com>
Date: Tue, 12 Jan 2016 15:59:31 +0000
Subject: [PATCH] negociate with Florian for Volke

---
 AMDiS/src/io/Arh3Reader.h         |  2 +-
 AMDiS/src/io/detail/Arh3Reader.cc | 43 +++++++++++++++++++------------
 AMDiS/src/io/detail/Arh3Writer.cc |  9 ++++---
 3 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/AMDiS/src/io/Arh3Reader.h b/AMDiS/src/io/Arh3Reader.h
index f83e6f9d..a1b5d59a 100644
--- a/AMDiS/src/io/Arh3Reader.h
+++ b/AMDiS/src/io/Arh3Reader.h
@@ -24,7 +24,7 @@ namespace AMDiS { namespace io {
   namespace Arh3Reader
   {
     const uint8_t MAJOR = 3;
-    const uint8_t MINOR = 0;
+    const uint8_t MINOR = 1;
     const uint8_t PARH_MAJOR = 1;
     const uint8_t PARH_MINOR = 0;
     const uint8_t TARH_MAJOR = 1;
diff --git a/AMDiS/src/io/detail/Arh3Reader.cc b/AMDiS/src/io/detail/Arh3Reader.cc
index ff241dff..c16fd3af 100644
--- a/AMDiS/src/io/detail/Arh3Reader.cc
+++ b/AMDiS/src/io/detail/Arh3Reader.cc
@@ -31,11 +31,11 @@ namespace AMDiS { namespace io {
 	  ("Cannot read Arh format: this file is not \"%s\" format.\n", id.c_str());
 	  
 	TEST_EXIT(major == major_)
-	  ("Cannot read Arh format: Arh2Reader major version is %i, the file major version is %i. \n",
+	  ("Cannot read Arh format: Arh3Reader major version is %i, the file major version is %i. \n",
 	  major, major_);
 	  
 	TEST_EXIT(minor >= minor_)
-	  ("Cannot read Arh format: ArhReader minor version is %i is smaller than the file minor version %i.\n", 
+	  ("Cannot read Arh format: Arh3Reader minor version is %i is smaller than the file minor version %i.\n", 
 	  minor, minor_);
       }
       
@@ -252,10 +252,10 @@ namespace AMDiS { namespace io {
 	TEST_EXIT(cps == Cpsformat::ZLIB  || 
 		  cps == Cpsformat::BZIP2 ||
 		  cps == Cpsformat::NONE)
-	  ("Cannot read Arh2 file. Currently only support zlib and bzip2 compression.\n");
+	  ("Cannot read Arh3 file. Currently only support zlib and bzip2 compression.\n");
 #else
 	TEST_EXIT(cps == Cpsformat::NONE)
-	  ("HAVE_COMPRESSION OFF. Cannot read compressed Arh2 file.\n");	
+	  ("HAVE_COMPRESSION OFF. Cannot read compressed Arh3 file.\n");	
 #endif
 	  
 	TEST_EXIT(dow == (unsigned)mesh->getGeo(WORLD))
@@ -266,7 +266,6 @@ namespace AMDiS { namespace io {
 	  ("File %s has %d vector(s), which is less than the number of DOFVectors %i in vecs!\n",
 	   filename.c_str(), nValueVectors, vecs.size());
 
-	vector<int> vecsNameLen;
 	vector<string> vecsName;
 	
 	vector<int> filesNameLen;
@@ -276,7 +275,7 @@ namespace AMDiS { namespace io {
 	vector<string> dataformat;
 	vector<int> macroElIndex(nMacroElements);
 	vector<pair<int,int> > macroElSize(nMacroElements); // pos, uncompressed size
-	int fileSize = 0;
+	int fileSize = 0, feSpacesNamesLen = 0, valueNamesLen = 0;
 	
 	vector<vector<int> > feSpaceDOFs;
 	vector<string> AFEDfileName(nFeSpaces);
@@ -299,6 +298,7 @@ namespace AMDiS { namespace io {
 	  uint32_t tmpInt = 0;
 	  file.read(reinterpret_cast<char*>(&tmpInt), 4);
 	  file.read(&AFEDfileName[i][0], tmpInt);
+	  feSpacesNamesLen += tmpInt;
 	  for(int j = 0; j < 4; j++)
 	  {
 	    file.read(reinterpret_cast<char*>(&perDOFs[j]), 4);
@@ -311,7 +311,7 @@ namespace AMDiS { namespace io {
 	  string tmpString("");
 	  uint32_t tmpInt = 0;
 	  file.read(reinterpret_cast<char*>(&tmpInt), 4);
-	  vecsNameLen.push_back(tmpInt);
+	  valueNamesLen += tmpInt;
 	  tmpString.resize(tmpInt, ' ');
 	  file.read(&tmpString[0], tmpInt); //
 	  vecsName.push_back(tmpString);
@@ -323,15 +323,26 @@ namespace AMDiS { namespace io {
 	  dataformat.push_back(tmpString);
 	}
 	
+	int headerLen_= 34 + 
+			nMacroElements * 12 + 12 +
+			feSpacesNamesLen +
+			nFeSpaces * 20 +
+			valueNamesLen +
+			nValueVectors * 12;
+			
+	TEST_EXIT_DBG(headerLen_ <= headerLen) 
+	  ("Header length (without macro file name) is already larger than the header specified in the file.\n");
+	
 	// Read macroFile_nl //TODO
-	uint32_t macroFile_nl = 0;
-	file.read(reinterpret_cast<char*>(&macroFile_nl), 4);
-	if (macroFile_nl > 0) {
-	  string tmpString("");
-	  tmpString.resize(macroFile_nl, ' ');
-	  file.read(&tmpString[0], macroFile_nl);
+	if (headerLen_ < headerLen) {
+	  uint32_t macroFile_nl = 0;
+	  file.read(reinterpret_cast<char*>(&macroFile_nl), 4);
+	  if (macroFile_nl > 0) {
+	    string tmpString("");
+	    tmpString.resize(macroFile_nl, ' ');
+	    file.read(&tmpString[0], macroFile_nl);
+	  }
 	}
-	
 	//================header is over==================//
 	
 	// Adjust and check vecs
@@ -679,10 +690,10 @@ namespace AMDiS { namespace io {
 	TEST_EXIT(cps == Cpsformat::ZLIB  || 
 		  cps == Cpsformat::BZIP2 ||
 		  cps == Cpsformat::NONE)
-	  ("Cannot read Arh2 file. Currently only support zlib and bzip2 compression.\n");
+	  ("Cannot read Arh3 file. Currently only support zlib and bzip2 compression.\n");
 #else
 	TEST_EXIT(cps == Cpsformat::NONE)
-	  ("HAVE_COMPRESSION OFF. Cannot read compressed Arh2 file.\n");	
+	  ("HAVE_COMPRESSION OFF. Cannot read compressed Arh3 file.\n");	
 #endif
       
 	vector<int> macroElIndex(nMacroElements);
diff --git a/AMDiS/src/io/detail/Arh3Writer.cc b/AMDiS/src/io/detail/Arh3Writer.cc
index b34217ad..015d00f7 100644
--- a/AMDiS/src/io/detail/Arh3Writer.cc
+++ b/AMDiS/src/io/detail/Arh3Writer.cc
@@ -300,13 +300,16 @@ namespace AMDiS { namespace io {
 	
 	map<const FiniteElemSpace*, string> AFEDfileName;
 	
-        uint32_t valueNamesLen = 0, fileNamesLen = 0;
+        uint32_t valueNamesLen = 0, feSpacesNamesLen = 0;
         for (size_t i = 0; i < vecs.size(); i++)
           valueNamesLen += vecs[i]->getName().length();
 	
+	// TODO AFEDfileName
 	map<const FiniteElemSpace*, vector<int> >::iterator feSpaceIt;
-	for (feSpaceIt = feSpaces.begin(); feSpaceIt != feSpaces.end(); feSpaceIt++)
+	for (feSpaceIt = feSpaces.begin(); feSpaceIt != feSpaces.end(); feSpaceIt++) {
 	  AFEDfileName.insert(make_pair(feSpaceIt->first, string()));
+	  feSpacesNamesLen += 0;
+	}
     
         uint32_t nValueVectors = vecs.size();
         uint32_t nFeSpaces = feSpaces.size();
@@ -343,7 +346,7 @@ namespace AMDiS { namespace io {
         uint32_t dim = mesh->getDim();
         uint32_t headerLen = 34 +                         //fixed part of header 
 			     nMacroElements * 12 + 12 +   //macroElemnts table
-			     fileNamesLen +		  //feSpaces table
+			     feSpacesNamesLen +		  //feSpaces table
 			     nFeSpaces * 20 + 	          //feSpaces table
 			     valueNamesLen + 	          //value vector table
 			     nValueVectors * 12 +         //also value vector table
-- 
GitLab