aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorMax Horn2009-04-28 22:56:44 +0000
committerMax Horn2009-04-28 22:56:44 +0000
commited914d6740fda4ea057c23ef8d2ae51dc93df033 (patch)
tree40994231809ca6a3d3222f264fd7e77910cee612 /engines/sci
parentd62b4c62c4521b21067289ff879ef8cb1f85bba3 (diff)
downloadscummvm-rg350-ed914d6740fda4ea057c23ef8d2ae51dc93df033.tar.gz
scummvm-rg350-ed914d6740fda4ea057c23ef8d2ae51dc93df033.tar.bz2
scummvm-rg350-ed914d6740fda4ea057c23ef8d2ae51dc93df033.zip
SCI: Improved the Table template a bit by taking advantage of C++ features
svn-id: r40190
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/kernel.cpp2
-rw-r--r--engines/sci/engine/klists.cpp4
-rw-r--r--engines/sci/engine/savegame.cpp53
-rw-r--r--engines/sci/engine/scriptconsole.cpp2
-rw-r--r--engines/sci/engine/scriptdebug.cpp12
-rw-r--r--engines/sci/engine/seg_manager.cpp88
-rw-r--r--engines/sci/engine/vm.cpp2
-rw-r--r--engines/sci/engine/vm.h51
8 files changed, 71 insertions, 143 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 5927e328c5..b33ce60f18 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -247,7 +247,7 @@ byte *kmem(EngineState *s, reg_t handle) {
return NULL;
}
- return (byte *) ht->table[handle.offset].entry.mem;
+ return (byte *)ht->table[handle.offset].mem;
}
// Frees the specified handle. Returns 0 on success, 1 otherwise.
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index d655472ba4..bf9e0a4858 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -53,7 +53,7 @@ Node *lookup_node(EngineState *s, reg_t addr, const char *file, int line) {
return NULL;
}
- return &(nt->table[addr.offset].entry);
+ return &(nt->table[addr.offset]);
}
List *lookup_list(EngineState *s, reg_t addr, const char *file, int line) {
@@ -73,7 +73,7 @@ List *lookup_list(EngineState *s, reg_t addr, const char *file, int line) {
return NULL;
}
- return &(lt->table[addr.offset].entry);
+ return &(lt->table[addr.offset]);
}
#ifdef DISABLE_VALIDATIONS
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 042590b33b..74ef6c9ccc 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -288,16 +288,7 @@ static void sync_Object(Common::Serializer &s, Object &obj) {
}
static void sync_Clone(Common::Serializer &s, Clone &obj) {
- s.syncAsSint32LE(obj.flags);
- sync_reg_t(s, obj.pos);
- s.syncAsSint32LE(obj.variables_nr);
- s.syncAsSint32LE(obj.variable_names_nr);
- s.syncAsSint32LE(obj.methods_nr);
-
- if (!obj.variables && obj.variables_nr)
- obj.variables = (reg_t *)sci_calloc(obj.variables_nr, sizeof(reg_t));
- for (int i = 0; i < obj.variables_nr; ++i)
- sync_reg_t(s, obj.variables[i]);
+ sync_Object(s, obj);
}
static void sync_List(Common::Serializer &s, List &obj) {
@@ -312,9 +303,9 @@ static void sync_Node(Common::Serializer &s, Node &obj) {
sync_reg_t(s, obj.value);
}
-static void sync_CloneEntry(Common::Serializer &s, CloneEntry &obj) {
+static void sync_CloneEntry(Common::Serializer &s, CloneTable::Entry &obj) {
s.syncAsSint32LE(obj.next_free);
- sync_Clone(s, obj.entry);
+ sync_Clone(s, obj);
}
static void sync_CloneTable(Common::Serializer &s, CloneTable &obj) {
@@ -324,14 +315,14 @@ static void sync_CloneTable(Common::Serializer &s, CloneTable &obj) {
s.syncAsSint32LE(obj.max_entry);
if (!obj.table && obj.entries_nr)
- obj.table = (CloneEntry *)sci_calloc(obj.entries_nr, sizeof(CloneEntry));
+ obj.table = (CloneTable::Entry *)sci_calloc(obj.entries_nr, sizeof(CloneTable::Entry));
for (int i = 0; i < obj.entries_nr; ++i)
sync_CloneEntry(s, obj.table[i]);
}
-static void sync_ListEntry(Common::Serializer &s, ListEntry &obj) {
+static void sync_ListEntry(Common::Serializer &s, ListTable::Entry &obj) {
s.syncAsSint32LE(obj.next_free);
- sync_List(s, obj.entry);
+ sync_List(s, obj);
}
static void sync_ListTable(Common::Serializer &s, ListTable &obj) {
@@ -341,14 +332,14 @@ static void sync_ListTable(Common::Serializer &s, ListTable &obj) {
s.syncAsSint32LE(obj.max_entry);
if (!obj.table && obj.entries_nr)
- obj.table = (ListEntry *)sci_calloc(obj.entries_nr, sizeof(ListEntry));
+ obj.table = (ListTable::Entry *)sci_calloc(obj.entries_nr, sizeof(ListTable::Entry));
for (int i = 0; i < obj.entries_nr; ++i)
sync_ListEntry(s, obj.table[i]);
}
-static void sync_NodeEntry(Common::Serializer &s, NodeEntry &obj) {
+static void sync_NodeEntry(Common::Serializer &s, NodeTable::Entry &obj) {
s.syncAsSint32LE(obj.next_free);
- sync_Node(s, obj.entry);
+ sync_Node(s, obj);
}
static void sync_NodeTable(Common::Serializer &s, NodeTable &obj) {
@@ -358,7 +349,7 @@ static void sync_NodeTable(Common::Serializer &s, NodeTable &obj) {
s.syncAsSint32LE(obj.max_entry);
if (!obj.table && obj.entries_nr)
- obj.table = (NodeEntry *)sci_calloc(obj.entries_nr, sizeof(NodeEntry));
+ obj.table = (NodeTable::Entry *)sci_calloc(obj.entries_nr, sizeof(NodeTable::Entry));
for (int i = 0; i < obj.entries_nr; ++i)
sync_NodeEntry(s, obj.table[i]);
}
@@ -486,7 +477,7 @@ static void sync_MemObjPtr(Common::Serializer &s, MemObject *&obj) {
break;
case MEM_OBJ_HUNK:
if (s.isLoading()) {
- init_Hunk_table(&obj->data.hunks);
+ obj->data.hunks.initTable();
}
break;
case MEM_OBJ_STRING_FRAG:
@@ -501,7 +492,7 @@ static void sync_MemObjPtr(Common::Serializer &s, MemObject *&obj) {
sync_DynMem(s, obj->data.dynmem);
break;
default:
- error("Unknown MemObject type %d\n", obj->type);
+ error("Unknown MemObject type %d", obj->type);
break;
}
}
@@ -590,7 +581,7 @@ static void reconstruct_stack(EngineState *retval) {
static int clone_entry_used(CloneTable *table, int n) {
int backup;
int seeker = table->first_free;
- CloneEntry *entries = table->table;
+ CloneTable::Entry *entries = table->table;
if (seeker == HEAPENTRY_INVALID) return 1;
@@ -715,7 +706,7 @@ static void reconstruct_clones(EngineState *s, SegManager *self) {
switch (mobj->type) {
case MEM_OBJ_CLONES: {
int j;
- CloneEntry *seeker = mobj->data.clones.table;
+ CloneTable::Entry *seeker = mobj->data.clones.table;
/*
sciprintf("Free list: ");
@@ -726,7 +717,7 @@ static void reconstruct_clones(EngineState *s, SegManager *self) {
sciprintf("Entries w/zero vars: ");
for (j = 0; j < mobj->data.clones.max_entry; j++) {
- if (mobj->data.clones.table[j].entry.variables == NULL)
+ if (mobj->data.clones.table[j].variables == NULL)
sciprintf("%d ", j);
}
sciprintf("\n");
@@ -739,17 +730,17 @@ static void reconstruct_clones(EngineState *s, SegManager *self) {
seeker++;
continue;
}
- base_obj = obj_get(s, seeker->entry.variables[SCRIPT_SPECIES_SELECTOR]);
+ base_obj = obj_get(s, seeker->variables[SCRIPT_SPECIES_SELECTOR]);
if (!base_obj) {
sciprintf("Clone entry without a base class: %d\n", j);
- seeker->entry.base = seeker->entry.base_obj = NULL;
- seeker->entry.base_vars = seeker->entry.base_method = NULL;
+ seeker->base = seeker->base_obj = NULL;
+ seeker->base_vars = seeker->base_method = NULL;
continue;
}
- seeker->entry.base = base_obj->base;
- seeker->entry.base_obj = base_obj->base_obj;
- seeker->entry.base_vars = base_obj->base_vars;
- seeker->entry.base_method = base_obj->base_method;
+ seeker->base = base_obj->base;
+ seeker->base_obj = base_obj->base_obj;
+ seeker->base_vars = base_obj->base_vars;
+ seeker->base_method = base_obj->base_method;
seeker++;
}
diff --git a/engines/sci/engine/scriptconsole.cpp b/engines/sci/engine/scriptconsole.cpp
index decfd167dc..935f3e7418 100644
--- a/engines/sci/engine/scriptconsole.cpp
+++ b/engines/sci/engine/scriptconsole.cpp
@@ -328,7 +328,7 @@ int parse_reg_t(EngineState *s, const char *str, reg_t *dest) { // Returns 0 on
obj = mobj->data.script.objects + idx;
objpos.offset = obj->pos.offset;
} else if (mobj->type == MEM_OBJ_CLONES) {
- obj = &(mobj->data.clones.table[idx].entry);
+ obj = &(mobj->data.clones.table[idx]);
objpos.offset = idx;
valid = clone_is_used(&mobj->data.clones, idx);
}
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index 76ac53ec81..66d5377bef 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -366,7 +366,7 @@ static void print_list(EngineState *s, List *l) {
return;
}
- node = &(mobj->data.nodes.table[pos.offset].entry);
+ node = &(mobj->data.nodes.table[pos.offset]);
sciprintf("\t"PREG" : "PREG" -> "PREG"\n", PRINT_REG(pos), PRINT_REG(node->key), PRINT_REG(node->value));
@@ -446,7 +446,7 @@ static void _c_single_seg_info(EngineState *s, MemObject *mobj) {
for (i = 0; i < ct->max_entry; i++)
if (ENTRY_IS_VALID(ct, i)) {
sciprintf(" [%04x] ", i);
- print_obj_head(s, &(ct->table[i].entry));
+ print_obj_head(s, &(ct->table[i]));
}
}
break;
@@ -459,7 +459,7 @@ static void _c_single_seg_info(EngineState *s, MemObject *mobj) {
for (i = 0; i < lt->max_entry; i++)
if (ENTRY_IS_VALID(lt, i)) {
sciprintf(" [%04x]: ", i);
- print_list(s, &(lt->table[i].entry));
+ print_list(s, &(lt->table[i]));
}
}
break;
@@ -477,7 +477,7 @@ static void _c_single_seg_info(EngineState *s, MemObject *mobj) {
for (i = 0; i < ht->max_entry; i++)
if (ENTRY_IS_VALID(ht, i)) {
sciprintf(" [%04x] %d bytes at %p, type=%s\n",
- i, ht->table[i].entry.size, ht->table[i].entry.mem, ht->table[i].entry.type);
+ i, ht->table[i].size, ht->table[i].mem, ht->table[i].type);
}
}
@@ -512,7 +512,7 @@ static int show_node(EngineState *s, reg_t addr) {
return 1;
}
- list = &(lt->table[addr.offset].entry);
+ list = &(lt->table[addr.offset]);
sciprintf(PREG" : first x last = ("PREG", "PREG")\n", PRINT_REG(addr), PRINT_REG(list->first), PRINT_REG(list->last));
} else {
@@ -531,7 +531,7 @@ static int show_node(EngineState *s, reg_t addr) {
sciprintf("Address does not contain a node\n");
return 1;
}
- node = &(nt->table[addr.offset].entry);
+ node = &(nt->table[addr.offset]);
sciprintf(PREG" : prev x next = ("PREG", "PREG"); maps "PREG" -> "PREG"\n",
PRINT_REG(addr), PRINT_REG(node->pred), PRINT_REG(node->succ), PRINT_REG(node->key), PRINT_REG(node->value));
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index 84f670091b..7173cd61d6 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -363,7 +363,7 @@ int SegManager::deallocateScript(int script_nr) {
}
MemObject *SegManager::memObjAllocate(SegmentId segid, int hash_id, memObjType type) {
- MemObject *mem = (MemObject *)sci_calloc(sizeof(MemObject), 1);
+ MemObject *mem = (MemObject *)sci_calloc(1, sizeof(MemObject));
if (!mem) {
sciprintf("SegManager: invalid mem_obj ");
return NULL;
@@ -1283,96 +1283,46 @@ Hunk *SegManager::alloc_hunk_entry(const char *hunk_type, int size, reg_t *reg)
}
-void init_List_table(ListTable *table) {
- table->entries_nr = 8;
- table->max_entry = 0;
- table->entries_used = 0;
- table->first_free = HEAPENTRY_INVALID;
- table->table = (ListEntry *)sci_malloc(sizeof(ListEntry) * 8);
- memset(table->table, 0, sizeof(ListEntry) * 8);
-}
-
void free_List_entry(ListTable *table, int index) {
- ListEntry *e = table->table + index;
-
if (index < 0 || index >= table->max_entry) {
error("heapmgr: Attempt to release invalid table index %d", index);
}
- e->next_free = table->first_free;
+ table->table[index].next_free = table->first_free;
table->first_free = index;
table->entries_used--;
}
-
-
-void init_Node_table(NodeTable *table) {
- table->entries_nr = 32;
- table->max_entry = 0;
- table->entries_used = 0;
- table->first_free = HEAPENTRY_INVALID;
- table->table = (NodeEntry *)sci_malloc(sizeof(NodeEntry) * 32);
- memset(table->table, 0, sizeof(NodeEntry) * 32);
-}
-
void free_Node_entry(NodeTable *table, int index) {
- NodeEntry *e = table->table + index;
-
if (index < 0 || index >= table->max_entry) {
error("heapmgr: Attempt to release invalid table index %d", index);
}
- e->next_free = table->first_free;
+ table->table[index].next_free = table->first_free;
table->first_free = index;
table->entries_used--;
}
-
-
-void init_Clone_table(CloneTable *table) {
- table->entries_nr = 16;
- table->max_entry = 0;
- table->entries_used = 0;
- table->first_free = HEAPENTRY_INVALID;
- table->table = (CloneEntry *)sci_malloc(sizeof(CloneEntry) * 16);
- memset(table->table, 0, sizeof(CloneEntry) * 16);
-}
-
void free_Clone_entry(CloneTable *table, int index) {
- CloneEntry *e = table->table + index;
-
if (index < 0 || index >= table->max_entry) {
error("heapmgr: Attempt to release invalid table index %d", index);
}
- free(e->entry.variables); // Free the dynamically allocated memory part
+ free(table->table[index].variables); // Free the dynamically allocated memory part
- e->next_free = table->first_free;
+ table->table[index].next_free = table->first_free;
table->first_free = index;
table->entries_used--;
}
-
-
-void init_Hunk_table(HunkTable *table) {
- table->entries_nr = 4;
- table->max_entry = 0;
- table->entries_used = 0;
- table->first_free = HEAPENTRY_INVALID;
- table->table = (HunkEntry *)sci_malloc(sizeof(HunkEntry) * 4);
- memset(table->table, 0, sizeof(HunkEntry) * 4);
-}
-
void free_Hunk_entry(HunkTable *table, int index) {
- HunkEntry *e = table->table + index;
-
if (index < 0 || index >= table->max_entry) {
error("heapmgr: Attempt to release invalid table index %d", index);
}
- free(e->entry.mem);
+ free(table->table[index].mem);
- e->next_free = table->first_free;
+ table->table[index].next_free = table->first_free;
table->first_free = index;
table->entries_used--;
}
@@ -1386,7 +1336,7 @@ Clone *SegManager::alloc_Clone(reg_t *addr) {
if (!Clones_seg_id) {
mobj = allocNonscriptSegment(MEM_OBJ_CLONES, &(Clones_seg_id));
- init_Clone_table(&(mobj->data.clones));
+ mobj->data.clones.initTable();
} else
mobj = heap[Clones_seg_id];
@@ -1394,7 +1344,7 @@ Clone *SegManager::alloc_Clone(reg_t *addr) {
offset = table->allocEntry();
*addr = make_reg(Clones_seg_id, offset);
- return &(mobj->data.clones.table[offset].entry);
+ return &(mobj->data.clones.table[offset]);
}
List *SegManager::alloc_List(reg_t *addr) {
@@ -1404,7 +1354,7 @@ List *SegManager::alloc_List(reg_t *addr) {
if (!Lists_seg_id) {
mobj = allocNonscriptSegment(MEM_OBJ_LISTS, &(Lists_seg_id));
- init_List_table(&(mobj->data.lists));
+ mobj->data.lists.initTable();
} else
mobj = heap[Lists_seg_id];
@@ -1412,7 +1362,7 @@ List *SegManager::alloc_List(reg_t *addr) {
offset = table->allocEntry();
*addr = make_reg(Lists_seg_id, offset);
- return &(mobj->data.lists.table[offset].entry);
+ return &(mobj->data.lists.table[offset]);
}
Node *SegManager::alloc_Node(reg_t *addr) {
@@ -1422,7 +1372,7 @@ Node *SegManager::alloc_Node(reg_t *addr) {
if (!Nodes_seg_id) {
mobj = allocNonscriptSegment(MEM_OBJ_NODES, &(Nodes_seg_id));
- init_Node_table(&(mobj->data.nodes));
+ mobj->data.nodes.initTable();
} else
mobj = heap[Nodes_seg_id];
@@ -1430,7 +1380,7 @@ Node *SegManager::alloc_Node(reg_t *addr) {
offset = table->allocEntry();
*addr = make_reg(Nodes_seg_id, offset);
- return &(mobj->data.nodes.table[offset].entry);
+ return &(mobj->data.nodes.table[offset]);
}
Hunk *SegManager::alloc_Hunk(reg_t *addr) {
@@ -1440,7 +1390,7 @@ Hunk *SegManager::alloc_Hunk(reg_t *addr) {
if (!Hunks_seg_id) {
mobj = allocNonscriptSegment(MEM_OBJ_HUNK, &(Hunks_seg_id));
- init_Hunk_table(&(mobj->data.hunks));
+ mobj->data.hunks.initTable();
} else
mobj = heap[Hunks_seg_id];
@@ -1448,7 +1398,7 @@ Hunk *SegManager::alloc_Hunk(reg_t *addr) {
offset = table->allocEntry();
*addr = make_reg(Hunks_seg_id, offset);
- return &(mobj->data.hunks.table[offset].entry);
+ return &(mobj->data.hunks.table[offset]);
}
@@ -1696,7 +1646,7 @@ void SegInterfaceClones::listAllOutgoingReferences(EngineState *s, reg_t addr, v
return;
}
- clone = &(clone_table->table[addr.offset].entry);
+ clone = &(clone_table->table[addr.offset]);
// Emit all member variables (including references to the 'super' delegate)
for (i = 0; i < clone->variables_nr; i++)
@@ -1712,7 +1662,7 @@ void SegInterfaceClones::freeAtAddress(reg_t addr) {
assert(addr.segment == _segId);
- victim_obj = &(_mobj->data.clones.table[addr.offset].entry);
+ victim_obj = &(_mobj->data.clones.table[addr.offset]);
#ifdef GC_DEBUG
if (!(victim_obj->flags & OBJECT_FLAG_FREED))
@@ -1826,7 +1776,7 @@ void SegInterfaceLists::listAllDeallocatable(void *param, NoteCallback note) {
void SegInterfaceLists::listAllOutgoingReferences(EngineState *s, reg_t addr, void *param, NoteCallback note) {
ListTable *table = &(_mobj->data.lists);
- List *list = &(table->table[addr.offset].entry);
+ List *list = &(table->table[addr.offset]);
if (!ENTRY_IS_VALID(table, addr.offset)) {
fprintf(stderr, "Invalid list referenced for outgoing references: "PREG"\n", PRINT_REG(addr));
@@ -1860,7 +1810,7 @@ void SegInterfaceNodes::listAllDeallocatable(void *param, NoteCallback note) {
void SegInterfaceNodes::listAllOutgoingReferences(EngineState *s, reg_t addr, void *param, NoteCallback note) {
NodeTable *table = &(_mobj->data.nodes);
- Node *node = &(table->table[addr.offset].entry);
+ Node *node = &(table->table[addr.offset]);
if (!ENTRY_IS_VALID(table, addr.offset)) {
fprintf(stderr, "Invalid node referenced for outgoing references: "PREG"\n", PRINT_REG(addr));
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index e776b9e598..8a49efb906 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -2089,7 +2089,7 @@ Object *obj_get(EngineState *s, reg_t offset) {
if (memobj != NULL) {
if (memobj->type == MEM_OBJ_CLONES && ENTRY_IS_VALID(&memobj->data.clones, offset.offset))
- obj = &(memobj->data.clones.table[offset.offset].entry);
+ obj = &(memobj->data.clones.table[offset.offset]);
else if (memobj->type == MEM_OBJ_SCRIPT) {
if (offset.offset <= memobj->data.script.buf_size && offset.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
&& RAW_IS_OBJECT(memobj->data.script.buf + offset.offset)) {
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index 614ffe56ec..2dd2873ed6 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -259,12 +259,24 @@ struct Hunk {
template<typename T, int INITIAL, int INCREMENT>
struct Table {
+ struct Entry : public T {
+ int next_free; /* Only used for free entries */
+ };
+
int entries_nr; /* Number of entries allocated */
int first_free; /* Beginning of a singly linked list for entries */
int entries_used; /* Statistical information */
int max_entry; /* Highest entry used */
- T *table;
+ Entry *table;
+
+ void initTable() {
+ entries_nr = INITIAL;
+ max_entry = 0;
+ entries_used = 0;
+ first_free = HEAPENTRY_INVALID;
+ table = (Entry *)calloc(INITIAL, sizeof(Entry));
+ }
int allocEntry() {
entries_used++;
@@ -278,9 +290,8 @@ struct Table {
if (max_entry == entries_nr) {
entries_nr += INCREMENT;
- table = (T *)sci_realloc(table,
- sizeof(T) * entries_nr);
- memset(&table[entries_nr-INCREMENT], 0, INCREMENT * sizeof(T));
+ table = (Entry *)sci_realloc(table, sizeof(Entry) * entries_nr);
+ memset(&table[entries_nr-INCREMENT], 0, INCREMENT * sizeof(Entry));
}
table[max_entry].next_free = max_entry; /* Tag as 'valid' */
return max_entry++;
@@ -289,46 +300,22 @@ struct Table {
};
/* CloneTable */
-struct CloneEntry {
- int next_free; /* Only used for free entries */
- Clone entry;
-};
-typedef Table<CloneEntry, 16, 4> CloneTable;
-void init_Clone_table(CloneTable *table);
-int alloc_Clone_entry(CloneTable *table);
+typedef Table<Clone, 16, 4> CloneTable;
void free_Clone_entry(CloneTable *table, int index);
/* NodeTable */
-struct NodeEntry {
- int next_free; /* Only used for free entries */
- Node entry;
-};
-typedef Table<NodeEntry, 32, 16> NodeTable;
-void init_Node_table(NodeTable *table);
-int alloc_Node_entry(NodeTable *table);
+typedef Table<Node, 32, 16> NodeTable;
void free_Node_entry(NodeTable *table, int index);
/* ListTable */
-struct ListEntry {
- int next_free; /* Only used for free entries */
- List entry;
-};
-typedef Table<ListEntry, 8, 4> ListTable;
-void init_List_table(ListTable *table);
-int alloc_List_entry(ListTable *table);
+typedef Table<List, 8, 4> ListTable;
void free_List_entry(ListTable *table, int index);
/* HunkTable */
-struct HunkEntry {
- int next_free; /* Only used for free entries */
- Hunk entry;
-};
-typedef Table<HunkEntry, 4, 4> HunkTable;
-void init_Hunk_table(HunkTable *table);
-int alloc_Hunk_entry(HunkTable *table);
+typedef Table<Hunk, 4, 4> HunkTable;
void free_Hunk_entry(HunkTable *table, int index);