add support for serialization/writing DNA on big endian machines

fix for swapping endianness for nested array of structures
This commit is contained in:
erwin.coumans
2010-01-28 10:56:38 +00:00
parent 0814473528
commit ae0e78efd8
3 changed files with 442 additions and 389 deletions

View File

@@ -140,8 +140,11 @@ void bFile::parseHeader()
else if (VOID_IS_8) mFlags |= FD_BITS_VARIES;
// swap endian...
if (header[8]=='V' && littleEndian ==1)
mFlags |= FD_ENDIAN_SWAP;
if (header[8]=='V')
{
if (littleEndian ==1)
mFlags |= FD_ENDIAN_SWAP;
}
else
if (littleEndian==0)
mFlags |= FD_ENDIAN_SWAP;
@@ -199,7 +202,10 @@ void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLengt
}
mMemoryDNA = new bDNA();
mMemoryDNA->init(memDna,memDnaLength);
int littleEndian= 1;
littleEndian= ((char*)&littleEndian)[0];
mMemoryDNA->init(memDna,memDnaLength,littleEndian==0);
@@ -644,14 +650,25 @@ void bFile::swapStruct(int dna_nr, char *data)
if (strc[0] >= first && name[0]!='*')
{
int old_nr = mFileDNA->getReverseType(type);
swapStruct(old_nr,buf);
int arrayLen = mFileDNA->getArraySizeNew(strc[1]);
if (arrayLen==1)
{
swapStruct(old_nr,buf);
} else
{
char* tmpBuf = buf;
for (int i=0;i<arrayLen;i++)
{
swapStruct(old_nr,tmpBuf);
tmpBuf+=size/arrayLen;
}
}
}
else
{
//int arrayLenOld = mFileDNA->getArraySize(name);
int arrayLen = mFileDNA->getArraySizeNew(strc[1]);
//assert(arrayLenOld == arrayLen);
swapData(buf, strc[0], arrayLen);
}
buf+=size;