From 432ae5ad57e307178fe3767e412cb1784bf0fe1f Mon Sep 17 00:00:00 2001 From: Nipun Garg Date: Tue, 28 May 2019 17:37:43 +0530 Subject: HDB: Add the find functions to the file-manager --- engines/hdb/file-manager.cpp | 68 +++++++++++++++++++++++++++++++++++--------- engines/hdb/file-manager.h | 23 +++++++++++---- 2 files changed, 71 insertions(+), 20 deletions(-) (limited to 'engines/hdb') diff --git a/engines/hdb/file-manager.cpp b/engines/hdb/file-manager.cpp index 1530c64d12..a6c12f32b5 100644 --- a/engines/hdb/file-manager.cpp +++ b/engines/hdb/file-manager.cpp @@ -27,15 +27,15 @@ namespace HDB { -bool FileMan::openMSD(const Common::String &filename) { +bool FileMan::openMPC(const Common::String &filename) { uint32 offset; - if (!_msdFile->open(filename)) { + if (!_mpcFile->open(filename)) { error("FileMan::openMSD(): Error reading the MSD file"); return false; } - _msdFile->read(&dataHeader.id, 4); + _mpcFile->read(&dataHeader.id, 4); if (dataHeader.id == MKTAG('M', 'P', 'C', 'C')) { _compressed = true; @@ -45,25 +45,25 @@ bool FileMan::openMSD(const Common::String &filename) { else if (dataHeader.id == MKTAG('M', 'P', 'C', 'U')) { _compressed = false; - offset = _msdFile->readUint32LE(); - _msdFile->seek((int32)offset, SEEK_SET); + offset = _mpcFile->readUint32LE(); + _mpcFile->seek((int32)offset, SEEK_SET); // Note: The MPC archive format assumes the offset to be uint32, // but Common::File::seek() takes the offset as int32. - dataHeader.dirSize = _msdFile->readUint32LE(); + dataHeader.dirSize = _mpcFile->readUint32LE(); for (uint32 fileIndex = 0; fileIndex < dataHeader.dirSize; fileIndex++) { - MSDEntry *dirEntry = new MSDEntry(); + MPCEntry *dirEntry = new MPCEntry(); for (int fileNameIndex = 0; fileNameIndex < 64; fileNameIndex++) { - dirEntry->filename[fileNameIndex] = _msdFile->readByte(); + dirEntry->filename[fileNameIndex] = _mpcFile->readByte(); } - dirEntry->offset = _msdFile->readUint32LE(); - dirEntry->length = _msdFile->readUint32LE(); - dirEntry->ulength = _msdFile->readUint32LE(); - dirEntry->type = (DataType)_msdFile->readUint32LE(); + dirEntry->offset = _mpcFile->readUint32LE(); + dirEntry->length = _mpcFile->readUint32LE(); + dirEntry->ulength = _mpcFile->readUint32LE(); + dirEntry->type = (DataType)_mpcFile->readUint32LE(); _dir.push_back(dirEntry); } @@ -77,9 +77,49 @@ bool FileMan::openMSD(const Common::String &filename) { } -void FileMan::closeMSD() { +void FileMan::closeMPC() { _dir.clear(); - _msdFile->close(); + _mpcFile->close(); +} + +MPCEntry **FileMan::findFirstData(char *string, DataType type) { + Common::String fileString; + + for (MPCIterator it = _dir.begin(); it != _dir.end(); it++) { + fileString = (*it)->filename; + if (fileString.contains(string)) { + if ((*it)->type == type) { + return it; + } + } + } + return NULL; +} + +MPCEntry **FileMan::findNextData(MPCIterator begin) { + Common::String fileString; + + for (MPCIterator it = begin+1; it != _dir.end(); it++) { + fileString = (*it)->filename; + if (fileString.contains((*begin)->filename)) { + if ((*it)->type == (*begin)->type) { + return it; + } + } + } + return NULL; +} + +int FileMan::findAmount(char *string, DataType type) { + int count = 0; + + MPCIterator it = findFirstData(string, type); + while (it && (*it)->type == type) { + count++; + it = findNextData(it); + } + + return count; } } // End of Namespace HDB diff --git a/engines/hdb/file-manager.h b/engines/hdb/file-manager.h index 5b754cd981..38be6844fd 100644 --- a/engines/hdb/file-manager.h +++ b/engines/hdb/file-manager.h @@ -27,6 +27,8 @@ #include "common/file.h" #include "common/error.h" +#define MPCIterator Common::Array::iterator + namespace HDB { // Each entry in a MSD file is of the following types @@ -42,7 +44,7 @@ enum DataType { ENDOFTYPES }; -struct MSDEntry { +struct MPCEntry { char filename[64]; // filename int32 offset; // offset in MSD file of data int32 length; // compressed length of data @@ -88,8 +90,8 @@ struct CharInfo { class FileMan { private: - Common::File *_msdFile; - Common::Array _dir; + Common::File *_mpcFile; + Common::Array _dir; int _numEntries; bool _compressed; @@ -100,10 +102,19 @@ public: uint32 dirSize; } dataHeader; - long readOffset; + uint32 readOffset; - bool openMSD(const Common::String &filename); - void closeMSD(); + bool openMPC(const Common::String &filename); + void closeMPC(); + /* + TODO: Implement the loadData functions for the various + DataTypes as they are encountered. + + void loadData(char *string, uint32 *length); + */ + MPCEntry **findFirstData(char *string, DataType type); + MPCEntry **findNextData(MPCIterator it); + int findAmount(char *string, DataType type); }; -- cgit v1.2.3