add support for serialization/writing DNA on big endian machines
fix for swapping endianness for nested array of structures
This commit is contained in:
@@ -341,6 +341,7 @@ static int name_is_array(char* name, int* dim1, int* dim2) {
|
|||||||
// ----------------------------------------------------- //
|
// ----------------------------------------------------- //
|
||||||
void bDNA::init(char *data, int len, bool swap)
|
void bDNA::init(char *data, int len, bool swap)
|
||||||
{
|
{
|
||||||
|
printf("swap = %d\n",swap);
|
||||||
int *intPtr=0;short *shtPtr=0;
|
int *intPtr=0;short *shtPtr=0;
|
||||||
char *cp = 0;int dataLen =0;long nr=0;
|
char *cp = 0;int dataLen =0;long nr=0;
|
||||||
intPtr = (int*)data;
|
intPtr = (int*)data;
|
||||||
|
|||||||
@@ -140,8 +140,11 @@ void bFile::parseHeader()
|
|||||||
else if (VOID_IS_8) mFlags |= FD_BITS_VARIES;
|
else if (VOID_IS_8) mFlags |= FD_BITS_VARIES;
|
||||||
|
|
||||||
// swap endian...
|
// swap endian...
|
||||||
if (header[8]=='V' && littleEndian ==1)
|
if (header[8]=='V')
|
||||||
mFlags |= FD_ENDIAN_SWAP;
|
{
|
||||||
|
if (littleEndian ==1)
|
||||||
|
mFlags |= FD_ENDIAN_SWAP;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
if (littleEndian==0)
|
if (littleEndian==0)
|
||||||
mFlags |= FD_ENDIAN_SWAP;
|
mFlags |= FD_ENDIAN_SWAP;
|
||||||
@@ -199,7 +202,10 @@ void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLengt
|
|||||||
}
|
}
|
||||||
|
|
||||||
mMemoryDNA = new bDNA();
|
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]!='*')
|
if (strc[0] >= first && name[0]!='*')
|
||||||
{
|
{
|
||||||
int old_nr = mFileDNA->getReverseType(type);
|
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
|
else
|
||||||
{
|
{
|
||||||
//int arrayLenOld = mFileDNA->getArraySize(name);
|
//int arrayLenOld = mFileDNA->getArraySize(name);
|
||||||
int arrayLen = mFileDNA->getArraySizeNew(strc[1]);
|
int arrayLen = mFileDNA->getArraySizeNew(strc[1]);
|
||||||
//assert(arrayLenOld == arrayLen);
|
//assert(arrayLenOld == arrayLen);
|
||||||
|
|
||||||
swapData(buf, strc[0], arrayLen);
|
swapData(buf, strc[0], arrayLen);
|
||||||
}
|
}
|
||||||
buf+=size;
|
buf+=size;
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ public:
|
|||||||
#define BT_SHAPE_CODE MAKE_ID('S','H','A','P')
|
#define BT_SHAPE_CODE MAKE_ID('S','H','A','P')
|
||||||
#define BT_ARRAY_CODE MAKE_ID('A','R','A','Y')
|
#define BT_ARRAY_CODE MAKE_ID('A','R','A','Y')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class btDefaultSerializer : public btSerializer
|
class btDefaultSerializer : public btSerializer
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -113,19 +115,24 @@ protected:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void initDNA(const char* bdna,int dnalen)
|
void initDNA(const char* bdnaOrg,int dnalen)
|
||||||
{
|
{
|
||||||
///was already initialized
|
///was already initialized
|
||||||
if (m_dna)
|
if (m_dna)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
int littleEndian= 1;
|
||||||
|
littleEndian= ((char*)&littleEndian)[0];
|
||||||
|
|
||||||
|
|
||||||
m_dna = btAlignedAlloc(dnalen,16);
|
m_dna = btAlignedAlloc(dnalen,16);
|
||||||
memcpy(m_dna,bdna,dnalen);
|
memcpy(m_dna,bdnaOrg,dnalen);
|
||||||
m_dnaLength = dnalen;
|
m_dnaLength = dnalen;
|
||||||
|
|
||||||
int *intPtr=0;short *shtPtr=0;
|
int *intPtr=0;
|
||||||
|
short *shtPtr=0;
|
||||||
char *cp = 0;int dataLen =0;long nr=0;
|
char *cp = 0;int dataLen =0;long nr=0;
|
||||||
intPtr = (int*)bdna;
|
intPtr = (int*)m_dna;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SDNA (4 bytes) (magic number)
|
SDNA (4 bytes) (magic number)
|
||||||
@@ -135,15 +142,18 @@ protected:
|
|||||||
<string>
|
<string>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (strncmp((const char*)bdna, "SDNA", 4)==0)
|
if (strncmp((const char*)m_dna, "SDNA", 4)==0)
|
||||||
{
|
{
|
||||||
// skip ++ NAME
|
// skip ++ NAME
|
||||||
intPtr++; intPtr++;
|
intPtr++; intPtr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse names
|
// Parse names
|
||||||
|
if (!littleEndian)
|
||||||
|
*intPtr = btSwapEndian(*intPtr);
|
||||||
|
|
||||||
dataLen = *intPtr;
|
dataLen = *intPtr;
|
||||||
|
|
||||||
intPtr++;
|
intPtr++;
|
||||||
|
|
||||||
cp = (char*)intPtr;
|
cp = (char*)intPtr;
|
||||||
@@ -173,6 +183,9 @@ protected:
|
|||||||
intPtr = (int*)cp;
|
intPtr = (int*)cp;
|
||||||
assert(strncmp(cp, "TYPE", 4)==0); intPtr++;
|
assert(strncmp(cp, "TYPE", 4)==0); intPtr++;
|
||||||
|
|
||||||
|
if (!littleEndian)
|
||||||
|
*intPtr = btSwapEndian(*intPtr);
|
||||||
|
|
||||||
dataLen = *intPtr;
|
dataLen = *intPtr;
|
||||||
intPtr++;
|
intPtr++;
|
||||||
|
|
||||||
@@ -210,6 +223,8 @@ protected:
|
|||||||
shtPtr = (short*)intPtr;
|
shtPtr = (short*)intPtr;
|
||||||
for (int i=0; i<dataLen; i++, shtPtr++)
|
for (int i=0; i<dataLen; i++, shtPtr++)
|
||||||
{
|
{
|
||||||
|
if (!littleEndian)
|
||||||
|
shtPtr[0] = btSwapEndian(shtPtr[0]);
|
||||||
mTlens.push_back(shtPtr[0]);
|
mTlens.push_back(shtPtr[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +245,9 @@ protected:
|
|||||||
cp = (char*)intPtr;
|
cp = (char*)intPtr;
|
||||||
assert(strncmp(cp, "STRC", 4)==0); intPtr++;
|
assert(strncmp(cp, "STRC", 4)==0); intPtr++;
|
||||||
|
|
||||||
dataLen = *intPtr;
|
if (!littleEndian)
|
||||||
|
*intPtr = btSwapEndian(*intPtr);
|
||||||
|
dataLen = *intPtr ;
|
||||||
intPtr++;
|
intPtr++;
|
||||||
|
|
||||||
|
|
||||||
@@ -238,7 +255,25 @@ protected:
|
|||||||
for (int i=0; i<dataLen; i++)
|
for (int i=0; i<dataLen; i++)
|
||||||
{
|
{
|
||||||
mStructs.push_back (shtPtr);
|
mStructs.push_back (shtPtr);
|
||||||
shtPtr+= (2*shtPtr[1])+2;
|
|
||||||
|
if (!littleEndian)
|
||||||
|
{
|
||||||
|
shtPtr[0]= btSwapEndian(shtPtr[0]);
|
||||||
|
shtPtr[1]= btSwapEndian(shtPtr[1]);
|
||||||
|
|
||||||
|
int len = shtPtr[1];
|
||||||
|
shtPtr+= 2;
|
||||||
|
|
||||||
|
for (int a=0; a<len; a++, shtPtr+=2)
|
||||||
|
{
|
||||||
|
shtPtr[0]= btSwapEndian(shtPtr[0]);
|
||||||
|
shtPtr[1]= btSwapEndian(shtPtr[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
shtPtr+= (2*shtPtr[1])+2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// build reverse lookups
|
// build reverse lookups
|
||||||
|
|||||||
Reference in New Issue
Block a user