diff options
Diffstat (limited to 'scumm/resource.cpp')
-rw-r--r-- | scumm/resource.cpp | 220 |
1 files changed, 110 insertions, 110 deletions
diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 3e3ed7b522..421f773f22 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -1370,116 +1370,6 @@ int Scumm::getResourceDataSize(const byte *ptr) const { return READ_BE_UINT32(ptr - 4) - 8; } -ResourceIterator::ResourceIterator(const byte *searchin, bool smallHeader) - : _ptr(searchin), _smallHeader(smallHeader) { - assert(searchin); - if (_smallHeader) { - _size = READ_LE_UINT32(searchin); - _pos = 6; - _ptr = searchin + 6; - } else { - _size = READ_BE_UINT32(searchin + 4); - _pos = 8; - _ptr = searchin + 8; - } - -} - -const byte *ResourceIterator::findNext(uint32 tag) { - uint32 size = 0; - const byte *result = 0; - - if (_smallHeader) { - uint16 smallTag = newTag2Old(tag); - do { - if (_pos >= _size) - return 0; - - result = _ptr; - size = READ_LE_UINT32(result); - if ((int32)size <= 0) - return 0; // Avoid endless loop - - _pos += size; - _ptr += size; - } while (READ_LE_UINT16(result + 4) != smallTag); - } else { - do { - if (_pos >= _size) - return 0; - - result = _ptr; - size = READ_BE_UINT32(result + 4); - if ((int32)size <= 0) - return 0; // Avoid endless loop - - _pos += size; - _ptr += size; - } while (READ_UINT32(result) != tag); - } - - return result; -} - -const byte *findResource(uint32 tag, const byte *searchin) { - uint32 curpos, totalsize, size; - - assert(searchin); - - searchin += 4; - totalsize = READ_BE_UINT32(searchin); - curpos = 8; - searchin += 4; - - while (curpos < totalsize) { - if (READ_UINT32(searchin) == tag) - return searchin; - - size = READ_BE_UINT32(searchin + 4); - if ((int32)size <= 0) { - error("(%c%c%c%c) Not found in %d... illegal block len %d", - tag & 0xFF, (tag >> 8) & 0xFF, (tag >> 16) & 0xFF, (tag >> 24) & 0xFF, 0, size); - return NULL; - } - - curpos += size; - searchin += size; - } - - return NULL; -} - -const byte *findResourceSmall(uint32 tag, const byte *searchin) { - uint32 curpos, totalsize, size; - uint16 smallTag; - - smallTag = newTag2Old(tag); - - assert(searchin); - - totalsize = READ_LE_UINT32(searchin); - searchin += 6; - curpos = 6; - - while (curpos < totalsize) { - size = READ_LE_UINT32(searchin); - - if (READ_LE_UINT16(searchin + 4) == smallTag) - return searchin; - - if ((int32)size <= 0) { - error("(%c%c%c%c) Not found in %d... illegal block len %d", - tag & 0xFF, (tag >> 8) & 0xFF, (tag >> 16) & 0xFF, (tag >> 24) & 0xFF, 0, size); - return NULL; - } - - curpos += size; - searchin += size; - } - - return NULL; -} - void Scumm::lock(int type, int i) { if (!validateResource("Locking", type, i)) return; @@ -1774,6 +1664,116 @@ bool Scumm::isGlobInMemory(int type, int idx) const{ return res.address[type][idx] != NULL; } +ResourceIterator::ResourceIterator(const byte *searchin, bool smallHeader) + : _ptr(searchin), _smallHeader(smallHeader) { + assert(searchin); + if (_smallHeader) { + _size = READ_LE_UINT32(searchin); + _pos = 6; + _ptr = searchin + 6; + } else { + _size = READ_BE_UINT32(searchin + 4); + _pos = 8; + _ptr = searchin + 8; + } + +} + +const byte *ResourceIterator::findNext(uint32 tag) { + uint32 size = 0; + const byte *result = 0; + + if (_smallHeader) { + uint16 smallTag = newTag2Old(tag); + do { + if (_pos >= _size) + return 0; + + result = _ptr; + size = READ_LE_UINT32(result); + if ((int32)size <= 0) + return 0; // Avoid endless loop + + _pos += size; + _ptr += size; + } while (READ_LE_UINT16(result + 4) != smallTag); + } else { + do { + if (_pos >= _size) + return 0; + + result = _ptr; + size = READ_BE_UINT32(result + 4); + if ((int32)size <= 0) + return 0; // Avoid endless loop + + _pos += size; + _ptr += size; + } while (READ_UINT32(result) != tag); + } + + return result; +} + +const byte *findResource(uint32 tag, const byte *searchin) { + uint32 curpos, totalsize, size; + + assert(searchin); + + searchin += 4; + totalsize = READ_BE_UINT32(searchin); + curpos = 8; + searchin += 4; + + while (curpos < totalsize) { + if (READ_UINT32(searchin) == tag) + return searchin; + + size = READ_BE_UINT32(searchin + 4); + if ((int32)size <= 0) { + error("(%c%c%c%c) Not found in %d... illegal block len %d", + tag & 0xFF, (tag >> 8) & 0xFF, (tag >> 16) & 0xFF, (tag >> 24) & 0xFF, 0, size); + return NULL; + } + + curpos += size; + searchin += size; + } + + return NULL; +} + +const byte *findResourceSmall(uint32 tag, const byte *searchin) { + uint32 curpos, totalsize, size; + uint16 smallTag; + + smallTag = newTag2Old(tag); + + assert(searchin); + + totalsize = READ_LE_UINT32(searchin); + searchin += 6; + curpos = 6; + + while (curpos < totalsize) { + size = READ_LE_UINT32(searchin); + + if (READ_LE_UINT16(searchin + 4) == smallTag) + return searchin; + + if ((int32)size <= 0) { + error("(%c%c%c%c) Not found in %d... illegal block len %d", + tag & 0xFF, (tag >> 8) & 0xFF, (tag >> 16) & 0xFF, (tag >> 24) & 0xFF, 0, size); + return NULL; + } + + curpos += size; + searchin += size; + } + + return NULL; +} + uint16 newTag2Old(uint32 oldTag) { switch (oldTag) { case (MKID('RMHD')): |