210 lines
6.0 KiB
C
210 lines
6.0 KiB
C
|
#include "quakedef.h"
|
||
|
|
||
|
|
||
|
#if 0 //Tei from QURE
|
||
|
#include "pk3.h"
|
||
|
#include "pak.h"
|
||
|
extern FILE *sys_handles[];
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct packfile_t;
|
||
|
typedef struct pack_s pack_t;
|
||
|
|
||
|
pack_t *COM_IsPack(FILE *file, int handle)
|
||
|
{
|
||
|
searchpath_t *search;
|
||
|
// int i;
|
||
|
|
||
|
if(handle)
|
||
|
{
|
||
|
if(file)
|
||
|
Sys_Error ("COM_FindFile: both handle and file set");
|
||
|
else
|
||
|
file = sys_handles[handle];
|
||
|
}
|
||
|
|
||
|
if(!file)
|
||
|
Sys_Error ("COM_FindFile: unknown file or neither handle nor file set");
|
||
|
for (search = com_searchpaths; search; search = search->next)
|
||
|
if (search->pack)
|
||
|
if(sys_handles[search->pack->handle] == file)
|
||
|
return search->pack;
|
||
|
/*
|
||
|
else
|
||
|
for(i = 0; i < numpk3files; i++)
|
||
|
if(pk3files[i] == file)
|
||
|
return true;
|
||
|
*/
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
size_t PAK_FReadShrunk(void *buffer, size_t size, size_t count, FILE *f)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
size_t PAK_FReadDeflated(void *buffer, size_t size, size_t count, FILE *f)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
size_t PAK_FReadImploded(void *buffer, size_t size, size_t count, FILE *f)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
size_t PAK_FReadReduced(void *buffer, size_t size, size_t count, FILE *f)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
size_t PAK_FRead(void *buffer, size_t size, size_t count, FILE *f)
|
||
|
{
|
||
|
pack_t *pak;
|
||
|
pak = COM_IsPack(f, 0);
|
||
|
if(pak)
|
||
|
{
|
||
|
Sys_Error("pak %s (type %i) found", pak->filename, pak->compression);
|
||
|
Sys_Error("a : %i %i %i %i", getc(f), getc(f), getc(f), getc(f));
|
||
|
Sys_Error("b : %i %i %i %i", getc(f), getc(f), getc(f), getc(f));
|
||
|
Sys_Error("c : %i %i %i %i", getc(f), getc(f), getc(f), getc(f));
|
||
|
Sys_Error("d : %i %i %i %i", getc(f), getc(f), getc(f), getc(f));
|
||
|
}
|
||
|
|
||
|
if(!pak || pak->compression == PAK_STORED)
|
||
|
return fread(buffer, size, count, f);
|
||
|
|
||
|
switch (pak->compression)
|
||
|
{
|
||
|
case PAK_STORED: // (uncompressed) stored file
|
||
|
return fread(buffer, size, count, f);
|
||
|
break;
|
||
|
|
||
|
case PAK_SHRUNK: // LZW shrunk file
|
||
|
return PAK_FReadShrunk(buffer, size, count, f);
|
||
|
|
||
|
case PAK_REDUCED1: // reduced file #1
|
||
|
case PAK_REDUCED2: // reduced file #2
|
||
|
case PAK_REDUCED3: // reduced file #3
|
||
|
case PAK_REDUCED4: // reduced file #4
|
||
|
return PAK_FReadReduced(buffer, size, count, f);
|
||
|
|
||
|
case PAK_IMPLODED: // imploded file
|
||
|
return PAK_FReadImploded(buffer, size, count, f);
|
||
|
|
||
|
case PAK_DEFLATED: // deflated file
|
||
|
return PAK_FReadDeflated(buffer, size, count, f);
|
||
|
|
||
|
case PAK_TOKENIZED: // tokenized file
|
||
|
default:
|
||
|
return 0; // ..and return to caller
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int PAK_FSeek(FILE *f, long pos, int seekfunc)
|
||
|
{
|
||
|
// Sys_Error("Trying to seek to %i");
|
||
|
return fseek(f, pos, seekfunc);
|
||
|
// return 0;
|
||
|
}
|
||
|
/*
|
||
|
=================
|
||
|
COM_LoadZipFile
|
||
|
|
||
|
Takes an explicit (not game tree related) path to a zip file.
|
||
|
|
||
|
Loads the header and directory, adding the files at the beginning
|
||
|
of the list so they override previous pack files.
|
||
|
|
||
|
Only unpacked zip's are supported because of the way PAK's are handled.
|
||
|
=================
|
||
|
*/
|
||
|
#define LongBytes(a) *(int *)a
|
||
|
#define ShortBytes(a) *(short *)a
|
||
|
|
||
|
pack_t *COM_LoadZipFile (char *packfile)
|
||
|
{
|
||
|
zipheader_t header;
|
||
|
int packhandle, packsize;
|
||
|
int pos, minpos, i = 0, size = 0;//, ofs_headers;
|
||
|
packfile_t *newfiles;
|
||
|
int numpackfiles = 0;
|
||
|
pack_t *pack;
|
||
|
zipfileheader_t *info;
|
||
|
zipenddirheader_t enddirheader;
|
||
|
// unsigned short crc;
|
||
|
|
||
|
#define BUFFERREADSIZE 8 //How much bytes are read each pass while finding the ZIPENDDIRHEADER.
|
||
|
byte buffer[BUFFERREADSIZE+3];
|
||
|
buffer[BUFFERREADSIZE] = buffer[BUFFERREADSIZE+1] = buffer[BUFFERREADSIZE+2] = 0;
|
||
|
|
||
|
if ((packsize = Sys_FileOpenRead (packfile, &packhandle)) == -1)
|
||
|
return NULL;
|
||
|
|
||
|
if(Sys_FileRead(packhandle, &header, sizeof(header))!=sizeof(header))
|
||
|
Sys_Error("COM_LoadZipFile: read error in %s", packfile);
|
||
|
|
||
|
minpos = packsize - 1000; //Don't pass this point trying to find the ZIPENDDIRHEADER.
|
||
|
for(pos = packsize - 22/* - BUFFERREADSIZE + 4*/; ; pos -= BUFFERREADSIZE) //Start so that the buffer reaches the last place the enddirheader could be and progress backwards.
|
||
|
{
|
||
|
Sys_FileSeek (packhandle, pos);
|
||
|
if(Sys_FileRead(packhandle, buffer, BUFFERREADSIZE) != BUFFERREADSIZE)
|
||
|
Sys_Error("COM_LoadZipFile: read error in %s", packfile);
|
||
|
|
||
|
for(i = 0; i < BUFFERREADSIZE-3; i++)
|
||
|
if((*(int *)&buffer[i]) == ZIPENDDIRHEADER)
|
||
|
{
|
||
|
pos += i;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(i < BUFFERREADSIZE-3)
|
||
|
break;
|
||
|
|
||
|
if(pos < minpos)
|
||
|
Sys_Error("COM_LoadZipFile: no zip tree found.");
|
||
|
|
||
|
buffer[BUFFERREADSIZE] = buffer[0];
|
||
|
buffer[BUFFERREADSIZE+1] = buffer[1];
|
||
|
buffer[BUFFERREADSIZE+2] = buffer[2];
|
||
|
}
|
||
|
|
||
|
Sys_FileSeek (packhandle, pos);
|
||
|
if(Sys_FileRead(packhandle, &enddirheader, zipenddirheadersize) != zipenddirheadersize)
|
||
|
Sys_Error("COM_LoadZipFile: read error in %s", packfile);
|
||
|
|
||
|
if (enddirheader.totalnumentries > MAX_FILES_IN_PACK)
|
||
|
Sys_Error ("%s has %i files", packfile, numpackfiles);
|
||
|
|
||
|
info = malloc(sizeof(zipfileheader_t) * enddirheader.totalnumentries);
|
||
|
newfiles = Hunk_AllocName (enddirheader.totalnumentries * sizeof(packfile_t), "packfile");
|
||
|
|
||
|
pos = enddirheader.diroffset;
|
||
|
for(i = 0; i < enddirheader.totalnumentries; i++)
|
||
|
{
|
||
|
Sys_FileSeek (packhandle, pos); // == pos - enddirheader.dirsize
|
||
|
Sys_FileRead (packhandle, &info[i], zipfileheadersize);
|
||
|
if (info[i].ident != ZIPFILEIDHEADER)
|
||
|
Sys_Error ("%s is not a Zip or PK3file", packfile);
|
||
|
|
||
|
Sys_FileRead (packhandle, newfiles[i].name, info[i].filenamelen);
|
||
|
newfiles[i].filepos = LongBytes(info[i].offset);
|
||
|
newfiles[i].filelen = LongBytes(info[i].compressedsize);
|
||
|
pos += zipfileheadersize + info[i].extralen + info[i].filenamelen + info[i].commentlen;
|
||
|
}
|
||
|
|
||
|
pack = Hunk_Alloc (sizeof (pack_t));
|
||
|
strcpy (pack->filename, packfile);
|
||
|
pack->handle = packhandle;
|
||
|
pack->numfiles = enddirheader.totalnumentries;
|
||
|
pack->files = newfiles;
|
||
|
pack->compression = header.compression;
|
||
|
// Sys_Error("Added packfile %s (%i files, type %i)\n", packfile, enddirheader.totalnumentries, header.compression);
|
||
|
Con_Printf ("Added packfile %s (%i files)\n", packfile, enddirheader.totalnumentries);
|
||
|
return pack;
|
||
|
}
|
||
|
#endif
|