mirror of
https://github.com/libretro/scummvm.git
synced 2025-04-12 11:43:00 +00:00
SWORD25: Removed custom endianness code in persistence code
This is first step towards making saves portable. Binary footprint left intact, so the saves are compatible.
This commit is contained in:
parent
1c711da8fc
commit
18cbb63cba
@ -55,8 +55,8 @@ void InputPersistenceBlock::read(int16 &value) {
|
|||||||
|
|
||||||
void InputPersistenceBlock::read(signed int &value) {
|
void InputPersistenceBlock::read(signed int &value) {
|
||||||
if (checkMarker(SINT_MARKER)) {
|
if (checkMarker(SINT_MARKER)) {
|
||||||
rawRead(&value, sizeof(signed int));
|
value = (int32)READ_LE_UINT32(_iter);
|
||||||
value = convertEndianessFromStorageToSystem(value);
|
_iter += 4;
|
||||||
} else {
|
} else {
|
||||||
value = 0;
|
value = 0;
|
||||||
}
|
}
|
||||||
@ -64,8 +64,8 @@ void InputPersistenceBlock::read(signed int &value) {
|
|||||||
|
|
||||||
void InputPersistenceBlock::read(uint &value) {
|
void InputPersistenceBlock::read(uint &value) {
|
||||||
if (checkMarker(UINT_MARKER)) {
|
if (checkMarker(UINT_MARKER)) {
|
||||||
rawRead(&value, sizeof(uint));
|
value = READ_LE_UINT32(_iter);
|
||||||
value = convertEndianessFromStorageToSystem(value);
|
_iter += 4;
|
||||||
} else {
|
} else {
|
||||||
value = 0;
|
value = 0;
|
||||||
}
|
}
|
||||||
@ -73,8 +73,10 @@ void InputPersistenceBlock::read(uint &value) {
|
|||||||
|
|
||||||
void InputPersistenceBlock::read(float &value) {
|
void InputPersistenceBlock::read(float &value) {
|
||||||
if (checkMarker(FLOAT_MARKER)) {
|
if (checkMarker(FLOAT_MARKER)) {
|
||||||
rawRead(&value, sizeof(float));
|
uint32 tmp[1];
|
||||||
value = convertEndianessFromStorageToSystem(value);
|
tmp[0] = READ_LE_UINT32(_iter);
|
||||||
|
value = ((float *)tmp)[0];
|
||||||
|
_iter += 4;
|
||||||
} else {
|
} else {
|
||||||
value = 0.0f;
|
value = 0.0f;
|
||||||
}
|
}
|
||||||
@ -82,12 +84,11 @@ void InputPersistenceBlock::read(float &value) {
|
|||||||
|
|
||||||
void InputPersistenceBlock::read(bool &value) {
|
void InputPersistenceBlock::read(bool &value) {
|
||||||
if (checkMarker(BOOL_MARKER)) {
|
if (checkMarker(BOOL_MARKER)) {
|
||||||
uint uintBool;
|
uint uintBool = READ_LE_UINT32(_iter);
|
||||||
rawRead(&uintBool, sizeof(float));
|
_iter += 4;
|
||||||
uintBool = convertEndianessFromStorageToSystem(uintBool);
|
|
||||||
value = uintBool == 0 ? false : true;
|
value = uintBool == 0 ? false : true;
|
||||||
} else {
|
} else {
|
||||||
value = 0.0f;
|
value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,13 +118,6 @@ void InputPersistenceBlock::readByteArray(Common::Array<byte> &value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputPersistenceBlock::rawRead(void *destPtr, size_t size) {
|
|
||||||
if (checkBlockSize(size)) {
|
|
||||||
memcpy(destPtr, &*_iter, size);
|
|
||||||
_iter += size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InputPersistenceBlock::checkBlockSize(int size) {
|
bool InputPersistenceBlock::checkBlockSize(int size) {
|
||||||
if (_data.end() - _iter >= size) {
|
if (_data.end() - _iter >= size) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -69,7 +69,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
bool checkMarker(byte marker);
|
bool checkMarker(byte marker);
|
||||||
bool checkBlockSize(int size);
|
bool checkBlockSize(int size);
|
||||||
void rawRead(void *destPtr, size_t size);
|
|
||||||
|
|
||||||
Common::Array<byte> _data;
|
Common::Array<byte> _data;
|
||||||
Common::Array<byte>::const_iterator _iter;
|
Common::Array<byte>::const_iterator _iter;
|
||||||
|
@ -43,19 +43,23 @@ OutputPersistenceBlock::OutputPersistenceBlock() {
|
|||||||
|
|
||||||
void OutputPersistenceBlock::write(signed int value) {
|
void OutputPersistenceBlock::write(signed int value) {
|
||||||
writeMarker(SINT_MARKER);
|
writeMarker(SINT_MARKER);
|
||||||
value = convertEndianessFromSystemToStorage(value);
|
value = TO_LE_32(value);
|
||||||
rawWrite(&value, sizeof(value));
|
rawWrite(&value, sizeof(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPersistenceBlock::write(uint value) {
|
void OutputPersistenceBlock::write(uint value) {
|
||||||
writeMarker(UINT_MARKER);
|
writeMarker(UINT_MARKER);
|
||||||
value = convertEndianessFromSystemToStorage(value);
|
value = TO_LE_32(value);
|
||||||
rawWrite(&value, sizeof(value));
|
rawWrite(&value, sizeof(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPersistenceBlock::write(float value) {
|
void OutputPersistenceBlock::write(float value) {
|
||||||
writeMarker(FLOAT_MARKER);
|
writeMarker(FLOAT_MARKER);
|
||||||
value = convertEndianessFromSystemToStorage(value);
|
uint32 tmp[1];
|
||||||
|
|
||||||
|
((float *)tmp)[0] = value;
|
||||||
|
tmp[0] = TO_LE_32(tmp[0]);
|
||||||
|
|
||||||
rawWrite(&value, sizeof(value));
|
rawWrite(&value, sizeof(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +67,7 @@ void OutputPersistenceBlock::write(bool value) {
|
|||||||
writeMarker(BOOL_MARKER);
|
writeMarker(BOOL_MARKER);
|
||||||
|
|
||||||
uint uintBool = value ? 1 : 0;
|
uint uintBool = value ? 1 : 0;
|
||||||
uintBool = convertEndianessFromSystemToStorage(uintBool);
|
uintBool = TO_LE_32(uintBool);
|
||||||
rawWrite(&uintBool, sizeof(uintBool));
|
rawWrite(&uintBool, sizeof(uintBool));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,48 +64,6 @@ protected:
|
|||||||
BLOCK_MARKER
|
BLOCK_MARKER
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// Endianess Conversions
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Everything is stored in Little Endian
|
|
||||||
// Big Endian Systems will need to be byte swapped during both saving and reading of saved values
|
|
||||||
//
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
static T convertEndianessFromSystemToStorage(T value) {
|
|
||||||
if (isBigEndian())
|
|
||||||
reverseByteOrder(&value);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
static T convertEndianessFromStorageToSystem(T value) {
|
|
||||||
if (isBigEndian())
|
|
||||||
reverseByteOrder(&value);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static bool isBigEndian() {
|
|
||||||
uint dummy = 1;
|
|
||||||
byte *dummyPtr = reinterpret_cast<byte *>(&dummy);
|
|
||||||
return dummyPtr[0] == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
static void swap(T &one, T &two) {
|
|
||||||
T temp = one;
|
|
||||||
one = two;
|
|
||||||
two = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void reverseByteOrder(void *ptr) {
|
|
||||||
// Reverses the byte order of the 32-bit word pointed to by Ptr
|
|
||||||
byte *charPtr = static_cast<byte *>(ptr);
|
|
||||||
swap(charPtr[0], charPtr[3]);
|
|
||||||
swap(charPtr[1], charPtr[2]);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CTASSERT(ex) typedef char ctassert_type[(ex) ? 1 : -1]
|
#define CTASSERT(ex) typedef char ctassert_type[(ex) ? 1 : -1]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user