support multi-file zips, skipping irrelevant files

This commit is contained in:
notaz 2011-09-07 23:45:09 +03:00
parent 2f1c528a6c
commit a88b04319e
2 changed files with 24 additions and 20 deletions

View file

@ -148,10 +148,10 @@
#endif #endif
#define file_read(filename_tag, buffer, size) \ #define file_read(filename_tag, buffer, size) \
fread(buffer, size, 1, filename_tag) \ fread(buffer, 1, size, filename_tag) \
#define file_write(filename_tag, buffer, size) \ #define file_write(filename_tag, buffer, size) \
fwrite(buffer, size, 1, filename_tag) \ fwrite(buffer, 1, size, filename_tag) \
#define file_seek(filename_tag, offset, type) \ #define file_seek(filename_tag, offset, type) \
fseek(filename_tag, offset, type) \ fseek(filename_tag, offset, type) \

40
zip.c
View file

@ -51,28 +51,30 @@ u32 load_file_zip(char *filename)
u8 *buffer = NULL; u8 *buffer = NULL;
u8 *cbuffer; u8 *cbuffer;
char *ext; char *ext;
int ret;
file_open(fd, filename, read); file_open(fd, filename, read);
if(!file_check_valid(fd)) if(!file_check_valid(fd))
return -1; return -1;
#if 0 // EDIT: Why this while(1) is used is unknown and can cause a crash. while (1)
while(1)
#endif
{ {
file_read(fd, &data, sizeof(struct SZIPFileHeader)); ret = file_read(fd, &data, sizeof(data));
if (ret != sizeof(data))
break;
// EDIT: Check if this is a zip file without worrying about endian // It checks for the following: 0x50 0x4B 0x03 0x04 (PK..)
// It checks for the following: 0x50 0x4B 0x03 0x04 (PK..) if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B ||
// Used to be: if(data.Sig != 0x04034b50) break; data.Sig[2] != 0x03 || data.Sig[3] != 0x04 )
if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B || {
data.Sig[2] != 0x03 || data.Sig[3] != 0x04 ) break;
{ }
goto outcode;
} ret = file_read(fd, tmp, data.FilenameLength);
if (ret != data.FilenameLength)
break;
file_read(fd, tmp, data.FilenameLength);
tmp[data.FilenameLength] = 0; // end string tmp[data.FilenameLength] = 0; // end string
if(data.ExtraFieldLength) if(data.ExtraFieldLength)
@ -88,7 +90,7 @@ u32 load_file_zip(char *filename)
// file is too big // file is too big
if(data.DataDescriptor.UncompressedSize > gamepak_ram_buffer_size) if(data.DataDescriptor.UncompressedSize > gamepak_ram_buffer_size)
goto outcode; goto skip;
if(!strcasecmp(ext, "bin") || !strcasecmp(ext, "gba")) if(!strcasecmp(ext, "bin") || !strcasecmp(ext, "gba"))
{ {
@ -100,7 +102,6 @@ u32 load_file_zip(char *filename)
case 0: case 0:
retval = data.DataDescriptor.UncompressedSize; retval = data.DataDescriptor.UncompressedSize;
file_read(fd, buffer, retval); file_read(fd, buffer, retval);
goto outcode; goto outcode;
case 8: case 8:
@ -115,9 +116,9 @@ u32 load_file_zip(char *filename)
stream.next_out = (Bytef*)buffer; stream.next_out = (Bytef*)buffer;
// EDIT: Now uses proper conversion of data types for retval. // EDIT: Now uses proper conversion of data types for retval.
retval = (u32)data.DataDescriptor.UncompressedSize; retval = (u32)data.DataDescriptor.UncompressedSize;
stream.avail_out = data.DataDescriptor.UncompressedSize; stream.avail_out = data.DataDescriptor.UncompressedSize;
stream.zalloc = (alloc_func)0; stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0; stream.zfree = (free_func)0;
@ -146,6 +147,9 @@ u32 load_file_zip(char *filename)
} }
} }
} }
skip:
file_seek(fd, data.DataDescriptor.CompressedSize, SEEK_CUR);
} }
outcode: outcode: