Commit 9d42b397 authored by Andrea Zoli's avatar Andrea Zoli
Browse files

Handle ARCH_BIGENDIAN cases.

parent 3425f6c3
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -36,9 +36,25 @@
#define PACKETNOTRECOGNIZED 0
/// define NULL 0

//0 for x86
//1 for motorola
#define ARCH_BIGENDIAN 0
/*
 * Little Endian or Big Endian ?
 * Overwrite the #define below if you know your architecture endianess
 */
#if defined (__GLIBC__)
#  include <endian.h>
#  if (__BYTE_ORDER == __BIG_ENDIAN)
#     define ARCH_BIGENDIAN 1
#  endif
#elif (defined(__BIG_ENDIAN__) || defined(__BIG_ENDIAN) || defined(_BIG_ENDIAN)) && !(defined(__LITTLE_ENDIAN__) || defined(__LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN))
#  define ARCH_BIGENDIAN 1
#elif defined(__sparc) || defined(__sparc__) \
   || defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \
   || defined(__hpux)  || defined(__hppa) \
   || defined(_MIPSEB) || defined(__s390__)
#  define ARCH_BIGENDIAN 1
#else
/* Little Endian assumed. PDP Endian and other very rare endian format are unsupported. */
#endif

enum CompressionAlgorithms  { NONE, LZ4 };

+0 −41
Original line number Diff line number Diff line
@@ -423,47 +423,6 @@ bool PacketLib::ByteStream::setWord(dword start, word value)
        stream[start] = b1;
        stream[start+1] = b2;
	}
	
	/*
	if(!ARCH_BIGENDIAN && !bigendian )
	{
		//noswap
        stream[start] = b1;
        stream[start+1] = b2;
    }
	if(ARCH_BIGENDIAN && bigendian )
	{
		//noswap
        stream[start] = b1;
        stream[start+1] = b2;
    }
	if(!ARCH_BIGENDIAN && bigendian )
	{
        /// Swap
        stream[start] = b2;
        stream[start+1] = b1;
    }
	if(ARCH_BIGENDIAN && !bigendian )
	{
        /// Swap
        stream[start] = b2;
        stream[start+1] = b1;
    }
	 */
	   /*
    if((bigendian && !ARCH_BIGENDIAN) || (!bigendian && ARCH_BIGENDIAN))
    {
        /// Swap
        stream[start] = b2;
        stream[start+1] = b1;
    }
    else
    {
        /// No swap for x86
        stream[start] = b1;
        stream[start+1] = b2;
    }
		*/
    return true;

}
+5 −1
Original line number Diff line number Diff line
@@ -616,7 +616,11 @@ ByteStreamPtr Packet::encodeAndSetData(ByteStreamPtr sourceDataVariable)
		if(sourceDataVariable->size() != size() - dimPacketStartingFixedPart - dimPacketTail)
			throw new PacketException("the size of the sourceDataVariable is wrong");
		bool swapped = false;
		if((!ARCH_BIGENDIAN && bigendian) || (ARCH_BIGENDIAN && !bigendian)) {
#ifdef ARCH_BIGENDIAN
		if(!bigendian) {
#else
		if(bigendian) {
#endif
			sourceDataVariable->swapWord();
			swapped = true;
		}
+38 −44
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@
 ***************************************************************************/

#include "PartOfPacket.h"
#include "PacketLibDefinition.h"

//#define DEBUG 1

using namespace PacketLib;

@@ -227,7 +230,6 @@ bool PartOfPacket::decode() {
	if(decoded)
		return true;
	Field* ftemp;
    //this->stream->setStream(s, 0, s->size() - 1);
    /// The pointer is converted from byte to void. The reading from file allows the correct data interpretation
    /// for big or little endian machines
    byte* stream = (byte*) this->stream->stream;
@@ -243,53 +245,38 @@ bool PartOfPacket::decode() {
    /// number of shift for elaboration
    short numberOfShift = 0;
    /// number of fields
    //unsigned nof = getNumberOfFields();
    word nof = numberOfFields;
    for(word i=0; i<nof; i++)
    {
        ftemp =  fields[i];
        dimbit = ftemp->size();
        /// Temporary word to be modified for the elaboration
        byte bh = *(stream + posword);
        byte bl = *(stream + posword + 1);
        //word wordtemp = *(stream + posword);
        word wordtemp;
        if (this->stream->isBigendian())
            wordtemp = bh * 256 + bl;
        else
            wordtemp = bl * 256 + bh;
        numberOfShift = 16 - (posbit + dimbit);
        //parte nuova
        /// \remarks if the condition is not fulfilled, the code is equal to the versions older than PacketLib 1.3.3
        if(numberOfShift < 0)   
        {
            short currentDimBit = dimbit + numberOfShift;
            dimbit = abs(numberOfShift);
            ftemp->value = (wordtemp & pattern[currentDimBit] ) << dimbit;
            posbit = 0;
            posword += 2;
            bh = *(stream + posword);
            bl = *(stream + posword + 1);
            if (this->stream->isBigendian())
                wordtemp = bh * 256 + bl;
            else
                wordtemp = bl * 256 + bh;
		// swap bytes if the machine is bigendian and the stream is little endian and vice-versa.
#ifdef ARCH_BIGENDIAN
		if (!this->stream->isBigendian()) {
			byte bless = *(stream + posword);
			byte bmost = *(stream + posword + 1);
			wordtemp = (bmost << 8) + bless;
#else
		if (this->stream->isBigendian()) {
			byte bmost = *(stream + posword);
			byte bless = *(stream + posword + 1);
			wordtemp = (bmost << 8) | bless;
#ifdef DEBUG
			std::cout << "word: " << wordtemp << std::endl;
#endif
#endif
		} else {
            wordtemp = *( (word*)(stream + posword) );
#ifdef DEBUG
			std::cout << "word: " << wordtemp << std::endl;
#endif
		}

        numberOfShift = 16 - (posbit + dimbit);
        wordtemp = wordtemp >> numberOfShift;
            /*		cout << i << ": " << ftemp->value << endl;
            		cout << i << ": " << (ftemp->value << currentDimBit) << endl;
            		cout << i << ": " << wordtemp << endl;*/
            ftemp->value = ftemp->value | (wordtemp & pattern[dimbit]);
            /*		cout << i << ": " << ftemp->value << endl;
            		cout << i << ": " << (wordtemp & pattern[dimbit]) << endl;*/
        }
        else
        {
            //questa fa parte della parte vecchia
            wordtemp = wordtemp >> numberOfShift;
        ftemp->value = wordtemp & pattern[dimbit];
        }
        /// Upgrade of pobit and posword
        posbit += dimbit;
        if(posbit >=16)
@@ -302,8 +289,6 @@ bool PartOfPacket::decode() {
    return true;
}



char** PartOfPacket::printValue(const char* addString)
{
	decode();
@@ -497,6 +482,9 @@ float PartOfPacket::getFieldValue_32f(word index)
        float f;	
    } u;
    u.i =  ( (dword) getFieldValue(index) << 16) | ( (dword) getFieldValue(index + 1) );
#ifdef DEBUG
	std::cout << "float: " << u.i << std::endl;
#endif
    return u.f;
}

@@ -515,10 +503,10 @@ double PartOfPacket::getFieldValue_64f(word index)
        double d;	
    } u;

#ifdef __x86_64__
    u.i = (unsigned long) ( (unsigned long)  getFieldValue(index) << (48)) | ( (unsigned long) getFieldValue(index + 1) << (32)) | ( (unsigned long) getFieldValue(index + 2) << (16)) | ( (unsigned long) getFieldValue(index + 3) );
#ifdef DEBUG
	std::cout << "double: " << u.d << std::endl;
#endif

    return u.d;
}

@@ -572,6 +560,9 @@ signed long PartOfPacket::getFieldValue_32i(word index)
{
    long l;
    l = (long)(getFieldValue(index) << 16) | (long)getFieldValue(index + 1);
#ifdef DEBUG
	std::cout << "int32: " << l << std::endl;
#endif
    return l;
}

@@ -588,6 +579,9 @@ unsigned long PartOfPacket::getFieldValue_32ui(word index)
{
    dword l;
    l = (dword)(getFieldValue(index) << 16) | (dword)getFieldValue(index + 1);
#ifdef DEBUG
	std::cout << "uint32: " << l << std::endl;
#endif
    return l;
}