diff options
Diffstat (limited to 'engines/glk/agt')
-rw-r--r-- | engines/glk/agt/agt.cpp | 13 | ||||
-rw-r--r-- | engines/glk/agt/agt.h | 3 | ||||
-rw-r--r-- | engines/glk/agt/filename.cpp | 12 | ||||
-rw-r--r-- | engines/glk/agt/interp.h | 2 | ||||
-rw-r--r-- | engines/glk/agt/os_glk.cpp | 105 | ||||
-rw-r--r-- | engines/glk/agt/util.cpp | 3 |
6 files changed, 30 insertions, 108 deletions
diff --git a/engines/glk/agt/agt.cpp b/engines/glk/agt/agt.cpp index ea28cf8f4f..ff78e59909 100644 --- a/engines/glk/agt/agt.cpp +++ b/engines/glk/agt/agt.cpp @@ -31,15 +31,22 @@ namespace AGT { AGT *g_vm; extern void glk_main(); -extern int glk_startup_code(int argc, char *argv[]); +extern int glk_startup_code(); +extern void gagt_finalizer(); -AGT::AGT(OSystem *syst, const GlkGameDescription &gameDesc) : GlkAPI(syst, gameDesc) { +AGT::AGT(OSystem *syst, const GlkGameDescription &gameDesc) : GlkAPI(syst, gameDesc), + gagt_gamefile(nullptr), gagt_game_message(nullptr) { g_vm = this; } void AGT::runGame() { - glk_startup_code(0, nullptr); + _gameFile.close(); + gagt_gamefile = getFilename().c_str(); + + glk_startup_code(); glk_main(); + + gagt_finalizer(); } Common::Error AGT::readSaveData(Common::SeekableReadStream *rs) { diff --git a/engines/glk/agt/agt.h b/engines/glk/agt/agt.h index 1d4ed00154..1f23b2bbff 100644 --- a/engines/glk/agt/agt.h +++ b/engines/glk/agt/agt.h @@ -37,6 +37,9 @@ namespace AGT { */ class AGT : public GlkAPI { public: + const char *gagt_gamefile = NULL; /* Name of game file. */ + const char *gagt_game_message = NULL; /* Error message. */ +public: /** * Constructor */ diff --git a/engines/glk/agt/filename.cpp b/engines/glk/agt/filename.cpp index 75f18f8bea..f3e95533cf 100644 --- a/engines/glk/agt/filename.cpp +++ b/engines/glk/agt/filename.cpp @@ -550,14 +550,10 @@ rbool filevalid(genfile f, filetype ft) { void binseek(genfile f, long offset) { - assert(f != NULL); - assert(offset >= 0); -#ifdef UNIX_IO - if (lseek(fileno(f), offset, SEEK_SET) == -1) -#else - if (fseek(f, offset, SEEK_SET) != 0) -#endif - fatal("binseek"); + Common::SeekableReadStream *rs = dynamic_cast<Common::SeekableReadStream *>(f); + assert(rs); + + rs->seek(offset); } diff --git a/engines/glk/agt/interp.h b/engines/glk/agt/interp.h index 872e8873e3..9bf5d65dcb 100644 --- a/engines/glk/agt/interp.h +++ b/engines/glk/agt/interp.h @@ -453,7 +453,7 @@ global volatile int screen_width, status_width; global int screen_height; global volatile int curr_x; -extern void init_interface(int argc, char *argv[]); +extern void init_interface(); extern void start_interface(fc_type fc); extern void close_interface(void); extern char *agt_input(int in_type); /* read line, return malloc'd string */ diff --git a/engines/glk/agt/os_glk.cpp b/engines/glk/agt/os_glk.cpp index 1d9abd6838..9f01eec9d5 100644 --- a/engines/glk/agt/os_glk.cpp +++ b/engines/glk/agt/os_glk.cpp @@ -5067,7 +5067,7 @@ genfile agt_globalfile(int fid) { * General initialization for the module; sets some variables, and creates * the Glk windows to work in. Called from the AGiliTy main(). */ -void init_interface(int argc, char *argv[]) { +void init_interface() { glui32 status_height; /* @@ -5147,7 +5147,6 @@ void init_interface(int argc, char *argv[]) { } agt_clrscr(); - gagt_debug("init_interface", "argc=%d, argv=%p", argc, argv); } @@ -5525,15 +5524,6 @@ int __wrap_tolower(int ch) { extern void set_default_options(); /* - * The following values need to be passed between the startup_code and main - * functions. - */ -static int gagt_saved_argc = 0; /* Recorded argc. */ -static char **gagt_saved_argv = NULL, /* Recorded argv. */ - *gagt_gamefile = NULL; /* Name of game file. */ -static const char *gagt_game_message = NULL; /* Error message. */ - -/* * Flag to set if we want to test for a clean exit. Without this it's a * touch tricky sometimes to corner AGiliTy into calling exit() for us; it * tends to require a broken game file. @@ -5656,73 +5646,19 @@ static int gagt_parse_option(const char *option) { * gagt_main() * * Together, these functions take the place of the original AGiliTy main(). - * The first one is called from glkunix_startup_code(), to parse and - * generally handle options. The second is called from glk_main(), and - * does the real work of running the game. + * The first one is called from glkunix_startup_code(). The second is called + * from glk_main(), and does the real work of running the game. */ -int gagt_startup_code(int argc, char *argv[]) { - int argv_index; - - /* - * Before doing anything else, stash argc and argv away for use by - * gagt_main() below. - */ - gagt_saved_argc = argc; - gagt_saved_argv = argv; - +bool gagt_startup_code() { /* Make the mandatory call for initialization. */ set_default_options(); - /* Handle command line arguments. */ - for (argv_index = 1; - argv_index < argc && argv[argv_index][0] == '-'; argv_index++) { - /* - * Handle an option string coming after "-". If the options parse - * fails, return FALSE. - */ - if (!gagt_parse_option(argv[argv_index])) - return FALSE; - } - - /* - * Get the name of the game file. Since we need this in our call from - * glk_main, we need to keep it in a module static variable. If the game - * file name is omitted, then here we'll set the pointer to NULL, and - * complain about it later in main. Passing the message string around - * like this is a nuisance... - */ - if (argv_index == argc - 1) { - gagt_gamefile = argv[argv_index]; - gagt_game_message = NULL; -#ifdef GARGLK - char *s; - s = strrchr(gagt_gamefile, '\\'); - if (s) g_vm->garglk_set_story_name(s + 1); - s = strrchr(gagt_gamefile, '/'); - if (s) g_vm->garglk_set_story_name(s + 1); -#endif /* GARGLK */ - } else { - gagt_gamefile = NULL; - if (argv_index < argc - 1) - gagt_game_message = "More than one game file was given" - " on the command line."; - else - gagt_game_message = "No game file was given on the command line."; - } - /* All startup options were handled successfully. */ return TRUE; } static void gagt_main() { fc_type fc; - assert(gagt_saved_argc != 0 && gagt_saved_argv); - - /* Ensure AGiliTy internal types have the right sizes. */ - if (sizeof(integer) < 2 || sizeof(int32) < 4 || sizeof(uint32) < 4) { - gagt_fatal("GLK: Types sized incorrectly, recompilation is needed"); - gagt_exit(); - } /* * Initialize the interface. As it happens, init_interface() is in our @@ -5734,7 +5670,7 @@ static void gagt_main() { * window. As it doesn't return status, we have to detect this by checking * that gagt_main_window is not NULL. */ - init_interface(gagt_saved_argc, gagt_saved_argv); + init_interface(); if (!gagt_main_window) { gagt_fatal("GLK: Can't open main window"); gagt_exit(); @@ -5743,29 +5679,18 @@ static void gagt_main() { g_vm->glk_set_window(gagt_main_window); g_vm->glk_set_style(style_Normal); - /* If there's a problem with the game file, complain now. */ - if (!gagt_gamefile) { - assert(gagt_game_message); - if (gagt_status_window) - g_vm->glk_window_close(gagt_status_window, NULL); - gagt_header_string("Glk AGiliTy Error\n\n"); - gagt_normal_string(gagt_game_message); - gagt_normal_char('\n'); - gagt_exit(); - } - /* * Create a game file context, and try to ensure it will open successfully * in run_game(). */ - fc = init_file_context(gagt_gamefile, fDA1); + fc = init_file_context(g_vm->gagt_gamefile, fDA1); if (!(gagt_workround_fileexist(fc, fAGX) || gagt_workround_fileexist(fc, fDA1))) { if (gagt_status_window) g_vm->glk_window_close(gagt_status_window, NULL); gagt_header_string("Glk AGiliTy Error\n\n"); gagt_normal_string("Can't find or open game '"); - gagt_normal_string(gagt_gamefile); + gagt_normal_string(g_vm->gagt_gamefile); gagt_normal_char('\''); gagt_normal_char('\n'); gagt_exit(); @@ -5860,7 +5785,7 @@ static int gagt_agility_running = FALSE; * we do, and interpreter code is still running, it's a sign that we need * to take actions we'd hoped not to have to take. */ -static void gagt_finalizer() { +void gagt_finalizer() { /* * If interpreter code is still active, and we're not in a g_vm->glk_select(), * the core interpreter code called exit(). Handle cleanup. @@ -5983,16 +5908,6 @@ void glk_main() { gagt_main_called = TRUE; /* - * Register gagt_finalizer() with atexit() to cleanup on exit. Note that - * this module doesn't expect the atexit() handler to be called on all - * forms of exit -- see comments in gagt_finalizer() for more. - */ - if (atexit(gagt_finalizer) != 0) { - gagt_fatal("GLK: Failed to register finalizer"); - gagt_exit(); - } - - /* * If we're testing for a clean exit, deliberately call exit() to see what * happens. We're hoping for a clean process termination, but our exit * code explores "undefined" ANSI. If we get something ugly, like a core @@ -6088,11 +6003,11 @@ glkunix_argumentlist_t glkunix_arguments[] = { * function to parse arguments and generally set stuff up. */ -int glk_startup_code(int argc, char *argv[]) { +int glk_startup_code() { assert(!gagt_startup_called); gagt_startup_called = TRUE; - return gagt_startup_code(argc, argv); + return gagt_startup_code(); } } // End of namespace AGT diff --git a/engines/glk/agt/util.cpp b/engines/glk/agt/util.cpp index 0bf96351f1..76b4a63e90 100644 --- a/engines/glk/agt/util.cpp +++ b/engines/glk/agt/util.cpp @@ -369,7 +369,8 @@ int fseek(genfile stream, long int offset, int whence) { size_t fread(void *ptr, size_t size, size_t nmemb, genfile stream) { Common::SeekableReadStream *rs = dynamic_cast<Common::SeekableReadStream *>(stream); assert(rs); - return rs->read(ptr, size * nmemb); + size_t bytesRead = rs->read(ptr, size * nmemb); + return bytesRead / size; } size_t fwrite(const void *ptr, size_t size, size_t nmemb, genfile stream) { |