SCI: Renamed int_hashmap to IntMapper, and added docs that explain that this is *not* a hashmap (at least not a plain hashmap)
svn-id: r38823
This commit is contained in:
parent
6c3a758cf6
commit
35e3364675
9 changed files with 391 additions and 393 deletions
|
@ -1,88 +0,0 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* $URL$
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef INT_HASHMAP_H
|
||||
#define INT_HASHMAP_H
|
||||
|
||||
#include "common/scummsys.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
/*
|
||||
* Defines a hash map that maps values to small integers.
|
||||
* The name "hashmap" here is a bit misleading, because the
|
||||
* value associated to each key are generated automatically,
|
||||
* using the lowest "unused" value.
|
||||
*/
|
||||
|
||||
|
||||
// Assumes that the ints are relatively evenly distributed
|
||||
|
||||
#define DCS_INT_HASH_MAX 255
|
||||
|
||||
|
||||
struct int_hash_map_t {
|
||||
struct node_t {
|
||||
int name;
|
||||
int value;
|
||||
node_t *next;
|
||||
};
|
||||
|
||||
int base_value; // Starts at zero, counts upwards
|
||||
node_t *nodes[DCS_INT_HASH_MAX + 1];
|
||||
node_t *holes; /* List of freed entries to minimize
|
||||
** memory operations and modifications
|
||||
** to base_value */
|
||||
|
||||
void free_node_recursive(node_t *node);
|
||||
|
||||
public:
|
||||
int_hash_map_t();
|
||||
~int_hash_map_t();
|
||||
|
||||
/**
|
||||
* Checks whether a value is in the map, adds it if neccessary.
|
||||
* @param value The value to check for/add
|
||||
* @param add Whether to add the value if it's not in there
|
||||
* @param was_added Set to non-zero iff the value is new, ignored if NULL.
|
||||
* @return The new (or old) index, or -1 if add was zero and
|
||||
* the value couldn't be found
|
||||
*/
|
||||
int check_value(int value, bool add, char *was_added = 0);
|
||||
|
||||
/**
|
||||
* Removes a value from the hash map.
|
||||
* @param value The value to remove
|
||||
* @return The ID of the value, or -1 if it wasn't present
|
||||
*/
|
||||
int remove_value(int value);
|
||||
|
||||
};
|
||||
|
||||
typedef int_hash_map_t *int_hash_map_ptr;
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif // INT_HASHMAP_H
|
|
@ -23,31 +23,31 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "sci/engine/int_hashmap.h"
|
||||
#include "sci/engine/intmap.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
#define HASH_MAX DCS_INT_HASH_MAX
|
||||
#define HASH(x) (x & 0xff)
|
||||
|
||||
int_hash_map_t::int_hash_map_t() {
|
||||
IntMapper::IntMapper() {
|
||||
base_value = 0;
|
||||
memset(nodes, 0, sizeof(nodes));
|
||||
holes = 0;
|
||||
}
|
||||
|
||||
void int_hash_map_t::free_node_recursive(node_t *node) {
|
||||
void IntMapper::free_node_recursive(Node *node) {
|
||||
if (node) {
|
||||
free_node_recursive(node->next);
|
||||
node->next = 0;
|
||||
free(node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int_hash_map_t::~int_hash_map_t() {
|
||||
IntMapper::~IntMapper() {
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= HASH_MAX; i++)
|
||||
for (i = 0; i < DCS_INT_HASH_MAX; i++)
|
||||
free_node_recursive(nodes[i]);
|
||||
|
||||
free_node_recursive(holes);
|
||||
|
@ -56,17 +56,17 @@ int_hash_map_t::~int_hash_map_t() {
|
|||
base_value = -42000;
|
||||
}
|
||||
|
||||
int int_hash_map_t::check_value(int value, bool add, char *was_added) {
|
||||
node_t **node = &(nodes[HASH(value)]);
|
||||
int IntMapper::checkKey(int key, bool add, bool *was_added) {
|
||||
Node **node = &(nodes[HASH(key)]);
|
||||
|
||||
while (*node && (value != (*node)->name))
|
||||
while (*node && (key != (*node)->key))
|
||||
node = &((*node)->next);
|
||||
|
||||
if (was_added)
|
||||
*was_added = 0;
|
||||
*was_added = false;
|
||||
|
||||
if (*node) {
|
||||
return (*node)->value;
|
||||
return (*node)->idx;
|
||||
}
|
||||
// Not found
|
||||
|
||||
|
@ -74,36 +74,36 @@ int int_hash_map_t::check_value(int value, bool add, char *was_added) {
|
|||
return -1;
|
||||
|
||||
if (was_added)
|
||||
*was_added = 1;
|
||||
*was_added = true;
|
||||
|
||||
if (holes) { // Re-use old node
|
||||
(*node) = holes;
|
||||
holes = (*node)->next;
|
||||
(*node)->next = NULL;
|
||||
(*node)->name = value;
|
||||
(*node)->key = key;
|
||||
} else {
|
||||
*node = (node_t*)malloc(sizeof(node_t));
|
||||
(*node)->name = value;
|
||||
(*node)->value = base_value++;
|
||||
*node = (Node*)malloc(sizeof(Node));
|
||||
(*node)->key = key;
|
||||
(*node)->idx = base_value++;
|
||||
(*node)->next = NULL;
|
||||
}
|
||||
|
||||
return (*node)->value;
|
||||
return (*node)->idx;
|
||||
}
|
||||
|
||||
int int_hash_map_t::remove_value(int value) {
|
||||
node_t **node = &(nodes[HASH(value)]);
|
||||
int IntMapper::removeKey(int key) {
|
||||
Node **node = &(nodes[HASH(key)]);
|
||||
|
||||
while (*node && (value != (*node)->name))
|
||||
while (*node && (key != (*node)->key))
|
||||
node = &((*node)->next);
|
||||
|
||||
if (*node) {
|
||||
node_t *oldnode = *node;
|
||||
Node *oldnode = *node;
|
||||
*node = (*node)->next;
|
||||
|
||||
oldnode->next = holes; // Old node is now a 'hole'
|
||||
holes = oldnode;
|
||||
return oldnode->value;
|
||||
return oldnode->key;
|
||||
} else
|
||||
return -1; // Not found
|
||||
}
|
95
engines/sci/engine/intmap.h
Normal file
95
engines/sci/engine/intmap.h
Normal file
|
@ -0,0 +1,95 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* $URL$
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCI_INTMAP_H
|
||||
#define SCI_INTMAP_H
|
||||
|
||||
#include "common/scummsys.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
|
||||
|
||||
|
||||
// Assumes that the ints are relatively evenly distributed
|
||||
enum {
|
||||
DCS_INT_HASH_MAX = 256
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines a map from arbitrary integers to "small" integers, useable as index
|
||||
* into small arrays. This class is somewhat like a hashmap, but not quite:
|
||||
* Unlike a hashmap, it generates the values associated to each key. It does
|
||||
* not try to be very clever about it, either, e.g. using a linked list of
|
||||
* values to keep track of what is mapped where.
|
||||
* Another important feature is that it reclaims unused values when they
|
||||
* are removed.
|
||||
*
|
||||
* All in all, this implementation is not very elegant, and wastes memory.
|
||||
* But it does the job. Any rewrite of this class would have to provide a
|
||||
* way to load the old savegames made using the current implementation.
|
||||
*/
|
||||
struct IntMapper {
|
||||
|
||||
struct Node {
|
||||
int key;
|
||||
int idx;
|
||||
Node *next;
|
||||
};
|
||||
|
||||
int base_value; // Starts at zero, counts upwards
|
||||
Node *nodes[DCS_INT_HASH_MAX];
|
||||
Node *holes; /* List of freed entries to minimize
|
||||
** memory operations and modifications
|
||||
** to base_value */
|
||||
|
||||
void free_node_recursive(Node *node);
|
||||
|
||||
public:
|
||||
IntMapper();
|
||||
~IntMapper();
|
||||
|
||||
/**
|
||||
* Checks whether a key is in the map, adds it if neccessary.
|
||||
* @param value The key to check for/add
|
||||
* @param add Whether to add the key if it's not in there
|
||||
* @param was_added Set to non-zero if and only if the key is new, ignored if NULL.
|
||||
* @return The new (or old) index, or -1 if add was zero and
|
||||
* the key couldn't be found
|
||||
*/
|
||||
int checkKey(int key, bool add, bool *wasAdded = 0);
|
||||
|
||||
/**
|
||||
* Removes a key from the map.
|
||||
* @param key The key to remove
|
||||
* @return The index of the key, or -1 if it wasn't present
|
||||
*/
|
||||
int removeKey(int key);
|
||||
|
||||
};
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif // SCI_INTMAP_H
|
|
@ -200,17 +200,17 @@ int read_menubar_tp(Common::SeekableReadStream *fh, menubar_t **foo, const char
|
|||
void write_mem_obj_tp(Common::WriteStream *fh, mem_obj_t **foo);
|
||||
int read_mem_obj_tp(Common::SeekableReadStream *fh, mem_obj_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_int_hash_map_tp(Common::WriteStream *fh, int_hash_map_t **foo);
|
||||
int read_int_hash_map_tp(Common::SeekableReadStream *fh, int_hash_map_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_songlib_t(Common::WriteStream *fh, songlib_t *foo);
|
||||
int read_songlib_t(Common::SeekableReadStream *fh, songlib_t *foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_int_hash_map_node_tp(Common::WriteStream *fh, int_hash_map_t::node_t **foo);
|
||||
int read_int_hash_map_node_tp(Common::SeekableReadStream *fh, int_hash_map_t::node_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
int read_song_tp(Common::SeekableReadStream *fh, song_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_IntMapperPtr(Common::WriteStream *fh, IntMapper **foo);
|
||||
int read_IntMapperPtr(Common::SeekableReadStream *fh, IntMapper **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_IntMapperNodePtr(Common::WriteStream *fh, IntMapper::Node **foo);
|
||||
int read_IntMapperNodePtr(Common::SeekableReadStream *fh, IntMapper::Node **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_SegManagerPtr(Common::WriteStream *fh, SegManager **foo);
|
||||
int read_SegManagerPtr(Common::SeekableReadStream *fh, SegManager **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
|
@ -238,8 +238,8 @@ TYPE mem_obj_t "mem_obj_t" USING write_mem_obj_t read_mem_obj_t;
|
|||
TYPE mem_obj_ptr "mem_obj_t *" USING write_mem_obj_tp read_mem_obj_tp;
|
||||
TYPE reg_t "reg_t" USING write_reg_t read_reg_t;
|
||||
TYPE size_t "size_t" LIKE int;
|
||||
TYPE int_hash_map_tp "int_hash_map_t *" USING write_int_hash_map_tp read_int_hash_map_tp;
|
||||
TYPE int_hash_map_node_tp "int_hash_map_t::node_t *" USING write_int_hash_map_node_tp read_int_hash_map_node_tp;
|
||||
TYPE IntMapperPtr "IntMapper *" USING write_IntMapperPtr read_IntMapperPtr;
|
||||
TYPE IntMapperNodePtr "IntMapper::Node *" USING write_IntMapperNodePtr read_IntMapperNodePtr;
|
||||
TYPE songlib_t "songlib_t" USING write_songlib_t read_songlib_t;
|
||||
TYPE song_tp "song_t *" USING write_song_tp read_song_tp;
|
||||
TYPE song_iterator_t "song_iterator_t" USING write_song_iterator_t read_song_iterator_t;
|
||||
|
@ -257,9 +257,9 @@ RECORD song_t "song_t" {
|
|||
int hold;
|
||||
}
|
||||
|
||||
RECORD int_hash_map_t "int_hash_map_t" {
|
||||
RECORD IntMapper "IntMapper" {
|
||||
int base_value;
|
||||
int_hash_map_node_tp nodes[STATIC DCS_INT_HASH_MAX+1];
|
||||
IntMapperNodePtr nodes[STATIC DCS_INT_HASH_MAX];
|
||||
}
|
||||
|
||||
RECORD menu_item_t "menu_item_t" {
|
||||
|
@ -291,7 +291,7 @@ RECORD menubar_t "menubar_t" {
|
|||
}
|
||||
|
||||
RECORD SegManager "SegManager" {
|
||||
int_hash_map_tp id_seg_map;
|
||||
IntMapperPtr id_seg_map;
|
||||
mem_obj_ptr heap[DYNAMIC heap_size];
|
||||
int heap_size;
|
||||
int reserved_id;
|
||||
|
@ -417,7 +417,7 @@ RECORD script_t "script_t" {
|
|||
size_t script_size;
|
||||
size_t heap_size;
|
||||
|
||||
int_hash_map_tp obj_indices;
|
||||
IntMapperPtr obj_indices;
|
||||
int exports_nr;
|
||||
int synonyms_nr;
|
||||
int lockers;
|
||||
|
@ -492,36 +492,6 @@ int read_songlib_t(Common::SeekableReadStream *fh, songlib_t *songlib, const cha
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct {
|
||||
int type;
|
||||
const char *name;
|
||||
} mem_obj_string_names[] = {
|
||||
{MEM_OBJ_INVALID, "INVALID"},
|
||||
{MEM_OBJ_SCRIPT, "SCRIPT"},
|
||||
{MEM_OBJ_CLONES, "CLONES"},
|
||||
{MEM_OBJ_LOCALS, "LOCALS"},
|
||||
{MEM_OBJ_STACK, "STACK"},
|
||||
{MEM_OBJ_SYS_STRINGS,"SYS_STRINGS"},
|
||||
{MEM_OBJ_LISTS,"LISTS"},
|
||||
{MEM_OBJ_NODES,"NODES"},
|
||||
{MEM_OBJ_HUNK,"HUNK"},
|
||||
{MEM_OBJ_DYNMEM,"DYNMEM"}};
|
||||
|
||||
int mem_obj_string_to_enum(const char *str) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= MEM_OBJ_MAX; i++) {
|
||||
if (!scumm_stricmp(mem_obj_string_names[i].name, str))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void write_int_hash_map_tp(Common::WriteStream *fh, int_hash_map_t **foo) {
|
||||
%CFSMLWRITE int_hash_map_t *foo INTO fh;
|
||||
}
|
||||
|
||||
void write_song_tp(Common::WriteStream *fh, song_t **foo) {
|
||||
%CFSMLWRITE song_t *foo INTO fh;
|
||||
}
|
||||
|
@ -540,33 +510,37 @@ int read_song_tp(Common::SeekableReadStream *fh, song_t **foo, const char *lastv
|
|||
return 0;
|
||||
}
|
||||
|
||||
int read_int_hash_map_tp(Common::SeekableReadStream *fh, int_hash_map_t **foo, const char *lastval, int *line, int *hiteof) {
|
||||
*foo = new int_hash_map_t;
|
||||
%CFSMLREAD int_hash_map_t (*foo) FROM fh ERRVAR *hiteof FIRSTTOKEN lastval LINECOUNTER *line;
|
||||
void write_IntMapperPtr(Common::WriteStream *fh, IntMapper **foo) {
|
||||
%CFSMLWRITE IntMapper *foo INTO fh;
|
||||
}
|
||||
|
||||
int read_IntMapperPtr(Common::SeekableReadStream *fh, IntMapper **foo, const char *lastval, int *line, int *hiteof) {
|
||||
*foo = new IntMapper();
|
||||
%CFSMLREAD IntMapper (*foo) FROM fh ERRVAR *hiteof FIRSTTOKEN lastval LINECOUNTER *line;
|
||||
(*foo)->holes = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void write_int_hash_map_node_tp(Common::WriteStream *fh, int_hash_map_t::node_t **foo) {
|
||||
void write_IntMapperNodePtr(Common::WriteStream *fh, IntMapper::Node **foo) {
|
||||
if (!(*foo)) {
|
||||
WSprintf(fh, "\\null");
|
||||
} else {
|
||||
WSprintf(fh,"[\n%d=>%d\n", (*foo)->name, (*foo)->value);
|
||||
WSprintf(fh,"[\n%d=>%d\n", (*foo)->key, (*foo)->idx);
|
||||
if ((*foo)->next) {
|
||||
%CFSMLWRITE int_hash_map_node_tp &((*foo)->next) INTO fh;
|
||||
%CFSMLWRITE IntMapperNodePtr &((*foo)->next) INTO fh;
|
||||
} else
|
||||
WSprintf(fh, "L");
|
||||
WSprintf(fh, "]");
|
||||
}
|
||||
}
|
||||
|
||||
int read_int_hash_map_node_tp(Common::SeekableReadStream *fh, int_hash_map_t::node_t **foo, const char *lastval, int *line, int *hiteof) {
|
||||
int read_IntMapperNodePtr(Common::SeekableReadStream *fh, IntMapper::Node **foo, const char *lastval, int *line, int *hiteof) {
|
||||
static char buffer[80];
|
||||
|
||||
if (lastval[0] == '\\') {
|
||||
*foo = NULL; // No hash map node
|
||||
} else {
|
||||
*foo = (int_hash_map_t::node_t*)malloc(sizeof(int_hash_map_t::node_t));
|
||||
*foo = (IntMapper::Node*)malloc(sizeof(IntMapper::Node));
|
||||
if (lastval[0] != '[') {
|
||||
sciprintf("Expected opening bracket in hash_map_node_t on line %d\n", *line);
|
||||
return 1;
|
||||
|
@ -581,12 +555,10 @@ int read_int_hash_map_node_tp(Common::SeekableReadStream *fh, int_hash_map_t::no
|
|||
} // HACK: deliberately no else clause here
|
||||
if (buffer[0] == ']') {
|
||||
break;
|
||||
}
|
||||
else if (buffer[0] == '[') {
|
||||
if (read_int_hash_map_node_tp(fh, &((*foo)->next), buffer, line, hiteof))
|
||||
} else if (buffer[0] == '[') {
|
||||
if (read_IntMapperNodePtr(fh, &((*foo)->next), buffer, line, hiteof))
|
||||
return 1;
|
||||
}
|
||||
else if (sscanf(buffer, "%d=>%d", &((*foo)->name), &((*foo)->value))<2) {
|
||||
} else if (sscanf(buffer, "%d=>%d", &((*foo)->key), &((*foo)->idx))<2) {
|
||||
sciprintf("Error parsing hash_map_node_t on line %d\n", *line);
|
||||
return 1;
|
||||
}
|
||||
|
@ -615,6 +587,32 @@ int read_menubar_tp(Common::SeekableReadStream *fh, menubar_t **foo, const char
|
|||
return *hiteof;
|
||||
}
|
||||
|
||||
static struct {
|
||||
int type;
|
||||
const char *name;
|
||||
} mem_obj_string_names[] = {
|
||||
{MEM_OBJ_INVALID, "INVALID"},
|
||||
{MEM_OBJ_SCRIPT, "SCRIPT"},
|
||||
{MEM_OBJ_CLONES, "CLONES"},
|
||||
{MEM_OBJ_LOCALS, "LOCALS"},
|
||||
{MEM_OBJ_STACK, "STACK"},
|
||||
{MEM_OBJ_SYS_STRINGS,"SYS_STRINGS"},
|
||||
{MEM_OBJ_LISTS,"LISTS"},
|
||||
{MEM_OBJ_NODES,"NODES"},
|
||||
{MEM_OBJ_HUNK,"HUNK"},
|
||||
{MEM_OBJ_DYNMEM,"DYNMEM"}};
|
||||
|
||||
int mem_obj_string_to_enum(const char *str) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= MEM_OBJ_MAX; i++) {
|
||||
if (!scumm_stricmp(mem_obj_string_names[i].name, str))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
||||
WSprintf(fh, "%s\n", mem_obj_string_names[foo->type].name);
|
||||
%CFSMLWRITE int &foo->segmgr_id INTO fh;
|
||||
|
|
|
@ -200,17 +200,17 @@ int read_menubar_tp(Common::SeekableReadStream *fh, menubar_t **foo, const char
|
|||
void write_mem_obj_tp(Common::WriteStream *fh, mem_obj_t **foo);
|
||||
int read_mem_obj_tp(Common::SeekableReadStream *fh, mem_obj_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_int_hash_map_tp(Common::WriteStream *fh, int_hash_map_t **foo);
|
||||
int read_int_hash_map_tp(Common::SeekableReadStream *fh, int_hash_map_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_songlib_t(Common::WriteStream *fh, songlib_t *foo);
|
||||
int read_songlib_t(Common::SeekableReadStream *fh, songlib_t *foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_int_hash_map_node_tp(Common::WriteStream *fh, int_hash_map_t::node_t **foo);
|
||||
int read_int_hash_map_node_tp(Common::SeekableReadStream *fh, int_hash_map_t::node_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
int read_song_tp(Common::SeekableReadStream *fh, song_t **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_IntMapperPtr(Common::WriteStream *fh, IntMapper **foo);
|
||||
int read_IntMapperPtr(Common::SeekableReadStream *fh, IntMapper **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_IntMapperNodePtr(Common::WriteStream *fh, IntMapper::Node **foo);
|
||||
int read_IntMapperNodePtr(Common::SeekableReadStream *fh, IntMapper::Node **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
void write_SegManagerPtr(Common::WriteStream *fh, SegManager **foo);
|
||||
int read_SegManagerPtr(Common::SeekableReadStream *fh, SegManager **foo, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
|
@ -479,10 +479,6 @@ static int _cfsml_read_size_t(Common::SeekableReadStream *fh, size_t* save_struc
|
|||
static void _cfsml_write_list_entry_t(Common::WriteStream *fh, list_entry_t* save_struc);
|
||||
static int _cfsml_read_list_entry_t(Common::SeekableReadStream *fh, list_entry_t* save_struc, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
#line 383 "engines/sci/engine/savegame.cfsml"
|
||||
static void _cfsml_write_int_hash_map_t(Common::WriteStream *fh, int_hash_map_t* save_struc);
|
||||
static int _cfsml_read_int_hash_map_t(Common::SeekableReadStream *fh, int_hash_map_t* save_struc, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
#line 383 "engines/sci/engine/savegame.cfsml"
|
||||
static void _cfsml_write_SegManager(Common::WriteStream *fh, SegManager* save_struc);
|
||||
static int _cfsml_read_SegManager(Common::SeekableReadStream *fh, SegManager* save_struc, const char *lastval, int *line, int *hiteof);
|
||||
|
@ -555,6 +551,10 @@ static int _cfsml_read_EngineState(Common::SeekableReadStream *fh, EngineState*
|
|||
static void _cfsml_write_SavegameMetadata(Common::WriteStream *fh, SavegameMetadata* save_struc);
|
||||
static int _cfsml_read_SavegameMetadata(Common::SeekableReadStream *fh, SavegameMetadata* save_struc, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
#line 383 "engines/sci/engine/savegame.cfsml"
|
||||
static void _cfsml_write_IntMapper(Common::WriteStream *fh, IntMapper* save_struc);
|
||||
static int _cfsml_read_IntMapper(Common::SeekableReadStream *fh, IntMapper* save_struc, const char *lastval, int *line, int *hiteof);
|
||||
|
||||
#line 383 "engines/sci/engine/savegame.cfsml"
|
||||
static void _cfsml_write_menu_t(Common::WriteStream *fh, menu_t* save_struc);
|
||||
static int _cfsml_read_menu_t(Common::SeekableReadStream *fh, menu_t* save_struc, const char *lastval, int *line, int *hiteof);
|
||||
|
@ -1139,112 +1139,6 @@ _cfsml_read_list_entry_t(Common::SeekableReadStream *fh, list_entry_t* save_stru
|
|||
return CFSML_SUCCESS;
|
||||
}
|
||||
|
||||
#line 395 "engines/sci/engine/savegame.cfsml"
|
||||
static void
|
||||
_cfsml_write_int_hash_map_t(Common::WriteStream *fh, int_hash_map_t* save_struc)
|
||||
{
|
||||
#line 412 "engines/sci/engine/savegame.cfsml"
|
||||
WSprintf(fh, "{\n");
|
||||
WSprintf(fh, "base_value = ");
|
||||
_cfsml_write_int(fh, (int*) &(save_struc->base_value));
|
||||
WSprintf(fh, "\n");
|
||||
WSprintf(fh, "nodes = ");
|
||||
int min, max;
|
||||
min = max = DCS_INT_HASH_MAX+1;
|
||||
#line 439 "engines/sci/engine/savegame.cfsml"
|
||||
WSprintf(fh, "[%d][\n", max);
|
||||
for (int i = 0; i < min; i++) {
|
||||
write_int_hash_map_node_tp(fh, &(save_struc->nodes[i]));
|
||||
WSprintf(fh, "\n");
|
||||
}
|
||||
WSprintf(fh, "]");
|
||||
WSprintf(fh, "\n");
|
||||
WSprintf(fh, "}");
|
||||
}
|
||||
|
||||
#line 486 "engines/sci/engine/savegame.cfsml"
|
||||
static int
|
||||
_cfsml_read_int_hash_map_t(Common::SeekableReadStream *fh, int_hash_map_t* save_struc, const char *lastval, int *line, int *hiteof)
|
||||
{
|
||||
#line 541 "engines/sci/engine/savegame.cfsml"
|
||||
char *token;
|
||||
int assignment, closed;
|
||||
|
||||
if (strcmp(lastval, "{")) {
|
||||
_cfsml_error("Reading record int_hash_map_t; expected opening braces in line %d, got \"%s\"\n", *line, lastval);
|
||||
return CFSML_FAILURE;
|
||||
};
|
||||
closed = 0;
|
||||
do {
|
||||
const char *value;
|
||||
token = _cfsml_get_identifier(fh, line, hiteof, &assignment);
|
||||
|
||||
if (!token) {
|
||||
_cfsml_error("Expected token at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
if (!assignment) {
|
||||
if (!strcmp(token, "}"))
|
||||
closed = 1;
|
||||
else {
|
||||
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else {
|
||||
value = "";
|
||||
while (!value || !strcmp(value, ""))
|
||||
value = _cfsml_get_value(fh, line, hiteof);
|
||||
if (!value) {
|
||||
_cfsml_error("Expected token at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
if (!strcmp(token, "base_value")) {
|
||||
#line 690 "engines/sci/engine/savegame.cfsml"
|
||||
if (_cfsml_read_int(fh, (int*) &(save_struc->base_value), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by _cfsml_read_int() for base_value at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else
|
||||
if (!strcmp(token, "nodes")) {
|
||||
#line 604 "engines/sci/engine/savegame.cfsml"
|
||||
if ((value[0] != '[') || (value[strlen(value) - 1] != '[')) {
|
||||
_cfsml_error("Opening brackets expected at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
int max,done,i;
|
||||
// Prepare to restore static array
|
||||
max = DCS_INT_HASH_MAX+1;
|
||||
#line 639 "engines/sci/engine/savegame.cfsml"
|
||||
done = i = 0;
|
||||
do {
|
||||
if (!(value = _cfsml_get_identifier(fh, line, hiteof, NULL))) {
|
||||
#line 647 "engines/sci/engine/savegame.cfsml"
|
||||
_cfsml_error("Token expected at line %d\n", *line);
|
||||
return 1;
|
||||
}
|
||||
if (strcmp(value, "]")) {
|
||||
if (i == max) {
|
||||
_cfsml_error("More elements than space available (%d) in '%s' at line %d\n", max, token, *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
if (read_int_hash_map_node_tp(fh, &(save_struc->nodes[i++]), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by read_int_hash_map_node_tp() for nodes[i++] at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else
|
||||
done = 1;
|
||||
} while (!done);
|
||||
} else
|
||||
#line 699 "engines/sci/engine/savegame.cfsml"
|
||||
{
|
||||
_cfsml_error("int_hash_map_t: Assignment to invalid identifier '%s' in line %d\n", token, *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
}
|
||||
} while (!closed); // Until closing braces are hit
|
||||
return CFSML_SUCCESS;
|
||||
}
|
||||
|
||||
#line 395 "engines/sci/engine/savegame.cfsml"
|
||||
static void
|
||||
_cfsml_write_SegManager(Common::WriteStream *fh, SegManager* save_struc)
|
||||
|
@ -1252,7 +1146,7 @@ _cfsml_write_SegManager(Common::WriteStream *fh, SegManager* save_struc)
|
|||
#line 412 "engines/sci/engine/savegame.cfsml"
|
||||
WSprintf(fh, "{\n");
|
||||
WSprintf(fh, "id_seg_map = ");
|
||||
write_int_hash_map_tp(fh, (int_hash_map_t **) &(save_struc->id_seg_map));
|
||||
write_IntMapperPtr(fh, (IntMapper **) &(save_struc->id_seg_map));
|
||||
WSprintf(fh, "\n");
|
||||
WSprintf(fh, "heap = ");
|
||||
int min, max;
|
||||
|
@ -1332,8 +1226,8 @@ _cfsml_read_SegManager(Common::SeekableReadStream *fh, SegManager* save_struc, c
|
|||
}
|
||||
if (!strcmp(token, "id_seg_map")) {
|
||||
#line 690 "engines/sci/engine/savegame.cfsml"
|
||||
if (read_int_hash_map_tp(fh, (int_hash_map_t **) &(save_struc->id_seg_map), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by read_int_hash_map_tp() for id_seg_map at line %d\n", *line);
|
||||
if (read_IntMapperPtr(fh, (IntMapper **) &(save_struc->id_seg_map), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by read_IntMapperPtr() for id_seg_map at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else
|
||||
|
@ -3150,6 +3044,112 @@ _cfsml_read_SavegameMetadata(Common::SeekableReadStream *fh, SavegameMetadata* s
|
|||
return CFSML_SUCCESS;
|
||||
}
|
||||
|
||||
#line 395 "engines/sci/engine/savegame.cfsml"
|
||||
static void
|
||||
_cfsml_write_IntMapper(Common::WriteStream *fh, IntMapper* save_struc)
|
||||
{
|
||||
#line 412 "engines/sci/engine/savegame.cfsml"
|
||||
WSprintf(fh, "{\n");
|
||||
WSprintf(fh, "base_value = ");
|
||||
_cfsml_write_int(fh, (int*) &(save_struc->base_value));
|
||||
WSprintf(fh, "\n");
|
||||
WSprintf(fh, "nodes = ");
|
||||
int min, max;
|
||||
min = max = DCS_INT_HASH_MAX;
|
||||
#line 439 "engines/sci/engine/savegame.cfsml"
|
||||
WSprintf(fh, "[%d][\n", max);
|
||||
for (int i = 0; i < min; i++) {
|
||||
write_IntMapperNodePtr(fh, &(save_struc->nodes[i]));
|
||||
WSprintf(fh, "\n");
|
||||
}
|
||||
WSprintf(fh, "]");
|
||||
WSprintf(fh, "\n");
|
||||
WSprintf(fh, "}");
|
||||
}
|
||||
|
||||
#line 486 "engines/sci/engine/savegame.cfsml"
|
||||
static int
|
||||
_cfsml_read_IntMapper(Common::SeekableReadStream *fh, IntMapper* save_struc, const char *lastval, int *line, int *hiteof)
|
||||
{
|
||||
#line 541 "engines/sci/engine/savegame.cfsml"
|
||||
char *token;
|
||||
int assignment, closed;
|
||||
|
||||
if (strcmp(lastval, "{")) {
|
||||
_cfsml_error("Reading record IntMapper; expected opening braces in line %d, got \"%s\"\n", *line, lastval);
|
||||
return CFSML_FAILURE;
|
||||
};
|
||||
closed = 0;
|
||||
do {
|
||||
const char *value;
|
||||
token = _cfsml_get_identifier(fh, line, hiteof, &assignment);
|
||||
|
||||
if (!token) {
|
||||
_cfsml_error("Expected token at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
if (!assignment) {
|
||||
if (!strcmp(token, "}"))
|
||||
closed = 1;
|
||||
else {
|
||||
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else {
|
||||
value = "";
|
||||
while (!value || !strcmp(value, ""))
|
||||
value = _cfsml_get_value(fh, line, hiteof);
|
||||
if (!value) {
|
||||
_cfsml_error("Expected token at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
if (!strcmp(token, "base_value")) {
|
||||
#line 690 "engines/sci/engine/savegame.cfsml"
|
||||
if (_cfsml_read_int(fh, (int*) &(save_struc->base_value), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by _cfsml_read_int() for base_value at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else
|
||||
if (!strcmp(token, "nodes")) {
|
||||
#line 604 "engines/sci/engine/savegame.cfsml"
|
||||
if ((value[0] != '[') || (value[strlen(value) - 1] != '[')) {
|
||||
_cfsml_error("Opening brackets expected at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
int max,done,i;
|
||||
// Prepare to restore static array
|
||||
max = DCS_INT_HASH_MAX;
|
||||
#line 639 "engines/sci/engine/savegame.cfsml"
|
||||
done = i = 0;
|
||||
do {
|
||||
if (!(value = _cfsml_get_identifier(fh, line, hiteof, NULL))) {
|
||||
#line 647 "engines/sci/engine/savegame.cfsml"
|
||||
_cfsml_error("Token expected at line %d\n", *line);
|
||||
return 1;
|
||||
}
|
||||
if (strcmp(value, "]")) {
|
||||
if (i == max) {
|
||||
_cfsml_error("More elements than space available (%d) in '%s' at line %d\n", max, token, *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
if (read_IntMapperNodePtr(fh, &(save_struc->nodes[i++]), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by read_IntMapperNodePtr() for nodes[i++] at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else
|
||||
done = 1;
|
||||
} while (!done);
|
||||
} else
|
||||
#line 699 "engines/sci/engine/savegame.cfsml"
|
||||
{
|
||||
_cfsml_error("IntMapper: Assignment to invalid identifier '%s' in line %d\n", token, *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
}
|
||||
} while (!closed); // Until closing braces are hit
|
||||
return CFSML_SUCCESS;
|
||||
}
|
||||
|
||||
#line 395 "engines/sci/engine/savegame.cfsml"
|
||||
static void
|
||||
_cfsml_write_menu_t(Common::WriteStream *fh, menu_t* save_struc)
|
||||
|
@ -3788,7 +3788,7 @@ _cfsml_write_script_t(Common::WriteStream *fh, script_t* save_struc)
|
|||
_cfsml_write_size_t(fh, (size_t*) &(save_struc->heap_size));
|
||||
WSprintf(fh, "\n");
|
||||
WSprintf(fh, "obj_indices = ");
|
||||
write_int_hash_map_tp(fh, (int_hash_map_t **) &(save_struc->obj_indices));
|
||||
write_IntMapperPtr(fh, (IntMapper **) &(save_struc->obj_indices));
|
||||
WSprintf(fh, "\n");
|
||||
WSprintf(fh, "exports_nr = ");
|
||||
_cfsml_write_int(fh, (int*) &(save_struc->exports_nr));
|
||||
|
@ -3896,8 +3896,8 @@ _cfsml_read_script_t(Common::SeekableReadStream *fh, script_t* save_struc, const
|
|||
} else
|
||||
if (!strcmp(token, "obj_indices")) {
|
||||
#line 690 "engines/sci/engine/savegame.cfsml"
|
||||
if (read_int_hash_map_tp(fh, (int_hash_map_t **) &(save_struc->obj_indices), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by read_int_hash_map_tp() for obj_indices at line %d\n", *line);
|
||||
if (read_IntMapperPtr(fh, (IntMapper **) &(save_struc->obj_indices), value, line, hiteof)) {
|
||||
_cfsml_error("Token expected by read_IntMapperPtr() for obj_indices at line %d\n", *line);
|
||||
return CFSML_FAILURE;
|
||||
}
|
||||
} else
|
||||
|
@ -4089,48 +4089,13 @@ int read_songlib_t(Common::SeekableReadStream *fh, songlib_t *songlib, const cha
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct {
|
||||
int type;
|
||||
const char *name;
|
||||
} mem_obj_string_names[] = {
|
||||
{MEM_OBJ_INVALID, "INVALID"},
|
||||
{MEM_OBJ_SCRIPT, "SCRIPT"},
|
||||
{MEM_OBJ_CLONES, "CLONES"},
|
||||
{MEM_OBJ_LOCALS, "LOCALS"},
|
||||
{MEM_OBJ_STACK, "STACK"},
|
||||
{MEM_OBJ_SYS_STRINGS,"SYS_STRINGS"},
|
||||
{MEM_OBJ_LISTS,"LISTS"},
|
||||
{MEM_OBJ_NODES,"NODES"},
|
||||
{MEM_OBJ_HUNK,"HUNK"},
|
||||
{MEM_OBJ_DYNMEM,"DYNMEM"}};
|
||||
|
||||
int mem_obj_string_to_enum(const char *str) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= MEM_OBJ_MAX; i++) {
|
||||
if (!scumm_stricmp(mem_obj_string_names[i].name, str))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void write_int_hash_map_tp(Common::WriteStream *fh, int_hash_map_t **foo) {
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
// Auto-generated CFSML data writer code
|
||||
_cfsml_write_int_hash_map_t(fh, *foo);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 523 "engines/sci/engine/savegame.cfsml"
|
||||
}
|
||||
|
||||
void write_song_tp(Common::WriteStream *fh, song_t **foo) {
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
// Auto-generated CFSML data writer code
|
||||
_cfsml_write_song_t(fh, *foo);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 527 "engines/sci/engine/savegame.cfsml"
|
||||
#line 497 "engines/sci/engine/savegame.cfsml"
|
||||
}
|
||||
|
||||
song_iterator_t *build_iterator(EngineState *s, int song_nr, int type, songit_id_t id);
|
||||
|
@ -4164,15 +4129,24 @@ int read_song_tp(Common::SeekableReadStream *fh, song_t **foo, const char *lastv
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 537 "engines/sci/engine/savegame.cfsml"
|
||||
#line 507 "engines/sci/engine/savegame.cfsml"
|
||||
(*foo)->delay = 0;
|
||||
(*foo)->it = NULL;
|
||||
(*foo)->next_playing = (*foo)->next_stopping = (*foo)->next = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int read_int_hash_map_tp(Common::SeekableReadStream *fh, int_hash_map_t **foo, const char *lastval, int *line, int *hiteof) {
|
||||
*foo = new int_hash_map_t;
|
||||
void write_IntMapperPtr(Common::WriteStream *fh, IntMapper **foo) {
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
// Auto-generated CFSML data writer code
|
||||
_cfsml_write_IntMapper(fh, *foo);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 515 "engines/sci/engine/savegame.cfsml"
|
||||
}
|
||||
|
||||
int read_IntMapperPtr(Common::SeekableReadStream *fh, IntMapper **foo, const char *lastval, int *line, int *hiteof) {
|
||||
*foo = new IntMapper();
|
||||
// Auto-generated CFSML data reader code
|
||||
#line 763 "engines/sci/engine/savegame.cfsml"
|
||||
{
|
||||
|
@ -4182,7 +4156,7 @@ int read_int_hash_map_tp(Common::SeekableReadStream *fh, int_hash_map_t **foo, c
|
|||
const char *_cfsml_inp = lastval;
|
||||
{
|
||||
#line 789 "engines/sci/engine/savegame.cfsml"
|
||||
_cfsml_error = _cfsml_read_int_hash_map_t(fh, (*foo), _cfsml_inp, &(*line), &_cfsml_eof);
|
||||
_cfsml_error = _cfsml_read_IntMapper(fh, (*foo), _cfsml_inp, &(*line), &_cfsml_eof);
|
||||
}
|
||||
#line 794 "engines/sci/engine/savegame.cfsml"
|
||||
*hiteof = _cfsml_error;
|
||||
|
@ -4197,36 +4171,36 @@ int read_int_hash_map_tp(Common::SeekableReadStream *fh, int_hash_map_t **foo, c
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 546 "engines/sci/engine/savegame.cfsml"
|
||||
#line 520 "engines/sci/engine/savegame.cfsml"
|
||||
(*foo)->holes = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void write_int_hash_map_node_tp(Common::WriteStream *fh, int_hash_map_t::node_t **foo) {
|
||||
void write_IntMapperNodePtr(Common::WriteStream *fh, IntMapper::Node **foo) {
|
||||
if (!(*foo)) {
|
||||
WSprintf(fh, "\\null");
|
||||
} else {
|
||||
WSprintf(fh,"[\n%d=>%d\n", (*foo)->name, (*foo)->value);
|
||||
WSprintf(fh,"[\n%d=>%d\n", (*foo)->key, (*foo)->idx);
|
||||
if ((*foo)->next) {
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
// Auto-generated CFSML data writer code
|
||||
write_int_hash_map_node_tp(fh, &((*foo)->next));
|
||||
write_IntMapperNodePtr(fh, &((*foo)->next));
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 557 "engines/sci/engine/savegame.cfsml"
|
||||
#line 531 "engines/sci/engine/savegame.cfsml"
|
||||
} else
|
||||
WSprintf(fh, "L");
|
||||
WSprintf(fh, "]");
|
||||
}
|
||||
}
|
||||
|
||||
int read_int_hash_map_node_tp(Common::SeekableReadStream *fh, int_hash_map_t::node_t **foo, const char *lastval, int *line, int *hiteof) {
|
||||
int read_IntMapperNodePtr(Common::SeekableReadStream *fh, IntMapper::Node **foo, const char *lastval, int *line, int *hiteof) {
|
||||
static char buffer[80];
|
||||
|
||||
if (lastval[0] == '\\') {
|
||||
*foo = NULL; // No hash map node
|
||||
} else {
|
||||
*foo = (int_hash_map_t::node_t*)malloc(sizeof(int_hash_map_t::node_t));
|
||||
*foo = (IntMapper::Node*)malloc(sizeof(IntMapper::Node));
|
||||
if (lastval[0] != '[') {
|
||||
sciprintf("Expected opening bracket in hash_map_node_t on line %d\n", *line);
|
||||
return 1;
|
||||
|
@ -4241,12 +4215,10 @@ int read_int_hash_map_node_tp(Common::SeekableReadStream *fh, int_hash_map_t::no
|
|||
} // HACK: deliberately no else clause here
|
||||
if (buffer[0] == ']') {
|
||||
break;
|
||||
}
|
||||
else if (buffer[0] == '[') {
|
||||
if (read_int_hash_map_node_tp(fh, &((*foo)->next), buffer, line, hiteof))
|
||||
} else if (buffer[0] == '[') {
|
||||
if (read_IntMapperNodePtr(fh, &((*foo)->next), buffer, line, hiteof))
|
||||
return 1;
|
||||
}
|
||||
else if (sscanf(buffer, "%d=>%d", &((*foo)->name), &((*foo)->value))<2) {
|
||||
} else if (sscanf(buffer, "%d=>%d", &((*foo)->key), &((*foo)->idx))<2) {
|
||||
sciprintf("Error parsing hash_map_node_t on line %d\n", *line);
|
||||
return 1;
|
||||
}
|
||||
|
@ -4263,7 +4235,7 @@ void write_menubar_tp(Common::WriteStream *fh, menubar_t **foo) {
|
|||
_cfsml_write_menubar_t(fh, (*foo));
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 602 "engines/sci/engine/savegame.cfsml"
|
||||
#line 574 "engines/sci/engine/savegame.cfsml"
|
||||
} else { // Nothing to write
|
||||
WSprintf(fh, "\\null\\");
|
||||
}
|
||||
|
@ -4299,11 +4271,37 @@ int read_menubar_tp(Common::SeekableReadStream *fh, menubar_t **foo, const char
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 614 "engines/sci/engine/savegame.cfsml"
|
||||
#line 586 "engines/sci/engine/savegame.cfsml"
|
||||
}
|
||||
return *hiteof;
|
||||
}
|
||||
|
||||
static struct {
|
||||
int type;
|
||||
const char *name;
|
||||
} mem_obj_string_names[] = {
|
||||
{MEM_OBJ_INVALID, "INVALID"},
|
||||
{MEM_OBJ_SCRIPT, "SCRIPT"},
|
||||
{MEM_OBJ_CLONES, "CLONES"},
|
||||
{MEM_OBJ_LOCALS, "LOCALS"},
|
||||
{MEM_OBJ_STACK, "STACK"},
|
||||
{MEM_OBJ_SYS_STRINGS,"SYS_STRINGS"},
|
||||
{MEM_OBJ_LISTS,"LISTS"},
|
||||
{MEM_OBJ_NODES,"NODES"},
|
||||
{MEM_OBJ_HUNK,"HUNK"},
|
||||
{MEM_OBJ_DYNMEM,"DYNMEM"}};
|
||||
|
||||
int mem_obj_string_to_enum(const char *str) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= MEM_OBJ_MAX; i++) {
|
||||
if (!scumm_stricmp(mem_obj_string_names[i].name, str))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
||||
WSprintf(fh, "%s\n", mem_obj_string_names[foo->type].name);
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4311,7 +4309,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_int(fh, &foo->segmgr_id);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 621 "engines/sci/engine/savegame.cfsml"
|
||||
#line 619 "engines/sci/engine/savegame.cfsml"
|
||||
switch (foo->type) {
|
||||
case MEM_OBJ_SCRIPT:
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4319,7 +4317,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_script_t(fh, &foo->data.script);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 624 "engines/sci/engine/savegame.cfsml"
|
||||
#line 622 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_CLONES:
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4327,7 +4325,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_clone_table_t(fh, &foo->data.clones);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 627 "engines/sci/engine/savegame.cfsml"
|
||||
#line 625 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_LOCALS:
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4335,7 +4333,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_local_variables_t(fh, &foo->data.locals);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 630 "engines/sci/engine/savegame.cfsml"
|
||||
#line 628 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_SYS_STRINGS:
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4343,7 +4341,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_sys_strings_t(fh, &foo->data.sys_strings);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 633 "engines/sci/engine/savegame.cfsml"
|
||||
#line 631 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_STACK:
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4351,7 +4349,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_int(fh, &foo->data.stack.nr);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 636 "engines/sci/engine/savegame.cfsml"
|
||||
#line 634 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_HUNK:
|
||||
break;
|
||||
|
@ -4361,7 +4359,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_list_table_t(fh, &foo->data.lists);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 641 "engines/sci/engine/savegame.cfsml"
|
||||
#line 639 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_NODES:
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4369,7 +4367,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_node_table_t(fh, &foo->data.nodes);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 644 "engines/sci/engine/savegame.cfsml"
|
||||
#line 642 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_DYNMEM:
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
|
@ -4377,7 +4375,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {
|
|||
_cfsml_write_dynmem_t(fh, &foo->data.dynmem);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 647 "engines/sci/engine/savegame.cfsml"
|
||||
#line 645 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -4417,7 +4415,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 661 "engines/sci/engine/savegame.cfsml"
|
||||
#line 659 "engines/sci/engine/savegame.cfsml"
|
||||
switch (foo->type) {
|
||||
case MEM_OBJ_SCRIPT:
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4446,7 +4444,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 664 "engines/sci/engine/savegame.cfsml"
|
||||
#line 662 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_CLONES:
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4475,7 +4473,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 667 "engines/sci/engine/savegame.cfsml"
|
||||
#line 665 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_LOCALS:
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4504,7 +4502,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 670 "engines/sci/engine/savegame.cfsml"
|
||||
#line 668 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_SYS_STRINGS:
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4533,7 +4531,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 673 "engines/sci/engine/savegame.cfsml"
|
||||
#line 671 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_LISTS:
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4562,7 +4560,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 676 "engines/sci/engine/savegame.cfsml"
|
||||
#line 674 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_NODES:
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4591,7 +4589,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 679 "engines/sci/engine/savegame.cfsml"
|
||||
#line 677 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
case MEM_OBJ_STACK:
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4620,7 +4618,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 682 "engines/sci/engine/savegame.cfsml"
|
||||
#line 680 "engines/sci/engine/savegame.cfsml"
|
||||
foo->data.stack.entries = (reg_t *)sci_calloc(foo->data.stack.nr, sizeof(reg_t));
|
||||
break;
|
||||
case MEM_OBJ_HUNK:
|
||||
|
@ -4653,7 +4651,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 689 "engines/sci/engine/savegame.cfsml"
|
||||
#line 687 "engines/sci/engine/savegame.cfsml"
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -4669,7 +4667,7 @@ void write_mem_obj_tp(Common::WriteStream *fh, mem_obj_t **foo) {
|
|||
write_mem_obj_t(fh, (*foo));
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 700 "engines/sci/engine/savegame.cfsml"
|
||||
#line 698 "engines/sci/engine/savegame.cfsml"
|
||||
} else { // Nothing to write
|
||||
WSprintf(fh, "\\null\\");
|
||||
}
|
||||
|
@ -4704,7 +4702,7 @@ int read_mem_obj_tp(Common::SeekableReadStream *fh, mem_obj_t **foo, const char
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 711 "engines/sci/engine/savegame.cfsml"
|
||||
#line 709 "engines/sci/engine/savegame.cfsml"
|
||||
return *hiteof;
|
||||
}
|
||||
return 0;
|
||||
|
@ -4716,13 +4714,13 @@ void write_SegManagerPtr(Common::WriteStream *fh, SegManager **foo) {
|
|||
_cfsml_write_bool(fh, &((*foo)->isSci1_1));
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 718 "engines/sci/engine/savegame.cfsml"
|
||||
#line 716 "engines/sci/engine/savegame.cfsml"
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
// Auto-generated CFSML data writer code
|
||||
_cfsml_write_SegManager(fh, *foo);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 719 "engines/sci/engine/savegame.cfsml"
|
||||
#line 717 "engines/sci/engine/savegame.cfsml"
|
||||
}
|
||||
|
||||
int read_SegManagerPtr(Common::SeekableReadStream *fh, SegManager **foo, const char *lastval, int *line, int *hiteof) {
|
||||
|
@ -4753,7 +4751,7 @@ int read_SegManagerPtr(Common::SeekableReadStream *fh, SegManager **foo, const c
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 726 "engines/sci/engine/savegame.cfsml"
|
||||
#line 724 "engines/sci/engine/savegame.cfsml"
|
||||
*foo = new SegManager(sci11);
|
||||
token = _cfsml_get_identifier(fh, line, hiteof, &assignment);
|
||||
// Auto-generated CFSML data reader code
|
||||
|
@ -4780,7 +4778,7 @@ int read_SegManagerPtr(Common::SeekableReadStream *fh, SegManager **foo, const c
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 729 "engines/sci/engine/savegame.cfsml"
|
||||
#line 727 "engines/sci/engine/savegame.cfsml"
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -4832,13 +4830,13 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename
|
|||
_cfsml_write_SavegameMetadata(fh, meta);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 776 "engines/sci/engine/savegame.cfsml"
|
||||
#line 774 "engines/sci/engine/savegame.cfsml"
|
||||
#line 819 "engines/sci/engine/savegame.cfsml"
|
||||
// Auto-generated CFSML data writer code
|
||||
_cfsml_write_EngineState(fh, s);
|
||||
WSprintf(fh, "\n");
|
||||
// End of auto-generated CFSML data writer code
|
||||
#line 777 "engines/sci/engine/savegame.cfsml"
|
||||
#line 775 "engines/sci/engine/savegame.cfsml"
|
||||
|
||||
delete meta;
|
||||
|
||||
|
@ -5149,7 +5147,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 1056 "engines/sci/engine/savegame.cfsml"
|
||||
#line 1054 "engines/sci/engine/savegame.cfsml"
|
||||
if ((meta->savegame_version < FREESCI_MINIMUM_SAVEGAME_VERSION) ||
|
||||
(meta->savegame_version > FREESCI_CURRENT_SAVEGAME_VERSION)) {
|
||||
if (meta->savegame_version < FREESCI_MINIMUM_SAVEGAME_VERSION)
|
||||
|
@ -5204,7 +5202,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 1079 "engines/sci/engine/savegame.cfsml"
|
||||
#line 1077 "engines/sci/engine/savegame.cfsml"
|
||||
|
||||
sfx_exit(&s->sound);
|
||||
_gamestate_unfrob(retval);
|
||||
|
@ -5324,7 +5322,7 @@ bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata*
|
|||
}
|
||||
}
|
||||
// End of auto-generated CFSML data reader code
|
||||
#line 1167 "engines/sci/engine/savegame.cfsml"
|
||||
#line 1165 "engines/sci/engine/savegame.cfsml"
|
||||
|
||||
if (read_eof)
|
||||
return false;
|
||||
|
|
|
@ -54,11 +54,11 @@ namespace Sci {
|
|||
#define INVALID_SCRIPT_ID -1
|
||||
|
||||
inline int SegManager::findFreeId(int *id) {
|
||||
char was_added = 0;
|
||||
bool was_added = false;
|
||||
int retval = 0;
|
||||
|
||||
while (!was_added) {
|
||||
retval = id_seg_map->check_value(reserved_id, true, &was_added);
|
||||
retval = id_seg_map->checkKey(reserved_id, true, &was_added);
|
||||
*id = reserved_id--;
|
||||
if (reserved_id < -1000000)
|
||||
reserved_id = -10;
|
||||
|
@ -82,9 +82,9 @@ SegManager::SegManager(bool sci1_1) {
|
|||
// Initialise memory count
|
||||
mem_allocated = 0;
|
||||
|
||||
id_seg_map = new int_hash_map_t();
|
||||
id_seg_map = new IntMapper();
|
||||
reserved_id = INVALID_SCRIPT_ID;
|
||||
id_seg_map->check_value(reserved_id, true); // reserve 0 for seg_id
|
||||
id_seg_map->checkKey(reserved_id, true); // reserve 0 for seg_id
|
||||
reserved_id--; // reserved_id runs in the reversed direction to make sure no one will use it.
|
||||
|
||||
heap_size = DEFAULT_SCRIPTS;
|
||||
|
@ -130,10 +130,10 @@ SegManager::~SegManager() {
|
|||
// seg_id - allocated segment id
|
||||
mem_obj_t *SegManager::allocateScript(EngineState *s, int script_nr, int* seg_id) {
|
||||
int seg;
|
||||
char was_added;
|
||||
bool was_added;
|
||||
mem_obj_t* mem;
|
||||
|
||||
seg = id_seg_map->check_value(script_nr, true, &was_added);
|
||||
seg = id_seg_map->checkKey(script_nr, true, &was_added);
|
||||
if (!was_added) {
|
||||
*seg_id = seg;
|
||||
return heap[*seg_id];
|
||||
|
@ -218,7 +218,7 @@ int SegManager::initialiseScript(mem_obj_t *mem, EngineState *s, int script_nr)
|
|||
scr->marked_as_deleted = 0;
|
||||
scr->relocated = 0;
|
||||
|
||||
scr->obj_indices = new int_hash_map_t();
|
||||
scr->obj_indices = new IntMapper();
|
||||
|
||||
if (s->version >= SCI_VERSION(1, 001, 000))
|
||||
scr->heap_start = scr->buf + scr->script_size;
|
||||
|
@ -233,7 +233,7 @@ int SegManager::deallocate(int seg, bool recursive) {
|
|||
VERIFY(check(seg), "invalid seg id");
|
||||
|
||||
mobj = heap[seg];
|
||||
id_seg_map->remove_value(mobj->segmgr_id);
|
||||
id_seg_map->removeKey(mobj->segmgr_id);
|
||||
|
||||
switch (mobj->type) {
|
||||
case MEM_OBJ_SCRIPT:
|
||||
|
@ -414,9 +414,7 @@ void SegManager::freeScript(mem_obj_t *mem) {
|
|||
}
|
||||
|
||||
delete mem->data.script.obj_indices;
|
||||
if (NULL != mem->data.script.code) {
|
||||
free(mem->data.script.code);
|
||||
}
|
||||
}
|
||||
|
||||
// memory operations
|
||||
|
@ -555,7 +553,7 @@ void SegManager::sm_put_heap(reg_t reg, int16 value) {
|
|||
|
||||
// return the seg if script_id is valid and in the map, else -1
|
||||
int SegManager::segGet(int script_id) {
|
||||
return id_seg_map->check_value(script_id, false);
|
||||
return id_seg_map->checkKey(script_id, false);
|
||||
}
|
||||
|
||||
// validate the seg
|
||||
|
@ -883,7 +881,7 @@ object_t *SegManager::scriptObjInit0(EngineState *s, reg_t obj_pos) {
|
|||
}
|
||||
|
||||
temp = make_reg(obj_pos.segment, base);
|
||||
id = scr->obj_indices->check_value(base, true);
|
||||
id = scr->obj_indices->checkKey(base, true);
|
||||
scr->objects_nr++;
|
||||
|
||||
obj = scr->objects + id;
|
||||
|
@ -949,7 +947,7 @@ object_t *SegManager::scriptObjInit11(EngineState *s, reg_t obj_pos) {
|
|||
scr->objects = (object_t *)sci_realloc(scr->objects, sizeof(object_t) * scr->objects_allocated);
|
||||
}
|
||||
|
||||
id = scr->obj_indices->check_value(obj_pos.offset, true);
|
||||
id = scr->obj_indices->checkKey(obj_pos.offset, true);
|
||||
scr->objects_nr++;
|
||||
|
||||
obj = scr->objects + id;
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#ifndef _SCI_SEG_MANAGER_H
|
||||
#define _SCI_SEG_MANAGER_H
|
||||
|
||||
#include "sci/engine/int_hashmap.h"
|
||||
#include "sci/engine/intmap.h"
|
||||
#include "sci/include/vm.h"
|
||||
|
||||
namespace Sci {
|
||||
|
@ -397,7 +397,7 @@ public:
|
|||
int initialiseScript(mem_obj_t *mem, EngineState *s, int script_nr);
|
||||
|
||||
public: // TODO: make private
|
||||
int_hash_map_t *id_seg_map; // id - script id; seg - index of heap
|
||||
IntMapper *id_seg_map; // id - script id; seg - index of heap
|
||||
mem_obj_t **heap;
|
||||
int heap_size; // size of the heap
|
||||
int reserved_id;
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#include "sci/include/sys_strings.h"
|
||||
#include "sci/include/heapmgr.h"
|
||||
|
||||
#include "sci/engine/int_hashmap.h"
|
||||
#include "sci/engine/intmap.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
|
@ -111,7 +111,7 @@ struct class_t {
|
|||
reg_t reg; /* offset; script-relative offset, segment: 0 if not instantiated */
|
||||
};
|
||||
|
||||
#define RAW_GET_CLASS_INDEX(scr, reg) ((scr)->obj_indices->check_value(reg.offset, false))
|
||||
#define RAW_GET_CLASS_INDEX(scr, reg) ((scr)->obj_indices->checkKey(reg.offset, false))
|
||||
#define RAW_IS_OBJECT(datablock) (getUInt16(((byte *) datablock) + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER)
|
||||
|
||||
#define IS_CLASS(obj) (obj->variables[SCRIPT_INFO_SELECTOR].offset & SCRIPT_INFO_CLASS)
|
||||
|
@ -177,9 +177,6 @@ struct code_block_t {
|
|||
|
||||
|
||||
|
||||
//#define VM_OBJECT_SET_INDEX(ptr, index) { ((byte *) (ptr))[0] = (index) & 0xff; ((byte *) (ptr))[1] = ((index) >> 8) & 0xff; }
|
||||
//#define VM_OBJECT_GET_INDEX(scr, reg) (int_hash_map_check_value(scr->obj_indices, reg.offset, 0, NULL))
|
||||
|
||||
struct script_t {
|
||||
int nr; /* Script number */
|
||||
byte* buf; /* Static data buffer, or NULL if not used */
|
||||
|
@ -191,7 +188,7 @@ struct script_t {
|
|||
byte *heap_start; /* Start of heap if SCI1.1, NULL otherwise */
|
||||
uint16 *export_table; /* Abs. offset of the export table or 0 if not present */
|
||||
|
||||
int_hash_map_t *obj_indices;
|
||||
IntMapper *obj_indices;
|
||||
|
||||
int exports_nr; /* Number of entries in the exports table */
|
||||
int synonyms_nr; /* Number of entries in the synonyms block */
|
||||
|
|
|
@ -10,7 +10,7 @@ MODULE_OBJS = \
|
|||
engine/game.o \
|
||||
engine/gc.o \
|
||||
engine/grammar.o \
|
||||
engine/int_hashmap.o \
|
||||
engine/intmap.o \
|
||||
engine/kernel.o \
|
||||
engine/kevent.o \
|
||||
engine/kfile.o \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue