support multi-file zips, skipping irrelevant files
This commit is contained in:
parent
2f1c528a6c
commit
a88b04319e
2 changed files with 24 additions and 20 deletions
4
common.h
4
common.h
|
@ -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) \
|
||||||
|
|
22
zip.c
22
zip.c
|
@ -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..)
|
||||||
// Used to be: if(data.Sig != 0x04034b50) break;
|
|
||||||
if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B ||
|
if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B ||
|
||||||
data.Sig[2] != 0x03 || data.Sig[3] != 0x04 )
|
data.Sig[2] != 0x03 || data.Sig[3] != 0x04 )
|
||||||
{
|
{
|
||||||
goto outcode;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
file_read(fd, tmp, data.FilenameLength);
|
ret = file_read(fd, tmp, data.FilenameLength);
|
||||||
|
if (ret != data.FilenameLength)
|
||||||
|
break;
|
||||||
|
|
||||||
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:
|
||||||
|
@ -146,6 +147,9 @@ u32 load_file_zip(char *filename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip:
|
||||||
|
file_seek(fd, data.DataDescriptor.CompressedSize, SEEK_CUR);
|
||||||
}
|
}
|
||||||
|
|
||||||
outcode:
|
outcode:
|
||||||
|
|
Loading…
Add table
Reference in a new issue