From 7dd9f809211ac6b976e9269112eca95637098285 Mon Sep 17 00:00:00 2001 From: David Griffith Date: Fri, 5 Jul 2019 19:12:26 -0700 Subject: [PATCH] Allow for alternative Blorb file at command line for curses, sdl, and dumb. Doing this for the SDL interface is proved a bit troublesome because it's not very clear where stuff is being set and where not. After the audio overhaul release, I want to overhaul the SDL interface code to make it as closely resemble as feasible that of the curses interface. --- doc/dfrotz.6 | 25 ++++++++++++++++++++++++- doc/frotz.6 | 25 ++++++++++++++++++++++++- doc/sfrotz.6 | 25 ++++++++++++++++++++++++- src/common/setup.h | 1 + src/curses/ux_blorb.c | 21 ++++++++++++--------- src/curses/ux_init.c | 18 +++++++++++++++++- src/dumb/dumb_blorb.c | 16 ++++++++++------ src/dumb/dumb_init.c | 18 +++++++++++++++++- src/sdl/sf_resource.c | 35 +++++++++++++++++++++++++++++------ src/sdl/sf_util.c | 13 +++++++------ 10 files changed, 165 insertions(+), 32 deletions(-) diff --git a/doc/dfrotz.6 b/doc/dfrotz.6 index d401bb8..f5226e8 100644 --- a/doc/dfrotz.6 +++ b/doc/dfrotz.6 @@ -6,7 +6,30 @@ dfrotz \- interpreter for Infocom and other Z-Machine games (dumb interface) .SH SYNOPSIS .B dfrotz -.RI [ options "] " file +.RI [ options "] " "file " [ blorbfile "]" + +At least one file must be specified on the command line. This can be +either a plain Z-code file or a Blorb file. A Z-code file is a compiled +executable for the Z-Machine. A Blorb file contains audio, graphics, +and other things in addition to the game wrapped up into a single file. +It can also optionally contain the Z-Machine executable. If a plain +Z-code file is supplied, then +.B Frotz +will check for a Blorb file with the same base name but an extension of +.B .blb, +.B .blorb, +or +.B .zblorb +and load it if found. + +If the file supplied on the command line is a Blorb file, then +.B Frotz +will check to see if a Z-code file is contained within. If not found, then +.B Frotz +will complain and exit. + +An alternatively-named Blorb file can be supplied as the optional second +parameter to the command line invocation. .SH DESCRIPTION diff --git a/doc/frotz.6 b/doc/frotz.6 index 58d5436..e8865b4 100644 --- a/doc/frotz.6 +++ b/doc/frotz.6 @@ -6,7 +6,30 @@ frotz \- interpreter for Infocom and other Z-Machine games .SH SYNOPSIS .B frotz -.RI [ options "] " file +.RI [ options "] " "file " [ blorbfile "]" + +At least one file must be specified on the command line. This can be +either a plain Z-code file or a Blorb file. A Z-code file is a compiled +executable for the Z-Machine. A Blorb file contains audio, graphics, +and other things in addition to the game wrapped up into a single file. +It can also optionally contain the Z-Machine executable. If a plain +Z-code file is supplied, then +.B Frotz +will check for a Blorb file with the same base name but an extension of +.B .blb, +.B .blorb, +or +.B .zblorb +and load it if found. + +If the file supplied on the command line is a Blorb file, then +.B Frotz +will check to see if a Z-code file is contained within. If not found, then +.B Frotz +will complain and exit. + +An alternatively-named Blorb file can be supplied as the optional second +parameter to the command line invocation. .SH DESCRIPTION diff --git a/doc/sfrotz.6 b/doc/sfrotz.6 index 38bb416..b53e114 100644 --- a/doc/sfrotz.6 +++ b/doc/sfrotz.6 @@ -6,7 +6,30 @@ sfrotz \- interpreter for Infocom and other Z-Machine games (SDL interface) .SH SYNOPSIS .B sfrotz -.RI [ options "] " file +.RI [ options "] " "file " [ blorbfile "]" + +At least one file must be specified on the command line. This can be +either a plain Z-code file or a Blorb file. A Z-code file is a compiled +executable for the Z-Machine. A Blorb file contains audio, graphics, +and other things in addition to the game wrapped up into a single file. +It can also optionally contain the Z-Machine executable. If a plain +Z-code file is supplied, then +.B Frotz +will check for a Blorb file with the same base name but an extension of +.B .blb, +.B .blorb, +or +.B .zblorb +and load it if found. + +If the file supplied on the command line is a Blorb file, then +.B Frotz +will check to see if a Z-code file is contained within. If not found, then +.B Frotz +will complain and exit. + +An alternatively-named Blorb file can be supplied as the optional second +parameter to the command line invocatio .SH DESCRIPTION diff --git a/src/common/setup.h b/src/common/setup.h index 0c1ab35..06c3e69 100644 --- a/src/common/setup.h +++ b/src/common/setup.h @@ -23,6 +23,7 @@ typedef struct frotz_setup_struct { int err_report_mode; char *story_file; + char *blorb_file; char *story_name; char *story_base; char *script_name; diff --git a/src/curses/ux_blorb.c b/src/curses/ux_blorb.c index 9c85027..34a1ffc 100644 --- a/src/curses/ux_blorb.c +++ b/src/curses/ux_blorb.c @@ -84,16 +84,19 @@ bb_err_t ux_blorb_init(char *filename) blorb_fp = fp; } else { fclose(fp); - len1 = strlen(filename) + strlen(EXT_BLORB); - len2 = strlen(filename) + strlen(EXT_BLORB3); - mystring = malloc(len2 * sizeof(char) + 1); - strncpy(mystring, filename, len1 * sizeof(char)); - p = strrchr(mystring, '.'); - if (p != NULL) - *p = '\0'; - - strncat(mystring, EXT_BLORB, len1 * sizeof(char)); + if (f_setup.blorb_file != NULL) + mystring = strdup(f_setup.blorb_file); + else { + len1 = strlen(filename) + strlen(EXT_BLORB); + len2 = strlen(filename) + strlen(EXT_BLORB3); + mystring = malloc(len2 * sizeof(char) + 1); + strncpy(mystring, filename, len1 * sizeof(char)); + p = strrchr(mystring, '.'); + if (p != NULL) + *p = '\0'; + strncat(mystring, EXT_BLORB, len1 * sizeof(char)); + } /* Check if foo.blb is there. */ if ((fp = os_path_open(mystring, "rb")) == NULL) { diff --git a/src/curses/ux_init.c b/src/curses/ux_init.c index 5e09769..b4f2812 100644 --- a/src/curses/ux_init.c +++ b/src/curses/ux_init.c @@ -316,7 +316,7 @@ void os_process_arguments (int argc, char *argv[]) } while (c != EOF); - if (zoptind != argc - 1) { + if ((argv[zoptind] == NULL)) { printf("FROTZ V%s\tCurses interface. ", VERSION); #ifndef NO_SOUND @@ -340,6 +340,9 @@ void os_process_arguments (int argc, char *argv[]) f_setup.story_file = strdup(argv[zoptind]); f_setup.story_name = strdup(basename(argv[zoptind])); + if (argv[zoptind+1] != NULL) + f_setup.blorb_file = strdup(argv[zoptind+1]); + /* Now strip off the extension */ p = strrchr(f_setup.story_name, '.'); if ( p != NULL ) @@ -1104,6 +1107,19 @@ void os_init_setup(void) f_setup.err_report_mode = ERR_DEFAULT_REPORT_MODE; f_setup.restore_mode = 0; + f_setup.blorb_file = NULL; + f_setup.story_file = NULL; + f_setup.story_name = NULL; + f_setup.story_base = NULL; + f_setup.script_name = NULL; + f_setup.command_name = NULL; + f_setup.save_name = NULL; + f_setup.tmp_save_name = NULL; + f_setup.aux_name = NULL; + f_setup.story_path = NULL; + f_setup.zcode_path = NULL; + f_setup.restricted_path = NULL; + f_setup.use_blorb = 0; f_setup.exec_in_blorb = 0; diff --git a/src/dumb/dumb_blorb.c b/src/dumb/dumb_blorb.c index 1cf77bc..4227c9c 100644 --- a/src/dumb/dumb_blorb.c +++ b/src/dumb/dumb_blorb.c @@ -95,12 +95,16 @@ bb_err_t dumb_blorb_init(char *filename) fp = NULL; /* Check if foo.blb is there. */ - if ((blorb_fp = fopen(mystring, "rb")) == NULL) { - p = strrchr(mystring, '.'); - if (p != NULL) - *p = '\0'; - strncat(mystring, EXT_BLORB3, len2 * sizeof(char)); - blorb_fp = fopen(mystring, "rb"); + if (f_setup.blorb_file != NULL) + mystring = strdup(f_setup.blorb_file); + else { + if ((blorb_fp = fopen(mystring, "rb")) == NULL) { + p = strrchr(mystring, '.'); + if (p != NULL) + *p = '\0'; + strncat(mystring, EXT_BLORB3, len2 * sizeof(char)); + blorb_fp = fopen(mystring, "rb"); + } } if (blorb_fp == NULL || !isblorb(fp)) /* No matching blorbs found. */ diff --git a/src/dumb/dumb_init.c b/src/dumb/dumb_init.c index 713b8bc..08e32a0 100644 --- a/src/dumb/dumb_init.c +++ b/src/dumb/dumb_init.c @@ -138,7 +138,7 @@ void os_process_arguments(int argc, char *argv[]) } } while (c != EOF); - if (((argc - zoptind) != 1) && ((argc - zoptind) != 2)) { + if ((argv[zoptind] == NULL)) { printf("FROTZ V%s\tDumb interface.\n", VERSION); puts(INFORMATION); puts(INFO2); @@ -150,6 +150,9 @@ void os_process_arguments(int argc, char *argv[]) f_setup.story_file = strdup(argv[zoptind]); f_setup.story_name = strdup(basename(argv[zoptind])); + if (argv[zoptind+1] != NULL) + f_setup.blorb_file = strdup(argv[zoptind+1]); + /* Now strip off the extension */ p = strrchr(f_setup.story_name, '.'); if ( p != NULL ) @@ -297,6 +300,19 @@ void os_init_setup(void) f_setup.sound = 1; f_setup.err_report_mode = ERR_DEFAULT_REPORT_MODE; f_setup.restore_mode = 0; + + f_setup.blorb_file = NULL; + f_setup.story_file = NULL; + f_setup.story_name = NULL; + f_setup.story_base = NULL; + f_setup.script_name = NULL; + f_setup.command_name = NULL; + f_setup.save_name = NULL; + f_setup.tmp_save_name = NULL; + f_setup.aux_name = NULL; + f_setup.story_path = NULL; + f_setup.zcode_path = NULL; + f_setup.restricted_path = NULL; } static void print_version(void) diff --git a/src/sdl/sf_resource.c b/src/sdl/sf_resource.c index f3a91f5..7ba1cba 100644 --- a/src/sdl/sf_resource.c +++ b/src/sdl/sf_resource.c @@ -201,13 +201,23 @@ static int load_resources( char *givenfn) zsize = ftell(f); zoffset = 0; - // try loading a corresponding blorb, but without complaining... - p = strrchr(buf,'.'); - if (p){ - strcpy(p,".blb"); - tryloadblorb(buf); + // See if the user explicitly provided a blorb file + if (f_setup.blorb_file != NULL) { + tryloadblorb(f_setup.blorb_file); + } else { + // No? Let's see if we can find one. + p = malloc(strlen(f_setup.story_name) + strlen(EXT_BLORB4) * sizeof(char)); + strncpy(p, f_setup.story_name, strlen(f_setup.story_name)); + strncat(p, EXT_BLORB3, strlen(EXT_BLORB3)+1); + + if (tryloadblorb(p) != bb_err_None) { /* Trying foo.blorb */ + free(p); + p = malloc(strlen(f_setup.story_name) + strlen(EXT_BLORB4) * sizeof(char)); + strncpy(p, f_setup.story_name, strlen(f_setup.story_name)); + strncat(p, EXT_BLORB, strlen(EXT_BLORB)+1); + tryloadblorb(p); /* Trying foo.blb */ } - + } return 0; } @@ -1075,5 +1085,18 @@ void os_init_setup(void) f_setup.err_report_mode = ERR_DEFAULT_REPORT_MODE; f_setup.restore_mode = 0; + f_setup.blorb_file = NULL; + f_setup.story_file = NULL; + f_setup.story_name = NULL; + f_setup.story_base = NULL; + f_setup.script_name = NULL; + f_setup.command_name = NULL; + f_setup.save_name = NULL; + f_setup.tmp_save_name = NULL; + f_setup.aux_name = NULL; + f_setup.story_path = NULL; + f_setup.zcode_path = NULL; + f_setup.restricted_path = NULL; + sdl_active = FALSE; } diff --git a/src/sdl/sf_util.c b/src/sdl/sf_util.c index 55d14c0..78d3b12 100644 --- a/src/sdl/sf_util.c +++ b/src/sdl/sf_util.c @@ -333,19 +333,18 @@ void os_process_arguments (int argc, char *argv[]) sf_readsettings(); parse_options(argc, argv); - if (optind != argc - 1) + if (argv[optind] == NULL) { usage(); exit (EXIT_FAILURE); } f_setup.story_file = strdup(argv[optind]); - // it's useless to test the retval, as in case of error it does not return - sf_load_resources( f_setup.story_file); + if(argv[optind+1] != NULL) + f_setup.blorb_file = argv[optind+1]; /* Strip path and extension off the story file name */ - - f_setup.story_name = new_basename(argv[optind]); + f_setup.story_name = new_basename(f_setup.story_file); /* Now strip off the extension. */ p = strrchr(f_setup.story_name, '.'); @@ -358,7 +357,6 @@ void os_process_arguments (int argc, char *argv[]) else // blorb_ext = strdup(EXT_BLORB); - /* Get rid of extensions with 1 to 6 character extensions. */ /* This will take care of an extension like ".zblorb". */ /* More than that, there might be something weird going on */ @@ -406,6 +404,9 @@ void os_process_arguments (int argc, char *argv[]) if (user_foreground != -1) m_defaultFore = sf_GetColour(user_foreground); if (user_tandy_bit != -1) m_tandy = user_tandy_bit; + // it's useless to test the retval, as in case of error it does not return + sf_load_resources( f_setup.story_file); + sf_initfonts(); }/* os_process_arguments */ -- 2.34.1