diff --git a/atari800/src/statesav.c b/atari800/src/statesav.c index df1ad28..a6603fd 100644 --- a/atari800/src/statesav.c +++ b/atari800/src/statesav.c @@ -73,7 +73,23 @@ #define SAVE_VERSION_NUMBER 8 /* Last changed after Atari800 3.1.0 */ - +#if defined(MEMCOMPR) +static gzFile *mem_open(const char *name, const char *mode); +static int mem_close(gzFile *stream); +static size_t mem_read(void *buf, size_t len, gzFile *stream); +static size_t mem_write(const void *buf, size_t len, gzFile *stream); +#define GZOPEN(X, Y) mem_open(X, Y) +#define GZCLOSE(X) mem_close(X) +#define GZREAD(X, Y, Z) mem_read(Y, Z, X) +#define GZWRITE(X, Y, Z) mem_write(Y, Z, X) +#undef GZERROR +#elif defined(HAVE_LIBZ) /* above MEMCOMPR, below HAVE_LIBZ */ +#define GZOPEN(X, Y) gzopen(X, Y) +#define GZCLOSE(X) gzclose(X) +#define GZREAD(X, Y, Z) gzread(X, Y, Z) +#define GZWRITE(X, Y, Z) gzwrite(X, (const voidp) Y, Z) +#define GZERROR(X, Y) gzerror(X, Y) +#else #define GZOPEN(X, Y) fopen(X, Y) #define GZCLOSE(X) fclose(X) #define GZREAD(X, Y, Z) fread(Y, Z, 1, X) @@ -81,12 +97,11 @@ #undef GZERROR #define gzFile FILE * #define Z_OK 0 +#endif static gzFile StateFile = NULL; static int nFileError = Z_OK; - - static void GetGZErrorText(void) { #ifdef GZERROR @@ -315,6 +330,8 @@ void StateSav_ReadFNAME(char *filename) int StateSav_SaveAtariState(const char *filename, const char *mode, UBYTE SaveVerbose) { + UBYTE StateVersion = SAVE_VERSION_NUMBER; + if (StateFile != NULL) { GZCLOSE(StateFile); StateFile = NULL; @@ -334,56 +351,6 @@ int StateSav_SaveAtariState(const char *filename, const char *mode, UBYTE SaveVe return FALSE; } - if( StateSav_SaveAtariStateInternal(SaveVerbose) == FALSE ) - return FALSE; - - if (GZCLOSE(StateFile) != 0) { - StateFile = NULL; - return FALSE; - } - StateFile = NULL; - - if (nFileError != Z_OK) - return FALSE; - - return TRUE; -} - -int StateSav_SaveAtariStateMem(char **data ,size_t *size) -{ - nFileError = Z_OK; - - StateFile = open_memstream(data, size); - if (StateFile == NULL) { - GetGZErrorText(); - return FALSE; - } - if (GZWRITE(StateFile, "ATARI800", 8) == 0) { - GetGZErrorText(); - GZCLOSE(StateFile); - StateFile = NULL; - return FALSE; - } - - StateSav_SaveAtariStateInternal(TRUE); - - if (GZCLOSE(StateFile) != 0) { - StateFile = NULL; - return FALSE; - } - StateFile = NULL; - - if (nFileError != Z_OK) - return FALSE; - - return TRUE; -} - - -int StateSav_SaveAtariStateInternal(UBYTE SaveVerbose) -{ - UBYTE StateVersion = SAVE_VERSION_NUMBER; - StateSav_SaveUBYTE(&StateVersion, 1); StateSav_SaveUBYTE(&SaveVerbose, 1); /* The order here is important. Atari800_StateSave must be first because it saves the machine type, and @@ -433,11 +400,24 @@ int StateSav_SaveAtariStateInternal(UBYTE SaveVerbose) DCStateSave(); #endif + if (GZCLOSE(StateFile) != 0) { + StateFile = NULL; + return FALSE; + } + StateFile = NULL; + + if (nFileError != Z_OK) + return FALSE; + return TRUE; } int StateSav_ReadAtariState(const char *filename, const char *mode) { + char header_string[8]; + UBYTE StateVersion = 0; /* The version of the save file */ + UBYTE SaveVerbose = 0; /* Verbose mode means save basic, OS if patched */ + if (StateFile != NULL) { GZCLOSE(StateFile); StateFile = NULL; @@ -451,51 +431,6 @@ int StateSav_ReadAtariState(const char *filename, const char *mode) return FALSE; } - if( StateSav_ReadAtariStateInternal() == FALSE ) - return FALSE; - - GZCLOSE(StateFile); - StateFile = NULL; - - if (nFileError != Z_OK) - return FALSE; - - return TRUE; -} - - -int StateSav_ReadAtariStateMem(const char* data, size_t size) -{ - if (StateFile != NULL) { - GZCLOSE(StateFile); - StateFile = NULL; - } - nFileError = Z_OK; - - StateFile = fmemopen((char* )data, size, "r"); - - if (StateFile == NULL) { - return FALSE; - } - - if (StateSav_ReadAtariStateInternal() == FALSE) - return FALSE; - - GZCLOSE(StateFile); - StateFile = NULL; - - if (nFileError != Z_OK) - return FALSE; - - return TRUE; -} - -int StateSav_ReadAtariStateInternal() -{ - char header_string[8]; - UBYTE StateVersion = 0; /* The version of the save file */ - UBYTE SaveVerbose = 0; /* Verbose mode means save basic, OS if patched */ - if (GZREAD(StateFile, header_string, 8) == 0) { GetGZErrorText(); GZCLOSE(StateFile); @@ -510,7 +445,7 @@ int StateSav_ReadAtariStateInternal() } if (GZREAD(StateFile, &StateVersion, 1) == 0 - || GZREAD(StateFile, &SaveVerbose, 1) == 0) { + || GZREAD(StateFile, &SaveVerbose, 1) == 0) { Log_print("Failed read from Atari state file."); GetGZErrorText(); GZCLOSE(StateFile); @@ -540,7 +475,7 @@ int StateSav_ReadAtariStateInternal() XEP80_StateRead(); #else int local_xep80_enabled; - StateSav_ReadINT(&local_xep80_enabled, 1); + StateSav_ReadINT(&local_xep80_enabled,1); if (local_xep80_enabled) { Log_print("Cannot read this state file because this version does not support XEP80."); GZCLOSE(StateFile); @@ -554,7 +489,7 @@ int StateSav_ReadAtariStateInternal() #else { int local_mio_enabled; - StateSav_ReadINT(&local_mio_enabled, 1); + StateSav_ReadINT(&local_mio_enabled,1); if (local_mio_enabled) { Log_print("Cannot read this state file because this version does not support MIO."); GZCLOSE(StateFile); @@ -568,7 +503,7 @@ int StateSav_ReadAtariStateInternal() #else { int local_bb_enabled; - StateSav_ReadINT(&local_bb_enabled, 1); + StateSav_ReadINT(&local_bb_enabled,1); if (local_bb_enabled) { Log_print("Cannot read this state file because this version does not support the Black Box."); GZCLOSE(StateFile); @@ -582,7 +517,7 @@ int StateSav_ReadAtariStateInternal() #else { int local_xld_enabled; - StateSav_ReadINT(&local_xld_enabled, 1); + StateSav_ReadINT(&local_xld_enabled,1); if (local_xld_enabled) { Log_print("Cannot read this state file because this version does not support the 1400XL/1450XLD."); GZCLOSE(StateFile); @@ -595,9 +530,17 @@ int StateSav_ReadAtariStateInternal() #ifdef DREAMCAST DCStateRead(); #endif + + GZCLOSE(StateFile); + StateFile = NULL; + + if (nFileError != Z_OK) + return FALSE; + return TRUE; } + /* hack to compress in memory before writing * - for DREAMCAST only * - 2 reasons for this: diff --git a/atari800/src/statesav.h b/atari800/src/statesav.h index e01b1ba..2c6b692 100644 --- a/atari800/src/statesav.h +++ b/atari800/src/statesav.h @@ -6,12 +6,6 @@ int StateSav_SaveAtariState(const char *filename, const char *mode, UBYTE SaveVerbose); int StateSav_ReadAtariState(const char *filename, const char *mode); -int StateSav_SaveAtariStateMem(char **data ,size_t *size); -int StateSav_ReadAtariStateMem(const char *data , size_t size); - -int StateSav_SaveAtariStateInternal(UBYTE SaveVerbose); -int StateSav_ReadAtariStateInternal(); - void StateSav_SaveUBYTE(const UBYTE *data, int num); void StateSav_SaveUWORD(const UWORD *data, int num); void StateSav_SaveINT(const int *data, int num); diff --git a/libretro/libretro-core.c b/libretro/libretro-core.c index 9ddad5a..2992e78 100644 --- a/libretro/libretro-core.c +++ b/libretro/libretro-core.c @@ -48,8 +48,6 @@ extern void texture_uninit(void); extern void Emu_init(); extern void Emu_uninit(); extern void input_gui(void); -extern int StateSav_SaveAtariStateMem(char** data, size_t* size); -extern int StateSav_ReadAtariStateMem(const char* data, size_t size); const char *retro_save_directory; const char *retro_system_directory; @@ -738,38 +736,17 @@ bool retro_load_game_special(unsigned type, const struct retro_game_info *info, size_t retro_serialize_size(void) { - char* buf = NULL; - size_t size = 0; - bool ret = StateSav_SaveAtariStateMem(&buf, &size) == TRUE; - free(buf); - - if (!ret || size == 0) - return 0; - - return size; + return 0; } bool retro_serialize(void *data_, size_t size) { - char* buf = NULL; - size_t serializeSize = 0; - bool ret = StateSav_SaveAtariStateMem(&buf, &serializeSize) == TRUE; - if (!ret || serializeSize != size) - { - free(buf); - return false; - } - - memcpy(data_, buf, size); - - free(buf); - - return true; + return false; } bool retro_unserialize(const void *data_, size_t size) { - return StateSav_ReadAtariStateMem(data_, size) == TRUE; + return false; } void *retro_get_memory_data(unsigned id)