SCI: Rewrite the way file handles are managed

svn-id: r38794
This commit is contained in:
Max Horn 2009-02-22 21:38:46 +00:00
parent 4a6d6e8988
commit 1687a5e8d0
8 changed files with 252 additions and 106 deletions

View file

@ -266,8 +266,7 @@ static void _free_graphics_input(EngineState *s) {
s->dyn_views = NULL;
s->port = NULL;
if (s->pics)
free(s->pics);
free(s->pics);
s->pics = NULL;
}
@ -445,6 +444,164 @@ static int create_class_table_sci0(EngineState *s) {
return 0;
}
EngineState::EngineState() {
savegame_version = 0;
widget_serial_counter = 0;
resource_dir = 0;
work_dir = 0;
resmgr = 0;
game_name = 0;
game_version = 0;
gfx_state = 0;
old_screen = 0;
memset(&sound, 0, sizeof(sound)); // FIXME: Remove this once/if we C++ify sfx_state_t
sfx_init_flags = 0;
sound_volume = 0;
sound_mute = 0;
restarting_flags = 0;
have_mouse_flag = 0;
pic_not_valid = 0;
pic_is_new = 0;
onscreen_console = 0;
osc_backup = 0;
pic_priority_table = 0;
status_bar_text = 0;
status_bar_foreground = 0;
status_bar_background = 0;
game_time = 0;
save_dir_copy = NULL_REG;
save_dir_edit_offset = 0;
save_dir_copy_buf = 0;
mouse_pointer_view = 0;
mouse_pointer_loop = 0;
mouse_pointer_cel = 0;
save_mouse_pointer_view = 0;
save_mouse_pointer_loop = 0;
save_mouse_pointer_cel = 0;
port_serial = 0;
port = 0;
memset(ega_colors, 0, sizeof(ega_colors));
visual = 0;
titlebar_port = 0;
wm_port = 0;
picture_port = 0;
iconbar_port = 0;
memset(&pic_visible_map, 0, sizeof(pic_visible_map)); // FIXME: Remove this once/if we C++ify gfx_map_mask_t
pic_animate = 0;
dyn_views_list_serial = 0;
dyn_views = 0;
drop_views_list_serial = 0;
drop_views = 0;
animation_delay = 0;
animation_granularity = 0;
menubar = 0;
priority_first = 0;
priority_last = 0;
pics_drawn_nr = 0;
pics_nr = 0;
pics = 0;
last_wait_time = 0;
version_lock_flag = 0;
version = 0;
max_version = 0;
min_version = 0;
kernel_opt_flags = 0;
_fileHandles.resize(5);
dirseeker = 0;
execution_stack = 0;
execution_stack_size = 0;
execution_stack_pos = 0;
execution_stack_base = 0;
execution_stack_pos_changed = 0;
r_acc = NULL_REG;
r_amp_rest = 0;
r_prev = NULL_REG;
stack_segment = 0;
stack_base = 0;
stack_top = 0;
parser_segment = 0;
parser_base = NULL_REG;
parser_event = NULL_REG;
script_000_segment = 0;
script_000 = 0;
parser_lastmatch_word = 0;
bp_list = 0;
have_bp = 0;
debug_mode = 0;
sys_strings_segment = 0;
sys_strings = 0;
parser_words = 0;
parser_words_nr = 0;
parser_suffices = 0;
parser_suffices_nr = 0;
parser_branches = 0;
parser_rules = 0;
parser_branches_nr = 0;
memset(parser_nodes, 0, sizeof(parser_nodes));
parser_valid = 0;
synonyms = 0;
synonyms_nr = 0;
game_obj = NULL_REG;
classtable_size = 0;
classtable = 0;
seg_manager = 0;
gc_countdown = 0;
selector_names_nr = 0;
selector_names = 0;
kernel_names_nr = 0;
kernel_names = 0;
kfunct_table = 0;
kfunct_nr = 0;
opcodes = 0;
memset(&selector_map, 0, sizeof(selector_map)); // FIXME: Remove this once/if we C++ify selector_map_t
port_ID = 0;
successor = 0;
}
// Architectural stuff: Init/Unintialize engine
int script_init_engine(EngineState *s, sci_version_t version) {
int result;
@ -514,10 +671,6 @@ int script_init_engine(EngineState *s, sci_version_t version) {
s->bp_list = NULL; // No breakpoints defined
s->have_bp = 0;
s->file_handles_nr = 5;
s->file_handles = (FILE**)sci_calloc(sizeof(FILE *), s->file_handles_nr);
// Allocate memory for file handles
s->dirseeker = 0; // Used by FileIO for FIND_FIRST, FIND_NEXT
if (s->version >= SCI_VERSION_FTU_LOFS_ABSOLUTE &&
@ -539,8 +692,6 @@ void script_set_gamestate_save_dir(EngineState *s, const char *path) {
}
void script_free_vm_memory(EngineState *s) {
int i;
sciprintf("Freeing VM memory\n");
s->save_dir_copy_buf = NULL;
@ -548,15 +699,7 @@ void script_free_vm_memory(EngineState *s) {
s->classtable = NULL;
// Close all opened file handles
for (i = 1; i < s->file_handles_nr; i++)
if (s->file_handles[i])
fclose(s->file_handles[i]);
free(s->file_handles);
s->file_handles = NULL;
// FIXME: file handles will NOT be closed under DOS. DJGPP generates an
// exception fault whenever you try to close a never-opened file
s->_fileHandles.clear();
}
extern void free_kfunct_tables(EngineState *s);

View file

@ -150,7 +150,6 @@ static FILE *f_open_mirrored(EngineState *s, char *fname) {
#define _K_FILE_MODE_CREATE 2
void file_open(EngineState *s, char *filename, int mode) {
int retval = 1; // Ignore file_handles[0]
FILE *file = NULL;
SCIkdebug(SCIkFILE, "Opening file %s with mode %d\n", filename, mode);
@ -177,13 +176,15 @@ void file_open(EngineState *s, char *filename, int mode) {
return;
}
while (s->file_handles[retval] && (retval < s->file_handles_nr))
uint retval = 1; // Ignore _fileHandles[0]
while ((retval < s->_fileHandles.size()) && s->_fileHandles[retval]._file)
retval++;
if (retval == s->file_handles_nr) // Hit size limit => Allocate more space
s->file_handles = (FILE**)sci_realloc(s->file_handles, sizeof(FILE *) * ++(s->file_handles_nr));
if (retval == s->_fileHandles.size()) { // Hit size limit => Allocate more space
s->_fileHandles.resize(s->_fileHandles.size() + 1);
}
s->file_handles[retval] = file;
s->_fileHandles[retval]._file = file;
s->r_acc = make_reg(0, retval);
}
@ -196,18 +197,18 @@ reg_t kFOpen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
return s->r_acc;
}
static FILE *getFileFromHandle(EngineState *s, int handle) {
static FILE *getFileFromHandle(EngineState *s, uint handle) {
if (handle == 0) {
SCIkwarn(SCIkERROR, "Attempt to use file handle 0\n");
return 0;
}
if ((handle >= s->file_handles_nr) || (s->file_handles[handle] == NULL)) {
if ((handle >= s->_fileHandles.size()) || (s->_fileHandles[handle]._file == NULL)) {
SCIkwarn(SCIkERROR, "Attempt to use invalid/unused file handle %d\n", handle);
return 0;
}
return s->file_handles[handle];
return s->_fileHandles[handle]._file;
}
void file_close(EngineState *s, int handle) {
@ -219,7 +220,7 @@ void file_close(EngineState *s, int handle) {
fclose(f);
s->file_handles[handle] = NULL;
s->_fileHandles[handle]._file = NULL;
}
reg_t kFClose(EngineState *s, int funct_nr, int argc, reg_t *argv) {

View file

@ -1023,9 +1023,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
}
*/
retval = (EngineState *) sci_malloc(sizeof(EngineState));
memset(retval, 0, sizeof(EngineState));
retval = new EngineState();
retval->savegame_version = -1;
_global_save_state = retval;
@ -1096,10 +1094,6 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
// Time state:
retval->last_wait_time = g_system->getMillis();
// File IO state:
retval->file_handles_nr = 2;
retval->file_handles = (FILE **)sci_calloc(2, sizeof(FILE *));
// static parser information:
retval->parser_rules = s->parser_rules;
retval->parser_words_nr = s->parser_words_nr;

View file

@ -326,7 +326,7 @@ static char *_cfsml_unmangle_string(const char *s, unsigned int length) {
while ((source != end) && (c = *source++) && (c > 31)) {
if (c == '\\') { // Escaped character?
c = *source++;
c = *source++;
if ((c != '\\') && (c != '"')) // Un-escape 0-31 only
c -= ('a' - 1);
}
@ -606,7 +606,7 @@ _cfsml_read_sfx_state_t(Common::SeekableReadStream *fh, sfx_state_t* save_struc,
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -674,7 +674,7 @@ _cfsml_read_clone_entry_t(Common::SeekableReadStream *fh, clone_entry_t* save_st
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -771,7 +771,7 @@ _cfsml_read_object_t(Common::SeekableReadStream *fh, object_t* save_struc, const
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -860,10 +860,10 @@ _cfsml_read_object_t(Common::SeekableReadStream *fh, object_t* save_struc, const
_cfsml_error("Token expected by read_reg_t() for variables[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->variables_nr = max ; // Set array size accordingly
save_struc->variables_nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -962,7 +962,7 @@ _cfsml_read_menubar_t(Common::SeekableReadStream *fh, menubar_t* save_struc, con
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -1016,10 +1016,10 @@ _cfsml_read_menubar_t(Common::SeekableReadStream *fh, menubar_t* save_struc, con
_cfsml_error("Token expected by _cfsml_read_menu_t() for menus[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->menus_nr = max ; // Set array size accordingly
save_struc->menus_nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -1094,7 +1094,7 @@ _cfsml_read_list_entry_t(Common::SeekableReadStream *fh, list_entry_t* save_stru
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -1177,7 +1177,7 @@ _cfsml_read_int_hash_map_t(Common::SeekableReadStream *fh, int_hash_map_t* save_
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -1224,7 +1224,7 @@ _cfsml_read_int_hash_map_t(Common::SeekableReadStream *fh, int_hash_map_t* save_
_cfsml_error("Token expected by read_int_hash_map_node_tp() for nodes[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
} else
@ -1312,7 +1312,7 @@ _cfsml_read_SegManager(Common::SeekableReadStream *fh, SegManager* save_struc, c
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -1373,10 +1373,10 @@ _cfsml_read_SegManager(Common::SeekableReadStream *fh, SegManager* save_struc, c
_cfsml_error("Token expected by read_mem_obj_tp() for heap[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->heap_size = max ; // Set array size accordingly
save_struc->heap_size = max ; // Set array size accordingly
} else
if (!strcmp(token, "heap_size")) {
#line 690 "engines/sci/engine/savegame.cfsml"
@ -1506,7 +1506,7 @@ _cfsml_read_song_t(Common::SeekableReadStream *fh, song_t* save_struc, const cha
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -1661,7 +1661,7 @@ _cfsml_read_menu_item_t(Common::SeekableReadStream *fh, menu_item_t* save_struc,
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -1729,7 +1729,7 @@ _cfsml_read_menu_item_t(Common::SeekableReadStream *fh, menu_item_t* save_struc,
_cfsml_error("Token expected by _cfsml_read_byte() for said[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
} else
@ -1829,7 +1829,7 @@ _cfsml_read_node_entry_t(Common::SeekableReadStream *fh, node_entry_t* save_stru
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -1943,7 +1943,7 @@ _cfsml_read_dynmem_t(Common::SeekableReadStream *fh, dynmem_t* save_struc, const
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2011,10 +2011,10 @@ _cfsml_read_dynmem_t(Common::SeekableReadStream *fh, dynmem_t* save_struc, const
_cfsml_error("Token expected by _cfsml_read_byte() for buf[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->size = max ; // Set array size accordingly
save_struc->size = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -2076,7 +2076,7 @@ _cfsml_read_local_variables_t(Common::SeekableReadStream *fh, local_variables_t*
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2144,10 +2144,10 @@ _cfsml_read_local_variables_t(Common::SeekableReadStream *fh, local_variables_t*
_cfsml_error("Token expected by read_reg_t() for locals[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->nr = max ; // Set array size accordingly
save_struc->nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -2215,7 +2215,7 @@ _cfsml_read_node_table_t(Common::SeekableReadStream *fh, node_table_t* save_stru
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2297,10 +2297,10 @@ _cfsml_read_node_table_t(Common::SeekableReadStream *fh, node_table_t* save_stru
_cfsml_error("Token expected by _cfsml_read_node_entry_t() for table[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->entries_nr = max ; // Set array size accordingly
save_struc->entries_nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -2354,7 +2354,7 @@ _cfsml_read_sys_strings_t(Common::SeekableReadStream *fh, sys_strings_t* save_st
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2394,7 +2394,7 @@ _cfsml_read_sys_strings_t(Common::SeekableReadStream *fh, sys_strings_t* save_st
_cfsml_error("Token expected by _cfsml_read_sys_string_t() for strings[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
} else
@ -2477,7 +2477,7 @@ _cfsml_read_node_t(Common::SeekableReadStream *fh, node_t* save_struc, const cha
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2585,7 +2585,7 @@ _cfsml_read_list_table_t(Common::SeekableReadStream *fh, list_table_t* save_stru
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2667,10 +2667,10 @@ _cfsml_read_list_table_t(Common::SeekableReadStream *fh, list_table_t* save_stru
_cfsml_error("Token expected by _cfsml_read_list_entry_t() for table[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->entries_nr = max ; // Set array size accordingly
save_struc->entries_nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -2719,7 +2719,7 @@ _cfsml_read_class_t(Common::SeekableReadStream *fh, class_t* save_struc, const c
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2880,7 +2880,7 @@ _cfsml_read_EngineState(Common::SeekableReadStream *fh, EngineState* save_struc,
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -2990,10 +2990,10 @@ _cfsml_read_EngineState(Common::SeekableReadStream *fh, EngineState* save_struc,
_cfsml_error("Token expected by _cfsml_read_class_t() for classtable[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->classtable_size = max ; // Set array size accordingly
save_struc->classtable_size = max ; // Set array size accordingly
} else
if (!strcmp(token, "sound")) {
#line 690 "engines/sci/engine/savegame.cfsml"
@ -3061,7 +3061,7 @@ _cfsml_read_SavegameMetadata(Common::SeekableReadStream *fh, SavegameMetadata* s
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -3180,7 +3180,7 @@ _cfsml_read_menu_t(Common::SeekableReadStream *fh, menu_t* save_struc, const cha
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -3255,10 +3255,10 @@ _cfsml_read_menu_t(Common::SeekableReadStream *fh, menu_t* save_struc, const cha
_cfsml_error("Token expected by _cfsml_read_menu_item_t() for items[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->items_nr = max ; // Set array size accordingly
save_struc->items_nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -3326,7 +3326,7 @@ _cfsml_read_clone_table_t(Common::SeekableReadStream *fh, clone_table_t* save_st
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -3408,10 +3408,10 @@ _cfsml_read_clone_table_t(Common::SeekableReadStream *fh, clone_table_t* save_st
_cfsml_error("Token expected by _cfsml_read_clone_entry_t() for table[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->entries_nr = max ; // Set array size accordingly
save_struc->entries_nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -3482,7 +3482,7 @@ _cfsml_read_clone_t(Common::SeekableReadStream *fh, clone_t* save_struc, const c
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -3571,10 +3571,10 @@ _cfsml_read_clone_t(Common::SeekableReadStream *fh, clone_t* save_struc, const c
_cfsml_error("Token expected by read_reg_t() for variables[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->variables_nr = max ; // Set array size accordingly
save_struc->variables_nr = max ; // Set array size accordingly
} else
#line 699 "engines/sci/engine/savegame.cfsml"
{
@ -3623,7 +3623,7 @@ _cfsml_read_list_t(Common::SeekableReadStream *fh, list_t* save_struc, const cha
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -3701,7 +3701,7 @@ _cfsml_read_sys_string_t(Common::SeekableReadStream *fh, sys_string_t* save_stru
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -3829,7 +3829,7 @@ _cfsml_read_script_t(Common::SeekableReadStream *fh, script_t* save_struc, const
return CFSML_FAILURE;
}
if (!assignment) {
if (!strcmp(token, "}"))
if (!strcmp(token, "}"))
closed = 1;
else {
_cfsml_error("Expected assignment or closing braces in line %d\n", *line);
@ -3953,10 +3953,10 @@ _cfsml_read_script_t(Common::SeekableReadStream *fh, script_t* save_struc, const
_cfsml_error("Token expected by _cfsml_read_object_t() for objects[i++] at line %d\n", *line);
return CFSML_FAILURE;
}
} else
} else
done = 1;
} while (!done);
save_struc->objects_allocated = max ; // Set array size accordingly
save_struc->objects_allocated = max ; // Set array size accordingly
} else
if (!strcmp(token, "locals_offset")) {
#line 690 "engines/sci/engine/savegame.cfsml"
@ -3991,7 +3991,7 @@ _cfsml_read_script_t(Common::SeekableReadStream *fh, script_t* save_struc, const
// Auto-generated CFSML declaration and function block ends here
// Auto-generation performed by cfsml.pl 0.8.2
// Auto-generation performed by cfsml.pl 0.8.2
#line 447 "engines/sci/engine/savegame.cfsml"
void write_songlib_t(Common::WriteStream *fh, songlib_t *songlib) {
@ -4974,9 +4974,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
}
*/
retval = (EngineState *) sci_malloc(sizeof(EngineState));
memset(retval, 0, sizeof(EngineState));
retval = new EngineState();
retval->savegame_version = -1;
_global_save_state = retval;
@ -5014,7 +5012,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
}
}
// End of auto-generated CFSML data reader code
#line 1038 "engines/sci/engine/savegame.cfsml"
#line 1036 "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)
@ -5066,7 +5064,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
}
}
// End of auto-generated CFSML data reader code
#line 1061 "engines/sci/engine/savegame.cfsml"
#line 1059 "engines/sci/engine/savegame.cfsml"
sfx_exit(&s->sound);
_gamestate_unfrob(retval);
@ -5105,10 +5103,6 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
// Time state:
retval->last_wait_time = g_system->getMillis();
// File IO state:
retval->file_handles_nr = 2;
retval->file_handles = (FILE **)sci_calloc(2, sizeof(FILE *));
// static parser information:
retval->parser_rules = s->parser_rules;
retval->parser_words_nr = s->parser_words_nr;
@ -5190,7 +5184,7 @@ bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata*
}
}
// End of auto-generated CFSML data reader code
#line 1156 "engines/sci/engine/savegame.cfsml"
#line 1150 "engines/sci/engine/savegame.cfsml"
if (read_eof)
return false;

View file

@ -1049,7 +1049,6 @@ int c_parse(EngineState *s) {
int c_save_game(EngineState *s) {
int omit_check = cmd_params[0].str[0] == '_';
int i;
if (!s) {
sciprintf("Not in debug state\n");
@ -1058,8 +1057,8 @@ int c_save_game(EngineState *s) {
if (!omit_check) {
int result = 0;
for (i = 0; i < s->file_handles_nr; i++)
if (s->file_handles[i])
for (uint i = 0; i < s->_fileHandles.size(); i++)
if (s->_fileHandles[i]._file)
result++;
if (result) {

View file

@ -27,6 +27,7 @@
#define _SCI_ENGINE_H
#include "common/scummsys.h"
#include "common/array.h"
namespace Common {
class SeekableReadStream;
@ -79,7 +80,22 @@ struct SavegameMetadata {
int savegame_time;
};
class FileHandle {
public:
FILE *_file;
FileHandle() : _file(0) {
}
~FileHandle() {
if (_file)
fclose(_file);
}
};
struct EngineState {
EngineState();
int savegame_version;
int widget_serial_counter; /* Used for savegames */
@ -171,8 +187,7 @@ struct EngineState {
/* Kernel File IO stuff */
int file_handles_nr; /* maximum numer of allowed file handles */
FILE **file_handles; /* Array of file handles. Dynamically increased if required. */
Common::Array<FileHandle> _fileHandles; /* Array of file handles. Dynamically increased if required. */
DirSeeker *dirseeker;

View file

@ -172,7 +172,7 @@ byte *kernel_dereference_bulk_pointer(EngineState *s, reg_t pointer, int entries
int kernel_oops(EngineState *s, const char *file, int line, const char *reason);
/* Halts script execution and informs the user about an internal kernel error or failed assertion
** Paramters: (EngineState *) s: The state to use
** Parameters: (EngineState *) s: The state to use
** (const char *) file: The file the oops occured in
** (int) line: The line the oops occured in
** (const char *) reason: Reason for the kernel oops

View file

@ -232,8 +232,7 @@ Common::Error SciEngine::go() {
map_MIDI_instruments(_resmgr);
#endif
EngineState* gamestate = (EngineState *) sci_malloc(sizeof(EngineState));
memset(gamestate, 0, sizeof(EngineState));
EngineState* gamestate = new EngineState();
gamestate->resmgr = _resmgr;
gamestate->gfx_state = NULL;
@ -313,7 +312,8 @@ Common::Error SciEngine::go() {
script_free_engine(gamestate); // Uninitialize game state
script_free_breakpoints(gamestate);
free(gamestate->work_dir);
free(gamestate);
delete gamestate;
delete _resmgr;