From 7cacb7203fdfdd85885d5da01dde8bf2a1b97b66 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 20 Oct 2019 20:08:17 +0200 Subject: [PATCH] - refactored all file access in SW frontend to use the FileReader variant and added a few utilities to avoid opening handles. Because use of the handle API needs to be eliminated before a functioning resource management can be plugged in here. --- source/build/include/cache1d.h | 26 +++++++++++++++++++++++ source/build/include/common.h | 1 - source/build/src/common.cpp | 9 -------- source/sw/src/anim.cpp | 16 ++++++-------- source/sw/src/demo.cpp | 9 ++++---- source/sw/src/demo.h | 12 +++++------ source/sw/src/game.cpp | 38 ++++++++-------------------------- source/sw/src/mfile.h | 17 ++++++++------- 8 files changed, 60 insertions(+), 68 deletions(-) diff --git a/source/build/include/cache1d.h b/source/build/include/cache1d.h index 01f88a726..9c77ea13d 100644 --- a/source/build/include/cache1d.h +++ b/source/build/include/cache1d.h @@ -136,6 +136,7 @@ public: }; +// Wrappers for the handle based API to get rid of the direct calls without any actual changes to the implementation. inline FileReader kopenFileReader(const char* name, int where) { int handle = where == 0 ? kopen4loadfrommod(name, 0) : kopen4load(name, where); @@ -143,5 +144,30 @@ inline FileReader kopenFileReader(const char* name, int where) return FileReader(fri); } +inline bool testkopen(const char* name, int where) +{ + int handle = where == 0 ? kopen4loadfrommod(name, 0) : kopen4load(name, where); + if (handle != buildvfs_kfd_invalid) kclose(handle); + return handle != buildvfs_kfd_invalid; +} + +inline TArray kloadfile(const char* name, int where) +{ + auto fr = kopenFileReader(name, where); + return fr.isOpen() ? fr.Read() : TArray (); +} + +inline int32_t kfilesize(const char* name, int where) +{ + int handle = where == 0 ? kopen4loadfrommod(name, 0) : kopen4load(name, where); + if (handle != buildvfs_kfd_invalid) + { + auto fs = kfilelength(handle); + kclose(handle); + return fs; + } + return -1; +} + #endif // cache1d_h_ diff --git a/source/build/include/common.h b/source/build/include/common.h index a23712ed2..9756e8247 100644 --- a/source/build/include/common.h +++ b/source/build/include/common.h @@ -80,7 +80,6 @@ int32_t getatoken(scriptfile *sf, const tokenlist *tl, int32_t ntokens); int32_t G_CheckCmdSwitch(int32_t argc, char const * const * argv, const char *str); -int32_t testkopen(const char *filename, char searchfirst); // full-blown kopen4load int32_t check_file_exist(const char *fn); // findfrompath with pathsearchmode=1 / search in zips void fnlist_clearnames(fnlist_t *fnl); diff --git a/source/build/src/common.cpp b/source/build/src/common.cpp index 7eec0b298..dea345a9f 100644 --- a/source/build/src/common.cpp +++ b/source/build/src/common.cpp @@ -129,15 +129,6 @@ int32_t G_CheckCmdSwitch(int32_t argc, char const * const * argv, const char *st return 0; } -// returns: 1 if file could be opened, 0 else -int32_t testkopen(const char *filename, char searchfirst) -{ - buildvfs_kfd fd = kopen4load(filename, searchfirst); - if (fd != buildvfs_kfd_invalid) - kclose(fd); - return (fd != buildvfs_kfd_invalid); -} - // checks from path and in ZIPs, returns 1 if NOT found int32_t check_file_exist(const char *fn) { diff --git a/source/sw/src/anim.cpp b/source/sw/src/anim.cpp index b6ce4ec70..224292694 100644 --- a/source/sw/src/anim.cpp +++ b/source/sw/src/anim.cpp @@ -226,7 +226,6 @@ void AnimZilla(int frame, int numframes) unsigned char *LoadAnm(short anim_num) { - int handle; int length; unsigned char *animbuf, *palptr; int i,j,k; @@ -242,17 +241,16 @@ unsigned char *LoadAnm(short anim_num) if (anm_ptr[anim_num] == 0) { - handle = kopen4load(ANIMname[ANIMnum], 0); - if (handle == -1) + auto handle = kopenFileReader(ANIMname[ANIMnum], 0); + if (!handle.isOpen()) return NULL; - length = kfilelength(handle); + length = handle.GetLength(); buffer.Resize(length + sizeof(anim_t)); anm_ptr[anim_num] = (anim_t*)buffer.Data(); animbuf = (unsigned char *)((intptr_t)anm_ptr[anim_num] + sizeof(anim_t)); - kread(handle, animbuf, length); - kclose(handle); + handle.Read(animbuf, length); } else { @@ -289,10 +287,8 @@ playanm(short anim_num) return; // [JM] Temporary, needed to get the file's length for ANIM_LoadAnim. !CHECKME! - handle = kopen4load(ANIMname[ANIMnum], 0); - if (handle == -1) return; - length = kfilelength(handle); - kclose(handle); + length = kfilesize(ANIMname[ANIMnum], 0); + if (length == -1) return; DSPRINTF(ds,"PlayAnm - Palette Stuff"); MONO_PRINT(ds); diff --git a/source/sw/src/demo.cpp b/source/sw/src/demo.cpp index 94a4b7107..c50924b0c 100644 --- a/source/sw/src/demo.cpp +++ b/source/sw/src/demo.cpp @@ -46,7 +46,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms BEGIN_SW_NS -DFILE DemoFileIn = DF_ERR; +DFILE DemoFileIn; FILE *DemoFileOut; SWBOOL DemoPlaying = FALSE; SWBOOL DemoRecording = FALSE; @@ -228,7 +228,7 @@ DemoReadHeader(void) DemoFileIn = DOPEN_READ(DemoFileName); } - if (DemoFileIn == DF_ERR) + if (DF_ERR(DemoFileIn)) { TerminateGame(); printf("File %s is not a valid demo file.",DemoFileName); @@ -360,11 +360,10 @@ DemoTerm(void) if (DemoPlaying) { - if (DemoFileIn == DF_ERR) - return; + if (DF_ERR(DemoFileIn)) + return; DCLOSE(DemoFileIn); - DemoFileIn = DF_ERR; } if (DemoSyncTest||DemoSyncRecord) diff --git a/source/sw/src/demo.h b/source/sw/src/demo.h index 8c0b462a7..0be471f6a 100644 --- a/source/sw/src/demo.h +++ b/source/sw/src/demo.h @@ -53,11 +53,11 @@ extern int DemoRecCnt; // Can only record 1-player game // Demo File - reading from group #if DEMO_FILE_TYPE == DEMO_FILE_GROUP -typedef long DFILE; -#define DREAD(ptr, size, num, handle) kread((handle),(ptr),(size)*(num)) -#define DOPEN_READ(name) kopen4load(name,0) -#define DCLOSE(handle) kclose(handle) -#define DF_ERR -1 +typedef FileReader DFILE; +#define DREAD(ptr, size, num, handle) (handle).Read((ptr),(size)*(num)) +#define DOPEN_READ(name) kopenFileReader(name,0) +#define DCLOSE(handle) ((handle).Close()) +#define DF_ERR(f) (!(f).isOpen()) #else typedef FILE *DFILE; #define DREAD(ptr, size, num,handle) fread((ptr),(size),(num),(handle)) @@ -65,7 +65,7 @@ typedef FILE *DFILE; #define DOPEN_WRITE(name) fopen(name,"wb") #define DOPEN_READ(name) fopen(name,"rb") #define DCLOSE(handle) fclose(handle) -#define DF_ERR NULL +#define DF_ERR(f) ((f) == NULL) #endif void DemoTerm(void); diff --git a/source/sw/src/game.cpp b/source/sw/src/game.cpp index 8df7b94db..b529b34cd 100644 --- a/source/sw/src/game.cpp +++ b/source/sw/src/game.cpp @@ -1721,7 +1721,6 @@ LogoLevel(void) char called; int fin; unsigned char backup_pal[256*3]; - unsigned char pal[PAL_SIZE]; char tempbuf[256]; char *palook_bak = palookup[0]; UserInput uinfo = { FALSE, FALSE, dir_None }; @@ -1754,12 +1753,10 @@ LogoLevel(void) // PreCache Anim LoadAnm(0); - if ((fin = kopen4load("3drealms.pal", 0)) != -1) + auto pal = kloadfile("3drealms.pal", 0); + if (pal.Size() >= 768) { - kread(fin, pal, PAL_SIZE); - kclose(fin); - - paletteSetColorTable(1, pal); + paletteSetColorTable(1, pal.Data()); videoSetPalette(gs.Brightness, 1, 2); } DSPRINTF(ds,"Just read in 3drealms.pal..."); @@ -1951,7 +1948,7 @@ TenScreen(void) GetPaletteFromVESA(pal); memcpy(backup_pal, pal, PAL_SIZE); - if ((fin = kopen4load("ten.pal", 0)) != -1) + if ((fin = k open4load("ten.pal", 0)) != -1) { kread(fin, pal, PAL_SIZE); kclose(fin); @@ -2012,7 +2009,7 @@ TitleLevel(void) videoClearViewableArea(0L); videoNextPage(); -// if ((fin = kopen4load("title.pal", 0)) != -1) +// if ((fin = k open4load("title.pal", 0)) != -1) // { // kread(fin, pal, PAL_SIZE); // kclose(fin); @@ -3216,11 +3213,10 @@ void DosScreen(void) #define DOS_SCREEN_SIZE (4000-(80*2)) #define DOS_SCREEN_PTR ((void *)(0xB8000)) - int fin; int i; char buffer[DOS_SCREEN_SIZE]; - fin = kopen4load(DOS_SCREEN_NAME,0); + fin = k open4load(DOS_SCREEN_NAME,0); if (fin == -1) return; @@ -3370,19 +3366,15 @@ int DetectShareware(void) int h; - h = kopen4load(DOS_SCREEN_NAME_SW,1); - if (h >= 0) + if (testkopen(DOS_SCREEN_NAME_SW, 1)) { isShareware = TRUE; - kclose(h); return 0; } - h = kopen4load(DOS_SCREEN_NAME_REG,1); - if (h >= 0) + if (testkopen(DOS_SCREEN_NAME_REG, 1)) { isShareware = FALSE; - kclose(h); return 0; } @@ -3469,15 +3461,6 @@ int32_t app_main(int32_t argc, char const * const * argv) } } -#ifdef RENDERTYPEWIN - if (win_checkinstance()) - { - if (!wm_ynbox("Shadow Warrior","Another Build game is currently running. " - "Do you wish to continue starting this copy?")) - return 0; - } -#endif - #if defined(PREFIX) { const char *prefixdir = PREFIX; @@ -4057,7 +4040,7 @@ int32_t app_main(int32_t argc, char const * const * argv) if (strchr(UserMapName, '.') == 0) strcat(UserMapName, ".map"); - if ((fil = kopen4load(UserMapName,0)) == -1) + if (!testkopen(UserMapName,0)) { #ifdef RENDERTYPEWIN char msg[256]; @@ -4066,11 +4049,8 @@ int32_t app_main(int32_t argc, char const * const * argv) #else printf("ERROR: Could not find user map %s!\n\n",UserMapName); #endif - kclose(fil); swexit(0); } - else - kclose(fil); } else if (Bstrncasecmp(arg, "g", 1) == 0 && !SW_SHAREWARE) diff --git a/source/sw/src/mfile.h b/source/sw/src/mfile.h index e86f92e2e..4702e170c 100644 --- a/source/sw/src/mfile.h +++ b/source/sw/src/mfile.h @@ -29,15 +29,16 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms BEGIN_SW_NS -typedef BFILE* MFILE_WRITE; -typedef int32_t MFILE_READ; +typedef FILE* MFILE_WRITE; +typedef FILE* MFILE_READ; -#define MREAD(ptr, size, num,handle) kread((handle),(ptr), (size) * (num)) +// This needs some real fixing... +#define MREAD(ptr, size, num,handle) fread((ptr),(size),(num),(handle)) #define MWRITE(ptr, size, num,handle) fwrite((ptr),(size),(num),(handle)) #define MOPEN_WRITE(name) fopen(name,"wb") -#define MOPEN_READ(name) kopen4load(name,0) -#define MCLOSE_WRITE(handle) Bfclose(handle) -#define MCLOSE_READ(handle) kclose(handle) -#define MOPEN_WRITE_ERR 0 -#define MOPEN_READ_ERR -1 +#define MOPEN_READ(name) fopen(name,"rb") +#define MCLOSE_WRITE(handle) fclose(handle) +#define MCLOSE_READ(handle) fclose(handle) +#define MOPEN_WRITE_ERR nullptr +#define MOPEN_READ_ERR nullptr END_SW_NS