Try to make use of win32/posix LFS for larger pk3s. Use a couple of other unsigned types for larger bsps too, now that we're supposedly able to exceed the 2gb limit on file sizes.

This commit is contained in:
Shpoike 2021-07-10 20:13:56 +01:00
parent 7bc708c607
commit 3ac910c32d
16 changed files with 69 additions and 55 deletions

View file

@ -103,6 +103,8 @@ endif
ifeq ($(USE_SDL2),1) ifeq ($(USE_SDL2),1)
CFLAGS += -DUSE_SDL2 CFLAGS += -DUSE_SDL2
endif endif
#make use of LFS on 32bit even on systems.
CFLAGS += -D_FILE_OFFSET_BITS=64
ifeq ($(USE_SDL2),1) ifeq ($(USE_SDL2),1)
SDL_CONFIG ?= sdl2-config SDL_CONFIG ?= sdl2-config

View file

@ -70,7 +70,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
typedef struct typedef struct
{ {
int fileofs, filelen; unsigned int fileofs, filelen;
} lump_t; } lump_t;
#define LUMP_ENTITIES 0 #define LUMP_ENTITIES 0

View file

@ -1896,7 +1896,7 @@ QUAKE FILESYSTEM
============================================================================= =============================================================================
*/ */
int com_filesize; qofs_t com_filesize;
// //
@ -1905,14 +1905,14 @@ int com_filesize;
typedef struct typedef struct
{ {
char name[56]; char name[56];
int filepos, filelen; unsigned int filepos, filelen;
} dpackfile_t; } dpackfile_t;
typedef struct typedef struct
{ {
char id[4]; char id[4];
int dirofs; unsigned int dirofs;
int dirlen; unsigned int dirlen;
} dpackheader_t; } dpackheader_t;
#define MAX_FILES_IN_PACK 4096 #define MAX_FILES_IN_PACK 4096

View file

@ -222,11 +222,24 @@ char *va (const char *format, ...) FUNC_PRINTF(1,2);
//============================================================================ //============================================================================
// QUAKEFS // QUAKEFS
#ifdef _WIN32
#define qofs_t __int64 //LLP64 sucks and needs clumsy workarounds.
#define fseek _fseeki64
#define ftell _ftelli64
#elif _POSIX_C_SOURCE >= 200112L
#define qofs_t off_t //posix has its own LFS support for 32bit systems.
#define fseek fseeko
#define ftell ftello
#else
#define qofs_t long //LP64 just makes more sense. everything just works.
#endif
#define qofs_Make(low,high) ((unsigned int)(low) | ((qofs_t)(high)<<32))
typedef struct typedef struct
{ {
char name[MAX_QPATH]; char name[MAX_QPATH];
int filepos, filelen; qofs_t filepos, filelen;
int deflatedsize; qofs_t deflatedsize;
} packfile_t; } packfile_t;
typedef struct pack_s typedef struct pack_s
@ -252,7 +265,7 @@ typedef struct searchpath_s
extern searchpath_t *com_searchpaths; extern searchpath_t *com_searchpaths;
extern searchpath_t *com_base_searchpaths; extern searchpath_t *com_base_searchpaths;
extern int com_filesize; extern qofs_t com_filesize;
struct cache_user_s; struct cache_user_s;
extern char com_basedir[MAX_OSPATH]; extern char com_basedir[MAX_OSPATH];
@ -264,7 +277,7 @@ const char *COM_GetGameNames(qboolean full);
qboolean COM_GameDirMatches(const char *tdirs); qboolean COM_GameDirMatches(const char *tdirs);
pack_t *FSZIP_LoadArchive (const char *packfile); pack_t *FSZIP_LoadArchive (const char *packfile);
FILE *FSZIP_Deflate(FILE *src, int srcsize, int outsize); FILE *FSZIP_Deflate(FILE *src, qofs_t srcsize, qofs_t outsize);
void COM_WriteFile (const char *filename, const void *data, int len); void COM_WriteFile (const char *filename, const void *data, int len);
int COM_OpenFile (const char *filename, int *handle, unsigned int *path_id); int COM_OpenFile (const char *filename, int *handle, unsigned int *path_id);

View file

@ -82,7 +82,7 @@ unsigned short CRC_Value(unsigned short crcvalue)
} }
//johnfitz -- texture crc //johnfitz -- texture crc
unsigned short CRC_Block (const byte *start, int count) unsigned short CRC_Block (const byte *start, size_t count)
{ {
unsigned short crc; unsigned short crc;

View file

@ -27,11 +27,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
void CRC_Init(unsigned short *crcvalue); void CRC_Init(unsigned short *crcvalue);
void CRC_ProcessByte(unsigned short *crcvalue, byte data); void CRC_ProcessByte(unsigned short *crcvalue, byte data);
unsigned short CRC_Value(unsigned short crcvalue); unsigned short CRC_Value(unsigned short crcvalue);
unsigned short CRC_Block (const byte *start, int count); //johnfitz -- texture crc unsigned short CRC_Block (const byte *start, size_t count); //johnfitz -- texture crc
//additional hash functions... //additional hash functions...
unsigned Com_BlockChecksum (void *buffer, int length); unsigned Com_BlockChecksum (void *buffer, size_t length);
void Com_BlockFullChecksum (void *buffer, int len, unsigned char *outbuf); void Com_BlockFullChecksum (void *buffer, size_t len, unsigned char *outbuf);
#endif /* _QUAKE_CRC_H */ #endif /* _QUAKE_CRC_H */

View file

@ -24,9 +24,6 @@
//infozip utf-8 name override. //infozip utf-8 name override.
//other 'extra' fields. //other 'extra' fields.
#define qofs_t long long
#define qofs_Make(low,high) ((unsigned int)(low) | ((qofs_t)(high)<<32))
struct zipinfo struct zipinfo
{ {
unsigned int thisdisk; //this disk number unsigned int thisdisk; //this disk number
@ -747,7 +744,7 @@ pack_t *FSZIP_LoadArchive (const char *packfile)
return pack; return pack;
} }
FILE *FSZIP_Deflate(FILE *src, int srcsize, int outsize) FILE *FSZIP_Deflate(FILE *src, qofs_t srcsize, qofs_t outsize)
{ {
#ifdef USE_ZLIB #ifdef USE_ZLIB
byte inbuffer[65536]; byte inbuffer[65536];

View file

@ -974,7 +974,7 @@ void Mod_LoadLighting (lump_t *l)
return; return;
} }
Hunk_FreeToLowMark(mark); Hunk_FreeToLowMark(mark);
Con_Printf("Outdated .lit file (%s should be %u bytes, not %u)\n", litfilename, 8+l->filelen*3, com_filesize); Con_Printf("Outdated .lit file (%s should be %u bytes, not %u)\n", litfilename, 8+l->filelen*3, (unsigned)com_filesize);
} }
else else
{ {

View file

@ -53,9 +53,9 @@ struct mdfour {
}; };
static void mdfour_begin(struct mdfour *md); // old: MD4Init static void mdfour_begin(struct mdfour *md); // old: MD4Init
static void mdfour_update(struct mdfour *md, unsigned char *in, int n); //old: MD4Update static void mdfour_update(struct mdfour *md, unsigned char *in, size_t n); //old: MD4Update
static void mdfour_result(struct mdfour *md, unsigned char *out); // old: MD4Final static void mdfour_result(struct mdfour *md, unsigned char *out); // old: MD4Final
static void mdfour(unsigned char *out, unsigned char *in, int n); static void mdfour(unsigned char *out, unsigned char *in, size_t n);
#endif // _MDFOUR_H #endif // _MDFOUR_H
@ -160,7 +160,7 @@ static void mdfour_begin(struct mdfour *md)
} }
static void mdfour_tail(struct mdfour *m, unsigned char *in, int n) static void mdfour_tail(struct mdfour *m, unsigned char *in, size_t n)
{ {
unsigned char buf[128]; unsigned char buf[128];
uint32 M[16]; uint32 M[16];
@ -190,7 +190,7 @@ static void mdfour_tail(struct mdfour *m, unsigned char *in, int n)
} }
} }
static void mdfour_update(struct mdfour *m, unsigned char *in, int n) static void mdfour_update(struct mdfour *m, unsigned char *in, size_t n)
{ {
uint32 M[16]; uint32 M[16];
@ -218,7 +218,7 @@ static void mdfour_result(struct mdfour *m, unsigned char *out)
} }
static void mdfour(unsigned char *out, unsigned char *in, int n) static void mdfour(unsigned char *out, unsigned char *in, size_t n)
{ {
struct mdfour md; struct mdfour md;
mdfour_begin(&md); mdfour_begin(&md);
@ -234,7 +234,7 @@ static void mdfour(unsigned char *out, unsigned char *in, int n)
// Author: Jeff Teunissen <d2deek@pmail.net> // Author: Jeff Teunissen <d2deek@pmail.net>
// Date: 01 Jan 2000 // Date: 01 Jan 2000
unsigned Com_BlockChecksum (void *buffer, int length) unsigned Com_BlockChecksum (void *buffer, size_t length)
{ {
int digest[4]; int digest[4];
unsigned val; unsigned val;
@ -246,7 +246,7 @@ unsigned Com_BlockChecksum (void *buffer, int length)
return val; return val;
} }
void Com_BlockFullChecksum (void *buffer, int len, unsigned char *outbuf) void Com_BlockFullChecksum (void *buffer, size_t len, unsigned char *outbuf)
{ {
mdfour ( outbuf, (unsigned char *) buffer, len ); mdfour ( outbuf, (unsigned char *) buffer, len );
} }

View file

@ -1300,7 +1300,7 @@ qboolean PR_LoadProgs (const char *filename, qboolean fatal, unsigned int needcr
return false; return false;
} }
} }
Con_DPrintf ("%s occupies %iK.\n", filename, com_filesize/1024); Con_DPrintf ("%s occupies %uK.\n", filename, (unsigned)(com_filesize/1024u));
qcvm->functions = (dfunction_t *)((byte *)qcvm->progs + qcvm->progs->ofs_functions); qcvm->functions = (dfunction_t *)((byte *)qcvm->progs + qcvm->progs->ofs_functions);
qcvm->strings = (char *)qcvm->progs + qcvm->progs->ofs_strings; qcvm->strings = (char *)qcvm->progs + qcvm->progs->ofs_strings;

View file

@ -3478,7 +3478,7 @@ void SV_SpawnServer (const char *server)
if (csprogs) if (csprogs)
{ {
Info_SetKey(svs.serverinfo, sizeof(svs.serverinfo), "*csprogs", va("%#x", Com_BlockChecksum(csprogs, com_filesize))); Info_SetKey(svs.serverinfo, sizeof(svs.serverinfo), "*csprogs", va("%#x", Com_BlockChecksum(csprogs, com_filesize)));
Info_SetKey(svs.serverinfo, sizeof(svs.serverinfo), "*csprogssize", va("%#x", com_filesize)); Info_SetKey(svs.serverinfo, sizeof(svs.serverinfo), "*csprogssize", va("%#x", (unsigned)com_filesize));
free(csprogs); free(csprogs);
} }
else else

View file

@ -32,12 +32,12 @@ void Sys_Init (void);
// returns the file size or -1 if file is not present. // returns the file size or -1 if file is not present.
// the file should be in BINARY mode for stupid OSs that care // the file should be in BINARY mode for stupid OSs that care
int Sys_FileOpenRead (const char *path, int *hndl); qofs_t Sys_FileOpenRead (const char *path, int *hndl);
int Sys_FileOpenWrite (const char *path); int Sys_FileOpenWrite (const char *path);
int Sys_FileOpenStdio (FILE *file); int Sys_FileOpenStdio (FILE *file);
void Sys_FileClose (int handle); void Sys_FileClose (int handle);
void Sys_FileSeek (int handle, int position); void Sys_FileSeek (int handle, qofs_t position);
int Sys_FileRead (int handle, void *dest, int count); int Sys_FileRead (int handle, void *dest, int count);
int Sys_FileWrite (int handle,const void *data, int count); int Sys_FileWrite (int handle,const void *data, int count);
int Sys_FileTime (const char *path); int Sys_FileTime (const char *path);

View file

@ -72,7 +72,7 @@ static int findhandle (void)
return i; return i;
} }
long Sys_filelength (FILE *f) qofs_t Sys_filelength (FILE *f)
{ {
long pos, end; long pos, end;
@ -84,10 +84,11 @@ long Sys_filelength (FILE *f)
return end; return end;
} }
int Sys_FileOpenRead (const char *path, int *hndl) qofs_t Sys_FileOpenRead (const char *path, int *hndl)
{ {
FILE *f; FILE *f;
int i, retval; int i;
qofs_t retval;
i = findhandle (); i = findhandle ();
f = fopen(path, "rb"); f = fopen(path, "rb");
@ -136,7 +137,7 @@ void Sys_FileClose (int handle)
sys_handles[handle] = NULL; sys_handles[handle] = NULL;
} }
void Sys_FileSeek (int handle, int position) void Sys_FileSeek (int handle, qofs_t position)
{ {
fseek (sys_handles[handle], position, SEEK_SET); fseek (sys_handles[handle], position, SEEK_SET);
} }

