// Packages in memory
-typedef enum
+typedef enum
{
FILE_FLAG_NONE = 0,
FILE_FLAG_TRUEOFFS = (1 << 0), // the offset in packfile_t is the true contents offset
{
char filename [MAX_OSPATH];
FILE *handle;
+ int ignorecase; // LordHavoc: pk3 ignores case
int numfiles;
packfile_t *files;
mempool_t *mempool;
maxsize = ZIP_MAX_COMMENTS_SIZE + ZIP_END_CDIR_SIZE;
buffer = Mem_Alloc (tempmempool, maxsize);
fseek (packhandle, filesize - maxsize, SEEK_SET);
- if (fread (buffer, 1, maxsize, packhandle) != maxsize)
+ if (fread (buffer, 1, maxsize, packhandle) != (unsigned long) maxsize)
{
Mem_Free (buffer);
return false;
if ((ptr[8] & 0x29) == 0 && (ptr[38] & 0x18) == 0)
{
// Still enough bytes for the name?
- if (remaining < namesize || namesize >= sizeof (*pack->files))
+ if ((size_t) remaining < namesize || namesize >= sizeof (*pack->files))
{
Mem_Free (central_dir);
return -1;
if (eocd.disknum != 0 || eocd.cdir_disknum != 0)
Sys_Error ("%s is a multi-volume ZIP archive", packfile);
- if (eocd.nbentries > MAX_FILES_IN_PACK)
- Sys_Error ("%s contains too many files (%hu)", packfile, eocd.nbentries);
+ // LordHavoc: was always false because nbentries is an unsigned short and MAX_FILES_IN_PACK is 65536
+ //if (eocd.nbentries > (unsigned int) MAX_FILES_IN_PACK)
+ // Sys_Error ("%s contains too many files (%hu)", packfile, eocd.nbentries);
// Create a package structure in memory
pack = Mem_Alloc (pak_mempool, sizeof (pack_t));
+ pack->ignorecase = true; // LordHavoc: pk3 ignores case
strcpy (pack->filename, packfile);
pack->handle = packhandle;
pack->numfiles = eocd.nbentries;
Sys_Error ("%s has %i files", packfile, numpackfiles);
pack = Mem_Alloc(pak_mempool, sizeof (pack_t));
+ pack->ignorecase = false; // LordHavoc: pak is case sensitive
strcpy (pack->filename, packfile);
pack->handle = packhandle;
pack->numfiles = numpackfiles;
char *FS_FileExtension (const char *in)
{
static char exten[8];
+ const char *slash, *backslash, *colon, *dot, *separator;
int i;
- while (*in && *in != '.')
- in++;
- if (!*in)
+ slash = strrchr(in, '/');
+ backslash = strrchr(in, '\\');
+ colon = strrchr(in, ':');
+ dot = strrchr(in, '.');
+ separator = slash;
+ if (separator < backslash)
+ separator = backslash;
+ if (separator < colon)
+ separator = colon;
+ if (dot < separator)
return "";
- in++;
- for (i=0 ; i<7 && *in ; i++,in++)
- exten[i] = *in;
+ dot++;
+ for (i = 0;i < 7 && dot[i];i++)
+ exten[i] = dot[i];
exten[i] = 0;
return exten;
}
searchpath_t *search;
char netpath[MAX_OSPATH];
pack_t *pak;
- int i, filenamelen;
+ int i, filenamelen, matched;
filenamelen = strlen (filename);
// look through all the pak file elements
pak = search->pack;
for (i=0 ; i<pak->numfiles ; i++)
- if (!strcmp (pak->files[i].name, filename)) // found it?
+ {
+ if (pak->ignorecase)
+ matched = !strcasecmp (pak->files[i].name, filename);
+ else
+ matched = !strcmp (pak->files[i].name, filename);
+ if (matched) // found it?
{
qfile_t *file;
* windowBits is passed < 0 to tell that there is no zlib header.
* Note that in this case inflate *requires* an extra "dummy" byte
* after the compressed stream in order to complete decompression and
- * return Z_STREAM_END.
- * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+ * return Z_STREAM_END.
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
* size of both compressed and uncompressed data
*/
if (qz_inflateInit2 (&ztk->zstream, -MAX_WBITS) != Z_OK)
return file;
}
+ }
}
else
{
ztoolkit_t *ztk = file->z;
size_t crt_offset;
qbyte buffer [sizeof (ztk->output)]; // it's big to force inflating into buffer directly
-
+
crt_offset = ztk->out_position - ztk->out_max + ztk->out_ind;
switch (whence)
}
// If we need to go back in the file
- if (offset <= crt_offset)
+ if (offset <= (long) crt_offset)
{
// If we still have the data we need in the output buffer
if (crt_offset - offset <= ztk->out_ind)
}
// Skip all data until we reach the requested offset
- while (crt_offset < offset)
+ while ((long) crt_offset < offset)
{
size_t diff = offset - crt_offset;
size_t count, len;
-
+
count = (diff > sizeof (buffer)) ? sizeof (buffer) : diff;
len = FS_Read (file, buffer, count);
if (len != count)
default:
return -1;
}
- if (offset < 0 || offset > file->length)
+ if (offset < 0 || offset > (long) file->length)
return -1;
if (fseek (file->stream, file->offset + offset, SEEK_SET) == -1)
if (! (file->flags & FS_FLAG_PACKED))
return fgets (buffer, buffersize, file->stream);
- for (ind = 0; ind < buffersize - 1; ind++)
+ for (ind = 0; ind < (size_t) buffersize - 1; ind++)
{
int c = FS_Getc (file);
switch (c)
return (file->position == file->length);
}
-
+
return feof (file->stream);
}