Added a zip ROMReader code based on libzzip and fixed a few bugs

in ROMReader interface.
This commit is contained in:
yabause 2007-01-07 21:38:23 +00:00
parent d53e9a93d2
commit eafe6526c6
4 changed files with 90 additions and 16 deletions

View File

@ -28,6 +28,9 @@ dnl --- Other prerequisites ---
dnl - Check for zlib
AC_CHECK_LIB(z, gzopen)
dnl - Check for zziplib
AC_CHECK_LIB(zzip, zzip_open)
dnl - Check for SDL
AC_PATH_PROGS(SDLCONFIG, [sdl-config sdl11-config])
if test ! "x$SDLCONFIG" = "x" ; then

View File

@ -1,22 +1,27 @@
#include "ROMReader.h"
#include <stdio.h>
#ifdef HAVE_LIBZZIP
#include <zzip/zzip.h>
#endif
ROMReader_struct * ROMReaderInit(const char ** filename)
ROMReader_struct * ROMReaderInit(char ** filename)
{
#ifdef HAVE_LIBZ
if(!strcasecmp(".gz", *filename + (strlen(*filename) - 3)))
{
*filename -= 3;
(*filename)[strlen(*filename) - 3] = '\0';
return &GZIPROMReader;
}
else
{
return &STDROMReader;
}
#else
return &STDROMReader;
#endif
#ifdef HAVE_LIBZZIP
if (!strcasecmp(".zip", *filename + (strlen(*filename) - 4)))
{
(*filename)[strlen(*filename) - 4] = '\0';
return &ZIPROMReader;
}
#endif
return &STDROMReader;
}
void * STDROMReaderInit(const char * filename);
@ -103,7 +108,7 @@ void GZIPROMReaderDeInit(void * file)
u32 GZIPROMReaderSize(void * file)
{
char useless[1024];
u32 size;
u32 size = 0;
/* FIXME this function should first save the current
* position and restore it after size calculation */
@ -125,3 +130,65 @@ int GZIPROMReaderRead(void * file, void * buffer, u32 size)
return gzread(file, buffer, size);
}
#endif
#ifdef HAVE_LIBZZIP
void * ZIPROMReaderInit(const char * filename);
void ZIPROMReaderDeInit(void *);
u32 ZIPROMReaderSize(void *);
int ZIPROMReaderSeek(void *, int, int);
int ZIPROMReaderRead(void *, void *, u32);
ROMReader_struct ZIPROMReader =
{
ROMREADER_ZIP,
"Zip ROM Reader",
ZIPROMReaderInit,
ZIPROMReaderDeInit,
ZIPROMReaderSize,
ZIPROMReaderSeek,
ZIPROMReaderRead
};
void * ZIPROMReaderInit(const char * filename)
{
ZZIP_DIRENT * dir = zzip_opendir(filename);
dir = zzip_readdir(dir);
if (dir != NULL)
{
char tmp1[1024];
char tmp2[1024];
strncpy(tmp1, filename, strlen(filename) - 4);
sprintf(tmp2, "%s/%s", tmp1, dir->d_name);
return zzip_fopen(tmp2, "rb");
}
return NULL;
}
void ZIPROMReaderDeInit(void * file)
{
zzip_close(file);
}
u32 ZIPROMReaderSize(void * file)
{
char useless[1024];
u32 tmp;
u32 size = 0;
zzip_seek(file, 0, SEEK_END);
size = zzip_tell(file);
zzip_seek(file, 0, SEEK_SET);
return size;
}
int ZIPROMReaderSeek(void * file, int offset, int whence)
{
return zzip_seek(file, offset, whence);
}
int ZIPROMReaderRead(void * file, void * buffer, u32 size)
{
return zzip_read(file, buffer, size);
}
#endif

View File

@ -1,8 +1,9 @@
#include "types.h"
#define ROMREADER_DEFAULT -1
#define ROMREADER_STD 0
#define ROMREADER_GZIP 1
#define ROMREADER_STD 0
#define ROMREADER_GZIP 1
#define ROMREADER_ZIP 2
typedef struct
{
@ -19,5 +20,8 @@ extern ROMReader_struct STDROMReader;
#ifdef HAVE_LIBZ
extern ROMReader_struct GZIPROMReader;
#endif
#ifdef HAVE_LIBZZIP
extern ROMReader_struct ZIPROMReader;
#endif
ROMReader_struct * ROMReaderInit(const char ** filename);
ROMReader_struct * ROMReaderInit(char ** filename);

View File

@ -230,11 +230,11 @@ static void *Open_Select(GtkWidget* widget, gpointer data)
gtk_file_filter_add_pattern(pFilter_nds, "*.nds");
#ifdef HAVE_LIBZ
gtk_file_filter_add_pattern(pFilter_nds, "*.nds.gz");
gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds/.nds.gz)");
#else
gtk_file_filter_add_pattern(pFilter_nds, "*.nds");
gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds)");
#endif
#ifdef HAVE_LIBZZIP
gtk_file_filter_add_pattern(pFilter_nds, "*.nds.zip");
#endif
gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds)");
pFilter_dsgba = gtk_file_filter_new();
gtk_file_filter_add_pattern(pFilter_dsgba, "*.ds.gba");