diff --git a/desmume/configure.ac b/desmume/configure.ac index 3f079040f..301ae90a1 100644 --- a/desmume/configure.ac +++ b/desmume/configure.ac @@ -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 diff --git a/desmume/src/ROMReader.c b/desmume/src/ROMReader.c index 15ff3744e..27072e484 100644 --- a/desmume/src/ROMReader.c +++ b/desmume/src/ROMReader.c @@ -1,22 +1,27 @@ #include "ROMReader.h" #include +#ifdef HAVE_LIBZZIP +#include +#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 diff --git a/desmume/src/ROMReader.h b/desmume/src/ROMReader.h index 4ad867d5a..3db399504 100644 --- a/desmume/src/ROMReader.h +++ b/desmume/src/ROMReader.h @@ -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); diff --git a/desmume/src/gtk/main.c b/desmume/src/gtk/main.c index bf37c7d31..694c18b4f 100644 --- a/desmume/src/gtk/main.c +++ b/desmume/src/gtk/main.c @@ -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");