SCI: Rewrite the way file handles are managed
svn-id: r38794
This commit is contained in:
parent
4a6d6e8988
commit
1687a5e8d0
8 changed files with 252 additions and 106 deletions
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue