restore unzipping for sdl, also

This commit is contained in:
zeromus 2008-08-13 08:40:12 +00:00
parent a8f861d081
commit b67554f47b
2 changed files with 81 additions and 1 deletions

View File

@ -1,6 +1,6 @@
---version 2.0.2 released--- ---version 2.0.2 released---
13-aug-2008 - zeromus - restore ungzipping capability which was lost when archive support was added 13-aug-2008 - zeromus - restore ungzipping (and unzipping in sdl) capability which was lost when archive support was added
13-aug-2008 - zeromus - add FORBID breakpoints - regions which block breakpoints from happening if they contain the PC 13-aug-2008 - zeromus - add FORBID breakpoints - regions which block breakpoints from happening if they contain the PC
13-aug-2008 - punkrockguy318 - SDL: fixed --input(1-4) options. input1 and 2 are regular inputs, input3 and 4 are famicom expansion inputs 13-aug-2008 - punkrockguy318 - SDL: fixed --input(1-4) options. input1 and 2 are regular inputs, input3 and 4 are famicom expansion inputs
12-aug-2008 - zeromus - fix SDL configfile woes. configfile now goes to ~/.fceux/fceux.cfg 12-aug-2008 - zeromus - fix SDL configfile woes. configfile now goes to ~/.fceux/fceux.cfg

View File

@ -184,6 +184,73 @@ FileBaseInfo DetermineFileBase(const char *f) {
inline FileBaseInfo DetermineFileBase(const std::string& str) { return DetermineFileBase(str.c_str()); } inline FileBaseInfo DetermineFileBase(const std::string& str) { return DetermineFileBase(str.c_str()); }
static FCEUFILE * TryUnzip(const std::string& path) {
unzFile tz;
if((tz=unzOpen(path.c_str()))) // If it's not a zip file, use regular file handlers.
// Assuming file type by extension usually works,
// but I don't like it. :)
{
if(unzGoToFirstFile(tz)==UNZ_OK)
{
for(;;)
{
char tempu[512]; // Longer filenames might be possible, but I don't
// think people would name files that long in zip files...
unzGetCurrentFileInfo(tz,0,tempu,512,0,0,0,0);
tempu[511]=0;
if(strlen(tempu)>=4)
{
char *za=tempu+strlen(tempu)-4;
//if(!ext)
{
if(!strcasecmp(za,".nes") || !strcasecmp(za,".fds") ||
!strcasecmp(za,".nsf") || !strcasecmp(za,".unf") ||
!strcasecmp(za,".nez"))
break;
}
//else if(!strcasecmp(za,ext))
// break;
}
if(strlen(tempu)>=5)
{
if(!strcasecmp(tempu+strlen(tempu)-5,".unif"))
break;
}
if(unzGoToNextFile(tz)!=UNZ_OK)
{
if(unzGoToFirstFile(tz)!=UNZ_OK) goto zpfail;
break;
}
}
if(unzOpenCurrentFile(tz)!=UNZ_OK)
goto zpfail;
}
else
{
zpfail:
unzClose(tz);
return 0;
}
unz_file_info ufo;
unzGetCurrentFileInfo(tz,&ufo,0,0,0,0,0,0);
int size = ufo.uncompressed_size;
memorystream* ms = new memorystream(size);
unzReadCurrentFile(tz,ms->buf(),ufo.uncompressed_size);
unzCloseCurrentFile(tz);
unzClose(tz);
FCEUFILE *fceufp=fceufp = new FCEUFILE();
fceufp->stream = ms;
fceufp->size = size;
return fceufp;
}
return 0;
}
FCEUFILE * FCEU_fopen(const char *path, const char *ipsfn, char *mode, char *ext, int index) FCEUFILE * FCEU_fopen(const char *path, const char *ipsfn, char *mode, char *ext, int index)
{ {
@ -218,6 +285,19 @@ FCEUFILE * FCEU_fopen(const char *path, const char *ipsfn, char *mode, char *ext
return 0; return 0;
} }
//try to read a zip file
{
fceufp = TryUnzip(fileToOpen);
if(fceufp) {
delete fp;
fceufp->filename = fileToOpen;
fceufp->logicalPath = fileToOpen;
fceufp->fullFilename = fileToOpen;
fceufp->archiveIndex = -1;
goto applyips;
}
}
//try to read a gzipped file //try to read a gzipped file
{ {
uint32 magic; uint32 magic;