aboutsummaryrefslogtreecommitdiff
path: root/engines/cge/btfile.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2011-08-13 18:06:09 +1000
committerPaul Gilbert2011-08-13 18:06:09 +1000
commit177da650dde785abbee7ed446e71115839082517 (patch)
tree714fef150768db7c4108dedaca5704257fad7a3c /engines/cge/btfile.cpp
parentb02e34cade624362bee157dab364094c1710e548 (diff)
downloadscummvm-rg350-177da650dde785abbee7ed446e71115839082517.tar.gz
scummvm-rg350-177da650dde785abbee7ed446e71115839082517.tar.bz2
scummvm-rg350-177da650dde785abbee7ed446e71115839082517.zip
CGE: Fix loading of vol.cat file to be endian safe
Diffstat (limited to 'engines/cge/btfile.cpp')
-rw-r--r--engines/cge/btfile.cpp41
1 files changed, 35 insertions, 6 deletions
diff --git a/engines/cge/btfile.cpp b/engines/cge/btfile.cpp
index 1f987340b7..7ecfa94e9b 100644
--- a/engines/cge/btfile.cpp
+++ b/engines/cge/btfile.cpp
@@ -31,6 +31,7 @@
#include "cge/cge.h"
#include "common/debug.h"
#include "common/debug-channels.h"
+#include "common/memstream.h"
namespace CGE {
@@ -61,8 +62,8 @@ void BtFile::putPage(int lev, bool hard) {
debugC(1, kCGEDebugFile, "BtFile::putPage(%d, %s)", lev, hard ? "true" : "false");
if (hard || _buff[lev]._updt) {
- seek(_buff[lev]._pgNo * sizeof(BtPage));
- write((uint8 *) _buff[lev]._page, sizeof(BtPage));
+ seek(_buff[lev]._pgNo * kBtSize);
+ write((uint8 *) _buff[lev]._page, kBtSize);
_buff[lev]._updt = false;
}
}
@@ -72,17 +73,25 @@ BtPage *BtFile::getPage(int lev, uint16 pgn) {
debugC(1, kCGEDebugFile, "BtFile::getPage(%d, %d)", lev, pgn);
if (_buff[lev]._pgNo != pgn) {
- int32 pos = pgn * sizeof(BtPage);
+ int32 pos = pgn * kBtSize;
putPage(lev, false);
_buff[lev]._pgNo = pgn;
if (size() > pos) {
- seek((uint32) pgn * sizeof(BtPage));
- read((uint8 *) _buff[lev]._page, sizeof(BtPage));
+ seek((uint32) pgn * kBtSize);
+
+ // Read in the page
+ byte buffer[kBtSize];
+ int bytesRead = read(buffer, kBtSize);
+
+ // Unpack it into the page structure
+ Common::MemoryReadStream stream(buffer, bytesRead, DisposeAfterUse::NO);
+ _buff[lev]._page->read(stream);
+
_buff[lev]._updt = false;
} else {
+ memset(&_buff[lev]._page, 0, kBtSize);
_buff[lev]._page->_hea._count = 0;
_buff[lev]._page->_hea._down = kBtValNone;
- memset(_buff[lev]._page->_data, '\0', sizeof(_buff[lev]._page->_data));
_buff[lev]._updt = true;
}
_buff[lev]._indx = -1;
@@ -152,4 +161,24 @@ void BtFile::make(BtKeypack *keypack, uint16 count) {
}
}
+void BtPage::read(Common::ReadStream &s) {
+ _hea._count = s.readUint16LE();
+ _hea._down = s.readUint16LE();
+
+ if (_hea._down == kBtValNone) {
+ // Leaf list
+ for (int i = 0; i < kBtLeafCount; ++i) {
+ s.read(_lea[i]._key, kBtKeySize);
+ _lea[i]._mark = s.readUint32LE();
+ _lea[i]._size = s.readUint16LE();
+ }
+ } else {
+ // Root index
+ for (int i = 0; i < kBtInnerCount; ++i) {
+ s.read(_inn[i]._key, kBtKeySize);
+ _inn[i]._down = s.readUint16LE();
+ }
+ }
+}
+
} // End of namespace CGE