diff options
Diffstat (limited to 'engines/sci/engine/seg_manager.cpp')
-rw-r--r-- | engines/sci/engine/seg_manager.cpp | 46 |
1 files changed, 11 insertions, 35 deletions
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 4d3e6f754e..b18d76e1a7 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -54,6 +54,7 @@ SegManager::SegManager(ResourceManager *resMan) { createClassTable(); } +// Destroy the object, free the memorys if allocated before SegManager::~SegManager() { resetSegMan(); } @@ -76,29 +77,10 @@ void SegManager::resetSegMan() { Hunks_seg_id = 0; // Reinitialize class table - _classTable.clear(); + _classtable.clear(); createClassTable(); } -void SegManager::initSysStrings() { - sysStrings = (SystemStrings *)allocSegment(new SystemStrings(), &sysStringsSegment); - - // Allocate static buffer for savegame and CWD directories - SystemString *strSaveDir = &sysStrings->_strings[SYS_STRING_SAVEDIR]; - strSaveDir->_name = "savedir"; - strSaveDir->_maxSize = MAX_SAVE_DIR_SIZE; - strSaveDir->_value = (char *)calloc(MAX_SAVE_DIR_SIZE, sizeof(char)); - // Set the savegame dir (actually, we set it to a fake value, - // since we cannot let the game control where saves are stored) - ::strcpy(strSaveDir->_value, ""); - - // Allocate static buffer for the parser base - SystemString *strParserBase = &sysStrings->_strings[SYS_STRING_PARSER_BASE]; - strParserBase->_name = "parser-base"; - strParserBase->_maxSize = MAX_PARSER_BASE; - strParserBase->_value = (char *)calloc(MAX_PARSER_BASE, sizeof(char)); -} - SegmentId SegManager::findFreeSegment() const { // FIXME: This is a very crude approach: We find a free segment id by scanning // from the start. This can be slow if the number of segments becomes large. @@ -174,7 +156,7 @@ int SegManager::deallocate(SegmentId seg, bool recursive) { } bool SegManager::isHeapObject(reg_t pos) { - const Object *obj = getObject(pos); + Object *obj = getObject(pos); if (obj == NULL || (obj && obj->isFreed())) return false; Script *scr = getScriptIfLoaded(pos.segment); @@ -241,7 +223,7 @@ Object *SegManager::getObject(reg_t pos) { warning("getObject(): Trying to get an invalid object"); } else if (mobj->getType() == SEG_TYPE_SCRIPT) { Script *scr = (Script *)mobj; - if (pos.offset <= scr->getBufSize() && pos.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET + if (pos.offset <= scr->_bufSize && pos.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(scr->_buf + pos.offset)) { obj = scr->getObject(pos.offset); } @@ -252,7 +234,7 @@ Object *SegManager::getObject(reg_t pos) { } const char *SegManager::getObjectName(reg_t pos) { - const Object *obj = getObject(pos); + Object *obj = getObject(pos); if (!obj) return "<no such object>"; @@ -293,7 +275,7 @@ reg_t SegManager::findObjectByName(const Common::String &name, int index) { // It's a script or a clone table, scan all objects in it for (; idx < max_index; ++idx) { - const Object *obj = NULL; + Object *obj = NULL; reg_t objpos; objpos.offset = 0; objpos.segment = i; @@ -411,6 +393,10 @@ DataStack *SegManager::allocateStack(int size, SegmentId *segid) { return retval; } +SystemStrings *SegManager::allocateSysStrings(SegmentId *segid) { + return (SystemStrings *)allocSegment(new SystemStrings(), segid); +} + void SegManager::freeHunkEntry(reg_t addr) { if (addr.isNull()) { warning("Attempt to free a Hunk from a null address"); @@ -499,7 +485,7 @@ void SegManager::reconstructClones() { continue; CloneTable::Entry &seeker = ct->_table[j]; - const Object *baseObj = getObject(seeker.getSpeciesSelector()); + Object *baseObj = getObject(seeker.getSpeciesSelector()); seeker.cloneFromObject(baseObj); if (!baseObj) warning("Clone entry without a base class: %d", j); @@ -537,16 +523,6 @@ Node *SegManager::allocateNode(reg_t *addr) { return &(table->_table[offset]); } -reg_t SegManager::newNode(reg_t value, reg_t key) { - reg_t nodebase; - Node *n = allocateNode(&nodebase); - n->pred = n->succ = NULL_REG; - n->key = key; - n->value = value; - - return nodebase; -} - List *SegManager::lookupList(reg_t addr) { if (getSegmentType(addr.segment) != SEG_TYPE_LISTS) { warning("Attempt to use non-list %04x:%04x as list", PRINT_REG(addr)); |