aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2019-10-19 15:43:18 -0700
committerPaul Gilbert2019-10-26 11:13:29 -0700
commit0ecae64fdc00a7c874cc02a5cb4a1c37249687ef (patch)
tree3d0ee4ab4289796e98cb1de88844052e74f6e07f
parent25c682793d0034fea7e5c48425f9acb4b43bba9f (diff)
downloadscummvm-rg350-0ecae64fdc00a7c874cc02a5cb4a1c37249687ef.tar.gz
scummvm-rg350-0ecae64fdc00a7c874cc02a5cb4a1c37249687ef.tar.bz2
scummvm-rg350-0ecae64fdc00a7c874cc02a5cb4a1c37249687ef.zip
GLK: LEVEL9: Cleaning up initialization
-rw-r--r--engines/glk/level9/level9.cpp6
-rw-r--r--engines/glk/level9/level9_main.cpp125
-rw-r--r--engines/glk/level9/level9_main.h48
-rw-r--r--engines/glk/level9/os_glk.cpp201
-rw-r--r--engines/glk/level9/os_glk.h39
5 files changed, 237 insertions, 182 deletions
diff --git a/engines/glk/level9/level9.cpp b/engines/glk/level9/level9.cpp
index 6d8baa115e..be4ac2216d 100644
--- a/engines/glk/level9/level9.cpp
+++ b/engines/glk/level9/level9.cpp
@@ -21,15 +21,14 @@
*/
#include "glk/level9/level9.h"
+#include "glk/level9/level9_main.h"
+#include "glk/level9/os_glk.h"
namespace Glk {
namespace Level9 {
Level9 *g_vm = nullptr;
-extern void gln_main(const char *filename);
-extern int gln_startup_code(int argc, char *argv[]);
-
Level9::Level9(OSystem *syst, const GlkGameDescription &gameDesc) : GlkAPI(syst, gameDesc) {
g_vm = this;
}
@@ -37,6 +36,7 @@ Level9::Level9(OSystem *syst, const GlkGameDescription &gameDesc) : GlkAPI(syst,
void Level9::runGame() {
initialize();
+
_gameFile.close();
gln_main(getFilename().c_str());
diff --git a/engines/glk/level9/level9_main.cpp b/engines/glk/level9/level9_main.cpp
index 9a089849f2..043266a178 100644
--- a/engines/glk/level9/level9_main.cpp
+++ b/engines/glk/level9/level9_main.cpp
@@ -57,10 +57,10 @@ namespace Level9 {
#define FIRSTLINESIZE 96
/* Typedefs */
-typedef struct {
+struct SaveStruct {
L9UINT16 vartable[256];
L9BYTE listarea[LISTAREASIZE];
-} SaveStruct;
+};
/* Enumerations */
enum L9GameTypes { L9_V1, L9_V2, L9_V3, L9_V4 };
@@ -76,7 +76,7 @@ enum L9MsgTypes { MSGT_V1, MSGT_V2 };
enum L9GfxTypes { GFX_V2, GFX_V3A, GFX_V3B, GFX_V3C };
/* Global Variables */
-L9BYTE *startfile = NULL, *pictureaddress = NULL, *picturedata = NULL;
+L9BYTE *startfile, *pictureaddress, *picturedata;
L9BYTE *startdata;
L9UINT32 FileSize, picturesize;
@@ -95,43 +95,39 @@ int L9GameType;
int L9MsgType;
char LastGame[MAX_PATH];
char FirstLine[FIRSTLINESIZE];
-int FirstLinePos = 0;
-int FirstPicture = -1;
+int FirstLinePos;
+int FirstPicture;
-#if defined(AMIGA) && defined(_DCC)
-__far SaveStruct ramsavearea[RAMSAVESLOTS];
-#else
SaveStruct ramsavearea[RAMSAVESLOTS];
-#endif
GameState workspace;
L9UINT16 randomseed;
-L9UINT16 constseed = 0;
+L9UINT16 constseed;
L9BOOL Running;
char ibuff[IBUFFSIZE];
L9BYTE *ibuffptr;
char obuff[34];
-Common::SeekableReadStream *scriptfile = NULL;
+Common::SeekableReadStream *scriptfile;
-L9BOOL Cheating = FALSE;
+L9BOOL Cheating;
int CheatWord;
GameState CheatWorkspace;
int reflectflag, scale, gintcolour, option;
-int l9textmode = 0, drawx = 0, drawy = 0, screencalled = 0, showtitle = 1;
-L9BYTE *gfxa5 = NULL;
-Bitmap *bitmap = NULL;
-int gfx_mode = GFX_V2;
+int l9textmode, drawx, drawy, screencalled, showtitle;
+L9BYTE *gfxa5;
+Bitmap *bitmap;
+int gfx_mode;
L9BYTE *GfxA5Stack[GFXSTACKSIZE];
-int GfxA5StackPos = 0;
+int GfxA5StackPos;
int GfxScaleStack[GFXSTACKSIZE];
-int GfxScaleStackPos = 0;
+int GfxScaleStackPos;
-char lastchar = '.';
-char lastactualchar = 0;
+char lastchar;
+char lastactualchar;
int d5;
L9BYTE *codeptr; /* instruction codes */
@@ -141,7 +137,7 @@ L9BYTE *list9ptr;
int unpackd3;
-L9BYTE exitreversaltable[16] = {0x00, 0x04, 0x06, 0x07, 0x01, 0x08, 0x02, 0x03, 0x05, 0x0a, 0x09, 0x0c, 0x0b, 0xff, 0xff, 0x0f};
+const L9BYTE exitreversaltable[16] = {0x00, 0x04, 0x06, 0x07, 0x01, 0x08, 0x02, 0x03, 0x05, 0x0a, 0x09, 0x0c, 0x0b, 0xff, 0xff, 0x0f};
L9UINT16 gnostack[128];
L9BYTE gnoscratch[32];
@@ -159,8 +155,7 @@ const L9V1GameInfo L9V1Games[] = {
0x15, 0x5d, 252, -0x3e70, 0x0000, -0x3d30, -0x3ca0, 0x0100, 0x4120, -0x3b9d, 0x3988, /* Lords of Time */
0x15, 0x6c, 284, -0x00f0, 0x0000, -0x0050, -0x0050, -0x0050, 0x0300, 0x1930, 0x3c17, /* Snowball */
};
-int L9V1Game = -1;
-
+int L9V1Game;
/* Prototypes */
L9BOOL LoadGame2(const char *filename, char *picname);
@@ -255,6 +250,30 @@ const char *const drivercalls[] = {
};
#endif
+void level9_initialize() {
+ FirstLinePos = 0;
+ FirstPicture = -1;
+ constseed = 0;
+ scriptfile = nullptr;
+ Cheating = FALSE;
+ l9textmode = 0;
+ drawx = 0;
+ drawy = 0;
+ screencalled = 0;
+ showtitle = 1;
+ gfxa5 = nullptr;
+ gfx_mode = GFX_V2;
+
+ GfxA5StackPos = 0;
+ GfxScaleStackPos = 0;
+
+ lastchar = '.';
+ lastactualchar = 0;
+ L9V1Game = -1;
+
+ startfile = pictureaddress = picturedata = nullptr;
+}
+
void initdict(L9BYTE *ptr) {
dictptr = ptr;
unpackcount = 8;
@@ -621,7 +640,7 @@ void printmessageV2(int Msg) {
void L9Allocate(L9BYTE **ptr, L9UINT32 Size) {
if (*ptr) free(*ptr);
*ptr = (L9BYTE *)malloc(Size);
- if (*ptr == NULL) {
+ if (*ptr == nullptr) {
error("Unable to allocate memory for the game! Exiting...");
}
}
@@ -629,11 +648,11 @@ void L9Allocate(L9BYTE **ptr, L9UINT32 Size) {
void FreeMemory() {
if (startfile) {
free(startfile);
- startfile = NULL;
+ startfile = nullptr;
}
if (pictureaddress) {
free(pictureaddress);
- pictureaddress = NULL;
+ pictureaddress = nullptr;
}
if (bitmap) {
free(bitmap);
@@ -641,11 +660,11 @@ void FreeMemory() {
}
if (scriptfile) {
delete scriptfile;
- scriptfile = NULL;
+ scriptfile = nullptr;
}
- picturedata = NULL;
+ picturedata = nullptr;
picturesize = 0;
- gfxa5 = NULL;
+ gfxa5 = nullptr;
}
L9BOOL load(const char *filename) {
@@ -901,7 +920,7 @@ long Scan(L9BYTE *StartFile, L9UINT32 size) {
long Offset = -1;
L9BOOL JumpKill, DriverV4;
- if ((Chk == NULL) || (Image == NULL)) {
+ if ((Chk == nullptr) || (Image == nullptr)) {
error("Unable to allocate memory for game scan! Exiting...");
}
@@ -967,7 +986,7 @@ long ScanV2(L9BYTE *StartFile, L9UINT32 size) {
long Offset = -1;
L9BOOL JumpKill;
- if ((Chk == NULL) || (Image == NULL)) {
+ if ((Chk == nullptr) || (Image == nullptr)) {
error("Unable to allocate memory for game scan! Exiting...");
}
@@ -992,7 +1011,7 @@ long ScanV2(L9BYTE *StartFile, L9UINT32 size) {
Size = 0;
Min = Max = i + d0;
- if (ValidateSequence(StartFile, Image, i + d0, i + d0, &Size, size, &Min, &Max, FALSE, &JumpKill, NULL)) {
+ if (ValidateSequence(StartFile, Image, i + d0, i + d0, &Size, size, &Min, &Max, FALSE, &JumpKill, nullptr)) {
#ifdef L9DEBUG
printf("Found valid V2 header at %ld, code size %ld", i, Size);
#endif
@@ -1021,7 +1040,7 @@ long ScanV1(L9BYTE *StartFile, L9UINT32 size) {
int dictOff1 = 0, dictOff2 = 0;
L9BYTE dictVal1 = 0xff, dictVal2 = 0xff;
- if (Image == NULL) {
+ if (Image == nullptr) {
error("Unable to allocate memory for game scan! Exiting...");
}
@@ -1030,7 +1049,7 @@ long ScanV1(L9BYTE *StartFile, L9UINT32 size) {
Size = 0;
Min = Max = i;
Replace = 0;
- if (ValidateSequence(StartFile, Image, i, i, &Size, size, &Min, &Max, FALSE, &JumpKill, NULL)) {
+ if (ValidateSequence(StartFile, Image, i, i, &Size, size, &Min, &Max, FALSE, &JumpKill, nullptr)) {
if (Size > MaxCount && Size > 100 && Size < 10000) {
MaxCount = Size;
//MaxMin = Min;
@@ -1109,7 +1128,7 @@ void FullScan(L9BYTE *StartFile, L9UINT32 size) {
Size = 0;
Min = Max = i;
Replace = 0;
- if (ValidateSequence(StartFile, Image, i, i, &Size, size, &Min, &Max, FALSE, &JumpKill, NULL)) {
+ if (ValidateSequence(StartFile, Image, i, i, &Size, size, &Min, &Max, FALSE, &JumpKill, nullptr)) {
if (Size > MaxCount) {
MaxCount = Size;
MaxMin = Min;
@@ -1223,11 +1242,11 @@ L9BOOL intinitialise(const char *filename, char *picname) {
if (pictureaddress) {
free(pictureaddress);
- pictureaddress = NULL;
+ pictureaddress = nullptr;
}
- picturedata = NULL;
+ picturedata = nullptr;
picturesize = 0;
- gfxa5 = NULL;
+ gfxa5 = nullptr;
if (!load(filename)) {
error("\rUnable to load: %s\r", filename);
@@ -1241,7 +1260,7 @@ L9BOOL intinitialise(const char *filename, char *picname) {
L9Allocate(&pictureaddress, picturesize);
if (f.read(pictureaddress, picturesize) != picturesize) {
free(pictureaddress);
- pictureaddress = NULL;
+ pictureaddress = nullptr;
picturesize = 0;
}
f.close();
@@ -1356,13 +1375,13 @@ L9BOOL intinitialise(const char *filename, char *picname) {
/* If there was no graphics file, look in the game data */
if (pictureaddress) {
if (!findsubs(pictureaddress, picturesize, &picturedata, &picturesize)) {
- picturedata = NULL;
+ picturedata = nullptr;
picturesize = 0;
}
} else {
if (!findsubs(startdata, FileSize, &picturedata, &picturesize)
&& !findsubs(startfile, startdata - startfile, &picturedata, &picturesize)) {
- picturedata = NULL;
+ picturedata = nullptr;
picturesize = 0;
}
}
@@ -1712,7 +1731,7 @@ void calldriver() {
} else {
os_set_filenumber(NewName, MAX_PATH, *a6);
}
- LoadGame2(NewName, NULL);
+ LoadGame2(NewName, nullptr);
} else driver(d0, a6);
}
@@ -1859,10 +1878,10 @@ void l9_fgets(char *s, int n, Common::SeekableReadStream *f) {
}
L9BOOL scriptinput(char *buffer, int size) {
- while (scriptfile != NULL) {
+ while (scriptfile != nullptr) {
if (scriptfile->eos()) {
delete scriptfile;
- scriptfile = NULL;
+ scriptfile = nullptr;
} else {
char *p = buffer;
*p = '\0';
@@ -2150,7 +2169,7 @@ L9BOOL corruptinginput() {
list9ptr = list9startptr;
- if (ibuffptr == NULL) {
+ if (ibuffptr == nullptr) {
if (Cheating) NextCheat();
else {
/* flush */
@@ -2183,7 +2202,7 @@ L9BOOL corruptinginput() {
while (TRUE) {
d0 = *a6++;
if (d0 == 0) {
- ibuffptr = NULL;
+ ibuffptr = nullptr;
L9SETWORD(list9ptr, 0);
return TRUE;
}
@@ -3107,7 +3126,7 @@ void show_picture(int pic) {
GfxScaleStackPos = 0;
absrunsub(0);
if (!findsub(pic, &gfxa5))
- gfxa5 = NULL;
+ gfxa5 = nullptr;
}
}
@@ -3117,14 +3136,14 @@ void picture() {
void GetPictureSize(int *width, int *height) {
if (L9GameType == L9_V4) {
- if (width != NULL)
+ if (width != nullptr)
*width = 0;
- if (height != NULL)
+ if (height != nullptr)
*height = 0;
} else {
- if (width != NULL)
+ if (width != nullptr)
*width = (gfx_mode != GFX_V3C) ? 160 : 320;
- if (height != NULL)
+ if (height != nullptr)
*height = (gfx_mode == GFX_V2) ? 128 : 96;
}
}
@@ -3132,7 +3151,7 @@ void GetPictureSize(int *width, int *height) {
L9BOOL RunGraphics() {
if (gfxa5) {
if (!getinstruction(&gfxa5))
- gfxa5 = NULL;
+ gfxa5 = nullptr;
return TRUE;
}
return FALSE;
@@ -3506,7 +3525,7 @@ L9BOOL LoadGame2(const char *filename, char *picname) {
/* may be already running a game, maybe in input routine */
Running = FALSE;
- ibuffptr = NULL;
+ ibuffptr = nullptr;
/* intstart */
if (!intinitialise(filename, picname)) return FALSE;
diff --git a/engines/glk/level9/level9_main.h b/engines/glk/level9/level9_main.h
index ab30242c07..ec04db376a 100644
--- a/engines/glk/level9/level9_main.h
+++ b/engines/glk/level9/level9_main.h
@@ -86,32 +86,34 @@ struct Bitmap {
#define L9SETWORD(x,val) WRITE_LE_UINT16(x, val)
#define L9SETDWORD(x,val) WRITE_LE_UINT32(x, val)
+extern void level9_initialize();
+
/* routines provided by os dependent code */
-void os_printchar(char c);
-L9BOOL os_input(char *ibuff, int size);
-char os_readchar(int millis);
-L9BOOL os_stoplist(void);
-void os_flush(void);
-L9BOOL os_save_file(L9BYTE *Ptr, int Bytes);
-L9BOOL os_load_file(L9BYTE *Ptr, int *Bytes, int Max);
-L9BOOL os_get_game_file(char *NewName, int Size);
-void os_set_filenumber(char *NewName, int Size, int n);
-void os_graphics(int mode);
-void os_cleargraphics(void);
-void os_setcolour(int colour, int index);
-void os_drawline(int x1, int y1, int x2, int y2, int colour1, int colour2);
-void os_fill(int x, int y, int colour1, int colour2);
-void os_show_bitmap(int pic, int x, int y);
-Common::SeekableReadStream *os_open_script_file(void);
+extern void os_printchar(char c);
+extern L9BOOL os_input(char *ibuff, int size);
+extern char os_readchar(int millis);
+extern L9BOOL os_stoplist(void);
+extern void os_flush(void);
+extern L9BOOL os_save_file(L9BYTE *Ptr, int Bytes);
+extern L9BOOL os_load_file(L9BYTE *Ptr, int *Bytes, int Max);
+extern L9BOOL os_get_game_file(char *NewName, int Size);
+extern void os_set_filenumber(char *NewName, int Size, int n);
+extern void os_graphics(int mode);
+extern void os_cleargraphics(void);
+extern void os_setcolour(int colour, int index);
+extern void os_drawline(int x1, int y1, int x2, int y2, int colour1, int colour2);
+extern void os_fill(int x, int y, int colour1, int colour2);
+extern void os_show_bitmap(int pic, int x, int y);
+extern Common::SeekableReadStream *os_open_script_file(void);
/* routines provided by level9 interpreter */
-L9BOOL LoadGame(const char *filename, char *picname);
-L9BOOL RunGame(void);
-void StopGame(void);
-void RestoreGame(char *filename);
-void FreeMemory(void);
-void GetPictureSize(int *width, int *height);
-L9BOOL RunGraphics(void);
+extern L9BOOL LoadGame(const char *filename, char *picname);
+extern L9BOOL RunGame(void);
+extern void StopGame(void);
+extern void RestoreGame(char *filename);
+extern void FreeMemory(void);
+extern void GetPictureSize(int *width, int *height);
+extern L9BOOL RunGraphics(void);
/* bitmap routines provided by level9 interpreter */
BitmapType DetectBitmaps(char *dir);
diff --git a/engines/glk/level9/os_glk.cpp b/engines/glk/level9/os_glk.cpp
index 9005b6cba5..1b65ef1401 100644
--- a/engines/glk/level9/os_glk.cpp
+++ b/engines/glk/level9/os_glk.cpp
@@ -30,9 +30,6 @@ namespace Level9 {
#define BYTE_MAX 0xff
#define BITS_PER_CHAR 8
-/* File path delimiter, used to be #defined in v2 interpreter. */
-static const char GLN_FILE_DELIM = '/';
-
/*---------------------------------------------------------------------*/
/* Module variables, miscellaneous other stuff */
/*---------------------------------------------------------------------*/
@@ -43,39 +40,32 @@ static const glui32 GLN_PORT_VERSION = 0x00020201;
/*
* We use a maximum of three Glk windows, one for status, one for pictures,
* and one for everything else. The status and pictures windows may be
- * NULL, depending on user selections and the capabilities of the Glk
+ * nullptr, depending on user selections and the capabilities of the Glk
* library.
*/
-static winid_t gln_main_window = NULL,
- gln_status_window = NULL,
- gln_graphics_window = NULL;
+static winid_t gln_main_window, gln_status_window, gln_graphics_window;
/*
- * Transcript stream and input log. These are NULL if there is no current
+ * Transcript stream and input log. These are nullptr if there is no current
* collection of these strings.
*/
-static strid_t gln_transcript_stream = NULL,
- gln_inputlog_stream = NULL;
+static strid_t gln_transcript_stream, gln_inputlog_stream;
/* Input read log stream, for reading back an input log. */
-static strid_t gln_readlog_stream = NULL;
+static strid_t gln_readlog_stream;
/* Note about whether graphics is possible, or not. */
-static int gln_graphics_possible = TRUE;
+bool gln_graphics_possible;
/* Options that may be turned off by command line flags. */
-static int gln_graphics_enabled = TRUE,
- gln_intercept_enabled = TRUE,
- gln_prompt_enabled = TRUE,
- gln_loopcheck_enabled = TRUE,
- gln_abbreviations_enabled = TRUE,
- gln_commands_enabled = TRUE;
+bool gln_graphics_enabled, gln_intercept_enabled, gln_prompt_enabled;
+bool gln_loopcheck_enabled, gln_abbreviations_enabled, gln_commands_enabled;
/* Reason for stopping the game, used to detect restarts and ^C exits. */
enum StopReason {
STOP_NONE, STOP_FORCE, STOP_RESTART, STOP_EXIT
};
-static StopReason gln_stop_reason = STOP_NONE;
+static StopReason gln_stop_reason;
/* Level 9 standard input prompt string. */
static const char *const GLN_INPUT_PROMPT = "> ";
@@ -111,6 +101,23 @@ static int gln_confirm(const char *prompt);
/* Glk port utility functions */
/*---------------------------------------------------------------------*/
+void gln_initialize() {
+ gln_main_window = nullptr;
+ gln_status_window = nullptr;
+ gln_graphics_window = nullptr;
+ gln_transcript_stream = nullptr;
+ gln_inputlog_stream = nullptr;
+ gln_readlog_stream = nullptr;
+ gln_graphics_possible = TRUE;
+ gln_graphics_enabled = TRUE;
+ gln_intercept_enabled = TRUE;
+ gln_prompt_enabled = TRUE;
+ gln_loopcheck_enabled = TRUE;
+ gln_abbreviations_enabled = TRUE;
+ gln_commands_enabled = TRUE;
+ gln_stop_reason = STOP_NONE;
+}
+
/*
* gln_fatal()
*
@@ -128,7 +135,7 @@ static void gln_fatal(const char *string) {
}
/* Cancel all possible pending window input events. */
- g_vm->glk_cancel_line_event(gln_main_window, NULL);
+ g_vm->glk_cancel_line_event(gln_main_window, nullptr);
g_vm->glk_cancel_char_event(gln_main_window);
/* Print a message indicating the error. */
@@ -279,7 +286,7 @@ static gln_uint16 gln_get_buffer_crc(const void *void_buffer, size_t length, siz
* and may be re-requested when, say, the game changes, perhaps by moving to
* the next part of a multipart game.
*/
-static const char *gln_gameid_game_name = NULL;
+static const char *gln_gameid_game_name = nullptr;
/*
@@ -701,7 +708,7 @@ static const gln_game_table_t GLN_GAME_TABLE[] = {
{0x110f, 0x00, 0x4b57, "Champion of the Raj (French) 2/2 GD (ST)"},
- {0x0000, 0x00, 0x0000, NULL}
+ {0x0000, 0x00, 0x0000, nullptr}
};
@@ -1080,7 +1087,7 @@ static const gln_patch_table_t GLN_PATCH_TABLE[] = {
* gln_gameid_lookup_patch()
*
* Look up and return game table and patch table entries given a game's
- * length, checksum, and CRC. Returns the entry, or NULL if not found.
+ * length, checksum, and CRC. Returns the entry, or nullptr if not found.
*/
static gln_game_tableref_t gln_gameid_lookup_game(gln_uint16 length, gln_byte checksum,
gln_uint16 crc, int ignore_crc) {
@@ -1092,7 +1099,7 @@ static gln_game_tableref_t gln_gameid_lookup_game(gln_uint16 length, gln_byte ch
break;
}
- return game->length ? game : NULL;
+ return game->length ? game : nullptr;
}
static gln_patch_tableref_t gln_gameid_lookup_patch(gln_uint16 length, gln_byte checksum,
@@ -1105,7 +1112,7 @@ static gln_patch_tableref_t gln_gameid_lookup_patch(gln_uint16 length, gln_byte
break;
}
- return patch->length ? patch : NULL;
+ return patch->length ? patch : nullptr;
}
@@ -1113,7 +1120,7 @@ static gln_patch_tableref_t gln_gameid_lookup_patch(gln_uint16 length, gln_byte
* gln_gameid_identify_game()
*
* Identify a game from its data length, checksum, and CRC. Returns the
- * entry of the game in the game table, or NULL if not found.
+ * entry of the game in the game table, or nullptr if not found.
*
* This function uses startdata and FileSize from the core interpreter.
* These aren't advertised symbols, so be warned.
@@ -1127,7 +1134,7 @@ static gln_game_tableref_t gln_gameid_identify_game() {
/* If the data file appears too short for a header, give up now. */
if (FileSize < 30)
- return NULL;
+ return nullptr;
/*
* Find the version of the game, and the length of game data. This logic
@@ -1144,7 +1151,7 @@ static gln_game_tableref_t gln_gameid_identify_game() {
? startdata[28] | startdata[29] << BITS_PER_CHAR
: startdata[0] | startdata[1] << BITS_PER_CHAR;
if (length >= FileSize)
- return NULL;
+ return nullptr;
/* Calculate or retrieve the checksum, in a version specific way. */
if (is_version2) {
@@ -1184,7 +1191,7 @@ static gln_game_tableref_t gln_gameid_identify_game() {
/*
* gln_gameid_get_game_name()
*
- * Return the name of the game, or NULL if not identifiable.
+ * Return the name of the game, or nullptr if not identifiable.
*
* This function uses startdata from the core interpreter. This isn't an
* advertised symbol, so be warned.
@@ -1200,20 +1207,20 @@ static const char *gln_gameid_get_game_name() {
gln_game_tableref_t game;
/*
- * If the interpreter hasn't yet loaded a game, startdata is NULL
- * (uninitialized, global). In this case, we return NULL, allowing
+ * If the interpreter hasn't yet loaded a game, startdata is nullptr
+ * (uninitialized, global). In this case, we return nullptr, allowing
* for retries until a game is loaded.
*/
if (!startdata)
- return NULL;
+ return nullptr;
game = gln_gameid_identify_game();
gln_gameid_game_name = game ? game->name : "";
}
- /* Return the game's name, or NULL if it was unidentifiable. */
+ /* Return the game's name, or nullptr if it was unidentifiable. */
assert(gln_gameid_game_name);
- return strlen(gln_gameid_game_name) > 0 ? gln_gameid_game_name : NULL;
+ return strlen(gln_gameid_game_name) > 0 ? gln_gameid_game_name : nullptr;
}
@@ -1225,7 +1232,7 @@ static const char *gln_gameid_get_game_name() {
* change game file, for example os_set_filenumber().
*/
static void gln_gameid_game_name_reset() {
- gln_gameid_game_name = NULL;
+ gln_gameid_game_name = nullptr;
}
@@ -1307,12 +1314,12 @@ static const int GLN_GRAPHICS_BORDER = 1,
static const int GLN_GRAPHICS_UNUSED_PIXEL = 0xff;
/* Graphics file directory, and type of graphics found in it. */
-static char *gln_graphics_bitmap_directory = NULL;
+static char *gln_graphics_bitmap_directory = nullptr;
static BitmapType gln_graphics_bitmap_type = NO_BITMAPS;
/* The current picture id being displayed. */
enum { GLN_PALETTE_SIZE = 32 };
-static gln_byte *gln_graphics_bitmap = NULL;
+static gln_byte *gln_graphics_bitmap = nullptr;
static gln_uint16 gln_graphics_width = 0,
gln_graphics_height = 0;
static Colour gln_graphics_palette[GLN_PALETTE_SIZE]; /* = { 0, ... }; */
@@ -1343,8 +1350,8 @@ static GraphicsState gln_graphics_interpreter_state = GLN_GRAPHICS_OFF;
* of pixels, and the other tracking on-screen data. These are temporary
* graphics malloc'ed memory, and should be free'd on exit.
*/
-static gln_byte *gln_graphics_off_screen = NULL,
- *gln_graphics_on_screen = NULL;
+static gln_byte *gln_graphics_off_screen = nullptr,
+ *gln_graphics_on_screen = nullptr;
/*
* The number of colors used in the palette by the current picture. Because
@@ -1371,19 +1378,19 @@ static int gln_graphics_open() {
wintype_Graphics, 0);
}
- return gln_graphics_window != NULL;
+ return gln_graphics_window != nullptr;
}
/*
* gln_graphics_close()
*
- * If open, close the graphics window and set back to NULL.
+ * If open, close the graphics window and set back to nullptr.
*/
static void gln_graphics_close() {
if (gln_graphics_window) {
- g_vm->glk_window_close(gln_graphics_window, NULL);
- gln_graphics_window = NULL;
+ g_vm->glk_window_close(gln_graphics_window, nullptr);
+ gln_graphics_window = nullptr;
}
}
@@ -1424,7 +1431,7 @@ static void gln_graphics_stop() {
* Return TRUE if graphics are currently being displayed, FALSE otherwise.
*/
static int gln_graphics_are_displayed() {
- return gln_graphics_window != NULL;
+ return gln_graphics_window != nullptr;
}
@@ -2263,8 +2270,7 @@ static void gln_graphics_locate_bitmaps(const char *gamefile) {
BitmapType bitmap_type;
/* Find the start of the last element of the filename passed in. */
- basename = strrchr(gamefile, GLN_FILE_DELIM);
- basename = basename ? basename + 1 : gamefile;
+ basename = gamefile;
/* Take a copy of the directory part of the filename. */
dirname = (char *)gln_malloc(basename - gamefile + 1);
@@ -2438,7 +2444,7 @@ void os_show_bitmap(int picture, int x, int y) {
* FALSE if there is no picture available to display.
*/
static int gln_graphics_picture_is_available() {
- return gln_graphics_bitmap != NULL;
+ return gln_graphics_bitmap != nullptr;
}
@@ -2482,7 +2488,7 @@ static int gln_graphics_get_rendering_details(const char **bitmap_type,
if (gln_graphics_enabled && gln_graphics_are_displayed()) {
/*
* Convert the detected bitmap type into a string and return it.
- * A NULL bitmap string implies no bitmaps.
+ * A nullptr bitmap string implies no bitmaps.
*/
if (bitmap_type) {
const char *return_type;
@@ -2517,7 +2523,7 @@ static int gln_graphics_get_rendering_details(const char **bitmap_type,
break;
case NO_BITMAPS:
default:
- return_type = NULL;
+ return_type = nullptr;
break;
}
@@ -2562,13 +2568,13 @@ static int gln_graphics_interpreter_enabled() {
*/
static void gln_graphics_cleanup() {
free(gln_graphics_bitmap);
- gln_graphics_bitmap = NULL;
+ gln_graphics_bitmap = nullptr;
free(gln_graphics_off_screen);
- gln_graphics_off_screen = NULL;
+ gln_graphics_off_screen = nullptr;
free(gln_graphics_on_screen);
- gln_graphics_on_screen = NULL;
+ gln_graphics_on_screen = nullptr;
free(gln_graphics_bitmap_directory);
- gln_graphics_bitmap_directory = NULL;
+ gln_graphics_bitmap_directory = nullptr;
gln_graphics_bitmap_type = NO_BITMAPS;
gln_graphics_picture = -1;
@@ -2607,7 +2613,7 @@ struct gln_linegraphics_segment_t {
int dy; /* Segment y delta */
};
-static gln_linegraphics_segment_t *gln_linegraphics_fill_segments = NULL;
+static gln_linegraphics_segment_t *gln_linegraphics_fill_segments = nullptr;
static int gln_linegraphics_fill_segments_allocation = 0,
gln_linegraphics_fill_segments_length = 0;
@@ -3001,7 +3007,7 @@ static void gln_linegraphics_process() {
*/
static void gln_linegraphics_cleanup() {
free(gln_linegraphics_fill_segments);
- gln_linegraphics_fill_segments = NULL;
+ gln_linegraphics_fill_segments = nullptr;
gln_linegraphics_fill_segments_allocation = 0;
gln_linegraphics_fill_segments_length = 0;
@@ -3383,7 +3389,7 @@ static void gln_status_redraw() {
*/
parent = g_vm->glk_window_get_parent(gln_status_window);
g_vm->glk_window_set_arrangement(parent,
- winmethod_Above | winmethod_Fixed, 1, NULL);
+ winmethod_Above | winmethod_Fixed, 1, nullptr);
gln_status_update();
}
@@ -3406,7 +3412,7 @@ static int gln_help_requested = FALSE,
* more efficient for everyone if we buffer them, and output a complete
* string on a flush call.
*/
-static char *gln_output_buffer = NULL;
+static char *gln_output_buffer = nullptr;
static int gln_output_allocation = 0,
gln_output_length = 0;
@@ -3532,7 +3538,7 @@ static void gln_detect_game_prompt() {
*/
static void gln_output_delete() {
free(gln_output_buffer);
- gln_output_buffer = NULL;
+ gln_output_buffer = nullptr;
gln_output_allocation = gln_output_length = 0;
}
@@ -3727,10 +3733,10 @@ static void gln_command_script(const char *argument) {
return;
}
- g_vm->glk_stream_close(gln_transcript_stream, NULL);
- gln_transcript_stream = NULL;
+ g_vm->glk_stream_close(gln_transcript_stream, nullptr);
+ gln_transcript_stream = nullptr;
- g_vm->glk_window_set_echo_stream(gln_main_window, NULL);
+ g_vm->glk_window_set_echo_stream(gln_main_window, nullptr);
gln_normal_string("Glk transcript is now off.\n");
}
@@ -3792,8 +3798,8 @@ static void gln_command_inputlog(const char *argument) {
return;
}
- g_vm->glk_stream_close(gln_inputlog_stream, NULL);
- gln_inputlog_stream = NULL;
+ g_vm->glk_stream_close(gln_inputlog_stream, nullptr);
+ gln_inputlog_stream = nullptr;
gln_normal_string("Glk input log is now off.\n");
}
@@ -3860,8 +3866,8 @@ static void gln_command_readlog(const char *argument) {
return;
}
- g_vm->glk_stream_close(gln_readlog_stream, NULL);
- gln_readlog_stream = NULL;
+ g_vm->glk_stream_close(gln_readlog_stream, nullptr);
+ gln_readlog_stream = nullptr;
gln_normal_string("Glk read log is now off.\n");
}
@@ -4268,7 +4274,7 @@ static const gln_command_t GLN_COMMAND_TABLE[] = {
{"version", gln_command_version, FALSE},
{"commands", gln_command_commands, TRUE},
{"help", gln_command_help, TRUE},
- {NULL, NULL, FALSE}
+ {nullptr, nullptr, FALSE}
};
@@ -4323,7 +4329,7 @@ static void gln_command_help(const char *command) {
return;
}
- matched = NULL;
+ matched = nullptr;
for (entry = GLN_COMMAND_TABLE; entry->command; entry++) {
if (gln_strncasecmp(command, entry->command, strlen(command)) == 0) {
if (matched) {
@@ -4531,7 +4537,7 @@ static int gln_command_escape(const char *string) {
* the command passed in.
*/
matches = 0;
- matched = NULL;
+ matched = nullptr;
for (entry = GLN_COMMAND_TABLE; entry->command; entry++) {
if (gln_strncasecmp(command, entry->command, strlen(command)) == 0) {
matches++;
@@ -4696,7 +4702,7 @@ static const gln_abbreviation_t GLN_ABBREVIATIONS[] = {
{'k', "attack"}, {'l', "look"}, {'p', "open"},
{'q', "quit"}, {'r', "drop"}, {'t', "take"},
{'x', "examine"}, {'y', "yes"}, {'z', "wait"},
- {'\0', NULL}
+ {'\0', nullptr}
};
@@ -4720,7 +4726,7 @@ static void gln_expand_abbreviations(char *buffer, int size) {
/* Scan the abbreviations table for a match. */
abbreviation = g_vm->glk_char_to_lower((unsigned char) command[0]);
- expansion = NULL;
+ expansion = nullptr;
for (entry = GLN_ABBREVIATIONS; entry->expansion; entry++) {
if (entry->abbreviation == abbreviation) {
expansion = entry->expansion;
@@ -4828,8 +4834,8 @@ gln_bool os_input(char *buffer, int size) {
* We're at the end of the log stream. Close it, and then continue
* on to request a line from Glk.
*/
- g_vm->glk_stream_close(gln_readlog_stream, NULL);
- gln_readlog_stream = NULL;
+ g_vm->glk_stream_close(gln_readlog_stream, nullptr);
+ gln_readlog_stream = nullptr;
}
/*
@@ -5289,7 +5295,7 @@ gln_bool os_save_file(gln_byte *ptr, int bytes) {
/* Write game state. */
g_vm->glk_put_buffer_stream(stream, (const char *)ptr, bytes);
- g_vm->glk_stream_close(stream, NULL);
+ g_vm->glk_stream_close(stream, nullptr);
g_vm->glk_fileref_destroy(fileref);
gln_watchdog_tick();
@@ -5331,7 +5337,7 @@ gln_bool os_load_file(gln_byte *ptr, int *bytes, int max) {
/* Restore saved game data. */
*bytes = g_vm->glk_get_buffer_stream(stream, (char *)ptr, max);
- g_vm->glk_stream_close(stream, NULL);
+ g_vm->glk_stream_close(stream, nullptr);
g_vm->glk_fileref_destroy(fileref);
gln_watchdog_tick();
@@ -5372,9 +5378,7 @@ gln_bool os_get_game_file(char *newname, int size) {
Common::File f;
assert(newname);
- /* Find the last element of the filename passed in. */
- basename = strrchr(newname, GLN_FILE_DELIM);
- basename = basename ? basename + 1 : newname;
+ basename = newname;
/* Search for the last numeric character in the basename. */
digit = -1;
@@ -5453,9 +5457,7 @@ void os_set_filenumber(char *newname, int size, int file_number) {
return;
}
- /* Find the last element of the new filename. */
- basename = strrchr(newname, GLN_FILE_DELIM);
- basename = basename ? basename + 1 : newname;
+ basename = newname;
/* Search for the last numeric character in the basename. */
digit = -1;
@@ -5493,7 +5495,7 @@ void os_set_filenumber(char *newname, int size, int file_number) {
* own way of handling scripts, this function is a stub.
*/
Common::SeekableReadStream *os_open_script_file() {
- return NULL;
+ return nullptr;
}
@@ -5546,8 +5548,7 @@ static const int GLN_WATCHDOG_TIMEOUT = 5,
* The following values need to be passed between the startup_code and main
* functions.
*/
-static const char *gln_game_message = NULL; /* Error message. */
-
+static const char *gln_game_message = nullptr; /* Error message. */
/*
* gln_establish_picture_filename()
@@ -5557,7 +5558,7 @@ static const char *gln_game_message = NULL; /* Error message. */
* PICTURE.DAT or picture.dat in the same directory as X. If the input file
* already ends with a three-letter extension, it's stripped first.
*
- * The function returns NULL if a graphics file is not available. It's not
+ * The function returns nullptr if a graphics file is not available. It's not
* fatal for this to be the case. Filenames are malloc'ed, and need to be
* freed by the caller.
*
@@ -5565,7 +5566,7 @@ static const char *gln_game_message = NULL; /* Error message. */
* standard function, and access() isn't.
*/
static void gln_establish_picture_filename(const char *name, char **graphics) {
- char *base, *directory_end, *graphics_file;
+ char *base, *graphics_file;
Common::File f;
assert(name && graphics);
@@ -5623,7 +5624,7 @@ static void gln_establish_picture_filename(const char *name, char **graphics) {
/* No access to graphics file. */
if (!f.isOpen()) {
free(graphics_file);
- graphics_file = NULL;
+ graphics_file = nullptr;
}
f.close();
@@ -5635,11 +5636,6 @@ static void gln_establish_picture_filename(const char *name, char **graphics) {
return;
}
- /* Retry with base set to the game file directory part only. */
- directory_end = strrchr(base, GLN_FILE_DELIM);
- directory_end = directory_end ? directory_end + 1 : base;
- base[directory_end - base] = '\0';
-
/* Again, allocate space for the return graphics file. */
graphics_file = (char *)gln_malloc(strlen(base) + strlen("PICTURE.DAT") + 1);
@@ -5654,24 +5650,23 @@ static void gln_establish_picture_filename(const char *name, char **graphics) {
if (!f.open(graphics_file)) {
/*
* No access to this graphics file. In this case, free memory
- * and reset graphics file to NULL.
+ * and reset graphics file to nullptr.
*/
free(graphics_file);
- graphics_file = NULL;
+ graphics_file = nullptr;
}
}
f.close();
/*
- * Return whatever we found for the graphics file (NULL if none found),
+ * Return whatever we found for the graphics file (nullptr if none found),
* and free base.
*/
*graphics = graphics_file;
free(base);
}
-
/*
* gln_startup_code()
* gln_main()
@@ -5719,7 +5714,7 @@ int gln_startup_code(int argc, char *argv[]) {
}
void gln_main(const char *filename) {
- char *graphics_file = NULL;
+ char *graphics_file = nullptr;
int is_running;
/* Create the main Glk window, and set its stream as current. */
@@ -5780,7 +5775,7 @@ void gln_main(const char *filename) {
int errNum = 0;
if (!LoadGame(filename, graphics_file)) {
if (gln_status_window)
- g_vm->glk_window_close(gln_status_window, NULL);
+ g_vm->glk_window_close(gln_status_window, nullptr);
gln_header_string("Glk Level 9 Error\n\n");
gln_normal_string("Can't find, open, or load game file '");
gln_normal_string(filename);
@@ -5867,16 +5862,16 @@ void gln_main(const char *filename) {
/* Close any open transcript, input log, and/or read log. */
if (gln_transcript_stream) {
- g_vm->glk_stream_close(gln_transcript_stream, NULL);
- gln_transcript_stream = NULL;
+ g_vm->glk_stream_close(gln_transcript_stream, nullptr);
+ gln_transcript_stream = nullptr;
}
if (gln_inputlog_stream) {
- g_vm->glk_stream_close(gln_inputlog_stream, NULL);
- gln_inputlog_stream = NULL;
+ g_vm->glk_stream_close(gln_inputlog_stream, nullptr);
+ gln_inputlog_stream = nullptr;
}
if (gln_readlog_stream) {
- g_vm->glk_stream_close(gln_readlog_stream, NULL);
- gln_readlog_stream = NULL;
+ g_vm->glk_stream_close(gln_readlog_stream, nullptr);
+ gln_readlog_stream = nullptr;
}
/* Free any graphics file path. */
diff --git a/engines/glk/level9/os_glk.h b/engines/glk/level9/os_glk.h
new file mode 100644
index 0000000000..a10a640a56
--- /dev/null
+++ b/engines/glk/level9/os_glk.h
@@ -0,0 +1,39 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GLK_LEVEL9_OS_GLK
+#define GLK_LEVEL9_OS_GLK
+
+namespace Glk {
+namespace Level9 {
+
+extern bool gln_graphics_enabled;
+extern bool gln_graphics_possible;
+
+extern void gln_initialize();
+extern void gln_main(const char *filename);
+extern int gln_startup_code(int argc, char *argv[]);
+
+} // End of namespace Alan2
+} // End of namespace Glk
+
+#endif