openmohaa/code/gamespy/sc/sciSerialize.c

172 lines
4.6 KiB
C
Raw Normal View History

2023-02-04 21:00:01 +01:00
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include "sciSerialize.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeInt8(gsi_u8* theCursor, gsi_i8 theValue)
{
// Copy int8 value to possibly misaligned destination
gsi_u8* dst = (gsi_u8*)theCursor;
*dst++ = (gsi_u8)theValue;
return (gsi_u8*)dst;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeInt16(gsi_u8* theCursor, gsi_i16 theValue)
{
// Convert to network byte order
gsi_i16 netValue = (gsi_i16)htons(theValue);
// Copy int16 value to possibly misaligned destination
gsi_u8* dst = (gsi_u8*)theCursor;
gsi_u8* src = (gsi_u8*)&netValue;
*dst++ = *src++;
*dst++ = *src++;
return (gsi_u8*)dst;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeInt32(gsi_u8* theCursor, gsi_i32 theValue)
{
// Convert to network byte order
gsi_i32 netValue = (gsi_i32)htonl(theValue);
// Copy int32 value to possibly misaligned destination
gsi_u8* dst = (gsi_u8*)theCursor;
gsi_u8* src = (gsi_u8*)&netValue;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
return (gsi_u8*)dst;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeInt64(gsi_u8* theCursor, gsi_i64 theValue)
{
// Convert to network byte order
//gsi_i32 netValue = (gsi_i32)htonl(theValue);
// Copy int32 value to possibly misaligned destination
gsi_u8* dst = (gsi_u8*)theCursor;
gsi_u8* src = (gsi_u8*)&theValue;
#ifdef GSI_BIG_ENDIAN
dst[0] = src[0];
dst[1] = src[1];
dst[2] = src[2];
dst[3] = src[3];
dst[4] = src[4];
dst[5] = src[5];
dst[6] = src[6];
dst[7] = src[7];
#else
dst[0] = src[7];
dst[1] = src[6];
dst[2] = src[5];
dst[3] = src[4];
dst[4] = src[3];
dst[5] = src[2];
dst[6] = src[1];
dst[7] = src[0];
#endif
return (gsi_u8*)dst;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeFloat(gsi_u8* theCursor, float theValue)
{
unsigned char netValue[4];
gsi_u8 *dst, *src;
#if defined(GSI_BIG_ENDIAN)
//swap byte ordering for floats to little endian - htonl doesn't work
gsiFloatSwap(netValue, theValue);
#else
memcpy(netValue, &theValue, 4);
#endif
dst = (gsi_u8*)theCursor;
src = (gsi_u8*)&netValue;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
return (gsi_u8*)dst;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeKey(gsi_u8* theCursor, gsi_u16 theKey)
{
return sciSerializeInt16(theCursor, (gsi_i16)theKey);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeDataLength(gsi_u8* theCursor, gsi_u32 theDataLength)
{
return sciSerializeInt32(theCursor, (gsi_i32)theDataLength);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
gsi_u8* sciSerializeGUID(gsi_u8* theCursor, const gsi_u8 theGUID[SC_CONNECTION_GUID_SIZE])
{
// a GUID is a string comprised of an int, two shorts and eight bytes
// 6B29FC40-CA47-1067-B31D-00DD010662DA
gsi_u32 anInt = 0;
gsi_u32 aShort1 = 0;
gsi_u32 aShort2 = 0;
gsi_u32 aIntArray[8];
gsi_u8 aByteArray[8];
int i=0;
sscanf((char *)theGUID, "%8x", &anInt);
sscanf((char *)theGUID+9, "%4x", &aShort1);
sscanf((char *)theGUID+14, "%4x", &aShort2);
sscanf((char *)theGUID+19, "%2x", &aIntArray[0]);
sscanf((char *)theGUID+21, "%2x", &aIntArray[1]);
sscanf((char *)theGUID+24, "%2x%2x%2x%2x%2x%2x", &aIntArray[2],
&aIntArray[3], &aIntArray[4], &aIntArray[5],
&aIntArray[6], &aIntArray[7]);
for (i=0; i < 8; i++)
aByteArray[i] = (gsi_u8)aIntArray[i];
theCursor = sciSerializeInt32(theCursor, (gsi_i32)anInt);
theCursor = sciSerializeInt16(theCursor, (gsi_i16)aShort1);
theCursor = sciSerializeInt16(theCursor, (gsi_i16)aShort2);
memcpy(theCursor, aByteArray, 8);
theCursor += 8;
return theCursor;
}