Added a zip ROMReader code based on libzzip and fixed a few bugs
in ROMReader interface.
This commit is contained in:
parent
d53e9a93d2
commit
eafe6526c6
|
@ -28,6 +28,9 @@ dnl --- Other prerequisites ---
|
||||||
dnl - Check for zlib
|
dnl - Check for zlib
|
||||||
AC_CHECK_LIB(z, gzopen)
|
AC_CHECK_LIB(z, gzopen)
|
||||||
|
|
||||||
|
dnl - Check for zziplib
|
||||||
|
AC_CHECK_LIB(zzip, zzip_open)
|
||||||
|
|
||||||
dnl - Check for SDL
|
dnl - Check for SDL
|
||||||
AC_PATH_PROGS(SDLCONFIG, [sdl-config sdl11-config])
|
AC_PATH_PROGS(SDLCONFIG, [sdl-config sdl11-config])
|
||||||
if test ! "x$SDLCONFIG" = "x" ; then
|
if test ! "x$SDLCONFIG" = "x" ; then
|
||||||
|
|
|
@ -1,22 +1,27 @@
|
||||||
#include "ROMReader.h"
|
#include "ROMReader.h"
|
||||||
|
|
||||||
#include <stdio.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
|
#ifdef HAVE_LIBZ
|
||||||
if(!strcasecmp(".gz", *filename + (strlen(*filename) - 3)))
|
if(!strcasecmp(".gz", *filename + (strlen(*filename) - 3)))
|
||||||
{
|
{
|
||||||
*filename -= 3;
|
(*filename)[strlen(*filename) - 3] = '\0';
|
||||||
return &GZIPROMReader;
|
return &GZIPROMReader;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return &STDROMReader;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return &STDROMReader;
|
|
||||||
#endif
|
#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);
|
void * STDROMReaderInit(const char * filename);
|
||||||
|
@ -103,7 +108,7 @@ void GZIPROMReaderDeInit(void * file)
|
||||||
u32 GZIPROMReaderSize(void * file)
|
u32 GZIPROMReaderSize(void * file)
|
||||||
{
|
{
|
||||||
char useless[1024];
|
char useless[1024];
|
||||||
u32 size;
|
u32 size = 0;
|
||||||
|
|
||||||
/* FIXME this function should first save the current
|
/* FIXME this function should first save the current
|
||||||
* position and restore it after size calculation */
|
* position and restore it after size calculation */
|
||||||
|
@ -125,3 +130,65 @@ int GZIPROMReaderRead(void * file, void * buffer, u32 size)
|
||||||
return gzread(file, buffer, size);
|
return gzread(file, buffer, size);
|
||||||
}
|
}
|
||||||
#endif
|
#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
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#define ROMREADER_DEFAULT -1
|
#define ROMREADER_DEFAULT -1
|
||||||
#define ROMREADER_STD 0
|
#define ROMREADER_STD 0
|
||||||
#define ROMREADER_GZIP 1
|
#define ROMREADER_GZIP 1
|
||||||
|
#define ROMREADER_ZIP 2
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -19,5 +20,8 @@ extern ROMReader_struct STDROMReader;
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
extern ROMReader_struct GZIPROMReader;
|
extern ROMReader_struct GZIPROMReader;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LIBZZIP
|
||||||
|
extern ROMReader_struct ZIPROMReader;
|
||||||
|
#endif
|
||||||
|
|
||||||
ROMReader_struct * ROMReaderInit(const char ** filename);
|
ROMReader_struct * ROMReaderInit(char ** filename);
|
||||||
|
|
|
@ -230,11 +230,11 @@ static void *Open_Select(GtkWidget* widget, gpointer data)
|
||||||
gtk_file_filter_add_pattern(pFilter_nds, "*.nds");
|
gtk_file_filter_add_pattern(pFilter_nds, "*.nds");
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
gtk_file_filter_add_pattern(pFilter_nds, "*.nds.gz");
|
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
|
#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();
|
pFilter_dsgba = gtk_file_filter_new();
|
||||||
gtk_file_filter_add_pattern(pFilter_dsgba, "*.ds.gba");
|
gtk_file_filter_add_pattern(pFilter_dsgba, "*.ds.gba");
|
||||||
|
|
Loading…
Reference in New Issue