[Scummvm-cvs-logs] SF.net SVN: scummvm: [29046] scummvm/trunk/engines/agi/preagi_winnie.cpp
sev at users.sourceforge.net
sev at users.sourceforge.net
Sun Sep 23 14:02:34 CEST 2007
Revision: 29046
http://scummvm.svn.sourceforge.net/scummvm/?rev=29046&view=rev
Author: sev
Date: 2007-09-23 05:02:34 -0700 (Sun, 23 Sep 2007)
Log Message:
-----------
Make readRoom() truly alignment- and endian-safe
Modified Paths:
--------------
scummvm/trunk/engines/agi/preagi_winnie.cpp
Modified: scummvm/trunk/engines/agi/preagi_winnie.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_winnie.cpp 2007-09-23 11:54:26 UTC (rev 29045)
+++ scummvm/trunk/engines/agi/preagi_winnie.cpp 2007-09-23 12:02:34 UTC (rev 29046)
@@ -62,6 +62,8 @@
uint32 Winnie::readRoom(int iRoom, uint8 *buffer, WTP_ROOM_HDR &roomHdr) {
char szFile[256] = {0};
+ int i;
+
if (_vm->getPlatform() == Common::kPlatformPC)
sprintf(szFile, IDS_WTP_ROOM_DOS, iRoom);
else if (_vm->getPlatform() == Common::kPlatformAmiga)
@@ -82,37 +84,39 @@
file.read(buffer, filelen);
file.close();
- memcpy(&roomHdr, buffer, sizeof(WTP_ROOM_HDR));
- if (_vm->getPlatform() == Common::kPlatformPC || _vm->getPlatform() == Common::kPlatformC64) {
- roomHdr.ofsPic = TO_LE_16(roomHdr.ofsPic);
- roomHdr.fileLen = TO_LE_16(roomHdr.fileLen);
- roomHdr.reserved0 = TO_LE_16(roomHdr.reserved0);
- roomHdr.reserved1 = TO_LE_16(roomHdr.reserved1);
- for (byte i = 0; i < IDI_WTP_MAX_BLOCK; i++) {
- roomHdr.ofsDesc[i] = TO_LE_16(roomHdr.ofsDesc[i]);
- roomHdr.ofsBlock[i] = TO_LE_16(roomHdr.ofsBlock[i]);
- for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++)
- roomHdr.opt[i].ofsOpt[j] = TO_LE_16(roomHdr.opt[i].ofsOpt[j]);
- }
- for (byte i = 0; i < IDI_WTP_MAX_STR; i++)
- roomHdr.ofsStr[i] = TO_LE_16(roomHdr.ofsStr[i]);
- roomHdr.reserved2 = TO_LE_32(roomHdr.reserved2);
- } else if (_vm->getPlatform() == Common::kPlatformAmiga) {
- roomHdr.ofsPic = TO_BE_16(roomHdr.ofsPic);
- roomHdr.fileLen = TO_BE_16(roomHdr.fileLen);
- roomHdr.reserved0 = TO_BE_16(roomHdr.reserved0);
- roomHdr.reserved1 = TO_BE_16(roomHdr.reserved1);
- for (byte i = 0; i < IDI_WTP_MAX_BLOCK; i++) {
- roomHdr.ofsDesc[i] = TO_BE_16(roomHdr.ofsDesc[i]);
- roomHdr.ofsBlock[i] = TO_BE_16(roomHdr.ofsBlock[i]);
- for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++)
- roomHdr.opt[i].ofsOpt[j] = TO_BE_16(roomHdr.opt[i].ofsOpt[j]);
- }
- for (byte i = 0; i < IDI_WTP_MAX_STR; i++)
- roomHdr.ofsStr[i] = TO_BE_16(roomHdr.ofsStr[i]);
- roomHdr.reserved2 = TO_BE_32(roomHdr.reserved2);
- }
+ byte isBigEndian = !(_vm->getPlatform() == Common::kPlatformPC || _vm->getPlatform() == Common::kPlatformC64);
+ Common::MemoryReadStreamEndian readS(buffer, filelen, isBigEndian);
+
+ roomHdr.roomNumber = readS.readByte();
+ roomHdr.objId = readS.readByte();
+ roomHdr.ofsPic = readS.readUint16();
+ roomHdr.fileLen = readS.readUint16();
+ roomHdr.reserved0 = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_DIR; i++)
+ roomHdr.roomNew[i] = readS.readUint16();
+
+ roomHdr.objX = readS.readUint16();
+ roomHdr.objY = readS.readUint16();
+
+ roomHdr.reserved1 = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
+ roomHdr.ofsDesc[i] = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
+ roomHdr.ofsBlock[i] = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_STR; i++)
+ roomHdr.ofsStr[i] = readS.readUint16();
+
+ roomHdr.reserved2 = readS.readUint32();
+
+ for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
+ for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++)
+ roomHdr.opt[i].ofsOpt[j] = readS.readUint16();
+
return filelen;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list