ew-engine/hq engine src/pk3.c

210 lines
6.0 KiB
C
Raw Normal View History

2006-10-08 00:00:00 +00:00
#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