View file

@ -71,7 +71,7 @@ static int findhandle (void)
return i; return i;
} }
long Sys_filelength (FILE *f) qofs_t Sys_filelength (FILE *f)
{ {
long pos, end; long pos, end;
@ -83,10 +83,11 @@ long Sys_filelength (FILE *f)
return end; return end;
} }
int Sys_FileOpenRead (const char *path, int *hndl) qofs_t Sys_FileOpenRead (const char *path, int *hndl)
{ {
FILE *f; FILE *f;
int i, retval; int i;
qofs_t retval;
i = findhandle (); i = findhandle ();
f = fopen(path, "rb"); f = fopen(path, "rb");
@ -135,7 +136,7 @@ void Sys_FileClose (int handle)
sys_handles[handle] = NULL; sys_handles[handle] = NULL;
} }
void Sys_FileSeek (int handle, int position) void Sys_FileSeek (int handle, qofs_t position)
{ {
fseek (sys_handles[handle], position, SEEK_SET); fseek (sys_handles[handle], position, SEEK_SET);
} }

View file

@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "quakedef.h" #include "quakedef.h"
int wad_numlumps; unsigned int wad_numlumps;
lumpinfo_t *wad_lumps; lumpinfo_t *wad_lumps;
byte *wad_base = NULL; byte *wad_base = NULL;
@ -116,13 +116,13 @@ void W_LoadWadFile (void) //johnfitz -- filename is now hard-coded for honesty
{ {
if (lump_p->filepos > com_filesize || lump_p->size < 0) if (lump_p->filepos > com_filesize || lump_p->size < 0)
{ {
Con_Printf ("Wad file %s lump \"%.16s\" begins %u bytes beyond end of wad\n",filename, lump_p->name, lump_p->filepos - com_filesize); Con_Printf ("Wad file %s lump \"%.16s\" begins %u bytes beyond end of wad\n",filename, lump_p->name, (unsigned)(lump_p->filepos - com_filesize));
lump_p->filepos = 0; lump_p->filepos = 0;
lump_p->size = q_max(0, lump_p->size-lump_p->filepos); lump_p->size = q_max(0, lump_p->size-lump_p->filepos);
} }
else else
{ {
Con_Printf ("Wad file %s lump \"%.16s\" extends %u bytes beyond end of wad (lump size: %u)\n",filename, lump_p->name, (lump_p->filepos + lump_p->size) - com_filesize, lump_p->size); Con_Printf ("Wad file %s lump \"%.16s\" extends %u bytes beyond end of wad (lump size: %u)\n",filename, lump_p->name, (unsigned)((lump_p->filepos + lump_p->size) - com_filesize), lump_p->size);
lump_p->size = q_max(0, lump_p->size-lump_p->filepos); lump_p->size = q_max(0, lump_p->size-lump_p->filepos);
} }
} }

View file

@ -44,31 +44,31 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
typedef struct typedef struct
{ {
int width, height; unsigned int width, height;
byte data[4]; // variably sized byte data[4]; // variably sized
} qpic_t; } qpic_t;
typedef struct typedef struct
{ {
char identification[4]; // should be WAD2 or 2DAW char identification[4]; // should be WAD2 or 2DAW
int numlumps; unsigned int numlumps;
int infotableofs; unsigned int infotableofs;
} wadinfo_t; } wadinfo_t;
typedef struct typedef struct
{ {
int filepos; unsigned int filepos;
int disksize; unsigned int disksize;
int size; // uncompressed unsigned int size; // uncompressed
char type; char type;
char compression; char compression;
char pad1, pad2; char pad1, pad2;
char name[16]; // must be null terminated char name[16]; // must be null terminated
} lumpinfo_t; } lumpinfo_t;
extern int wad_numlumps; extern unsigned int wad_numlumps;
extern lumpinfo_t *wad_lumps; extern lumpinfo_t *wad_lumps;
extern byte *wad_base; extern byte *wad_base;
void W_LoadWadFile (void); //johnfitz -- filename is now hard-coded for honesty void W_LoadWadFile (void); //johnfitz -- filename is now hard-coded for honesty
void *W_GetLumpName (const char *name, lumpinfo_t **out_info); void *W_GetLumpName (const char *name, lumpinfo_t **out_info);