/* * Print data for a given file */ static void _PrintFileData(ArchiveHandle *AH, char *filename, RestoreOptions *ropt) { char buf[4096]; size_t cnt; if (!filename) return; #ifdef HAVE_LIBZ AH->FH = gzopen(filename, "rb"); #else AH->FH = fopen(filename, PG_BINARY_R); #endif if (AH->FH == NULL) die_horribly(AH, modulename, "could not open data file for input\n"); while ((cnt = GZREAD(buf, 1, 4095, AH->FH)) > 0) { buf[cnt] = '\0'; ahwrite(buf, 1, cnt, AH); } if (GZCLOSE(AH->FH) != 0) die_horribly(AH, modulename, "could not close data file after reading\n"); }
/* Value is memory location of data, num is number of type to save */ void StateSav_ReadUBYTE(UBYTE *data, int num) { if (!StateFile || nFileError != Z_OK) return; if (GZREAD(StateFile, data, num) == 0) GetGZErrorText(); }
void StateSav_ReadINT(int *data, int num) { if (!StateFile || nFileError != Z_OK) return; while (num > 0) { UBYTE signbit = 0; int temp; UBYTE byte1, byte2, byte3, byte4; if (GZREAD(StateFile, &byte1, 1) == 0) { GetGZErrorText(); break; } if (GZREAD(StateFile, &byte2, 1) == 0) { GetGZErrorText(); break; } if (GZREAD(StateFile, &byte3, 1) == 0) { GetGZErrorText(); break; } if (GZREAD(StateFile, &byte4, 1) == 0) { GetGZErrorText(); break; } signbit = byte4 & 0x80; byte4 &= 0x7f; temp = (byte4 << 24) | (byte3 << 16) | (byte2 << 8) | byte1; if (signbit) temp = -temp; *data++ = temp; num--; } }
/* Value is memory location of data, num is number of type to save */ void StateSav_ReadUWORD(UWORD *data, int num) { if (!StateFile || nFileError != Z_OK) return; while (num > 0) { UBYTE byte1, byte2; if (GZREAD(StateFile, &byte1, 1) == 0) { GetGZErrorText(); break; } if (GZREAD(StateFile, &byte2, 1) == 0) { GetGZErrorText(); break; } *data++ = (byte2 << 8) | byte1; num--; } }
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; } nFileError = Z_OK; StateFile = GZOPEN(filename, mode); if (StateFile == NULL) { Log_print("Could not open %s for state read.", filename); GetGZErrorText(); return FALSE; } if (GZREAD(StateFile, header_string, 8) == 0) { GetGZErrorText(); GZCLOSE(StateFile); StateFile = NULL; return FALSE; } if (memcmp(header_string, "ATARI800", 8) != 0) { Log_print("This is not an Atari800 state save file."); GZCLOSE(StateFile); StateFile = NULL; return FALSE; } if (GZREAD(StateFile, &StateVersion, 1) == 0 || GZREAD(StateFile, &SaveVerbose, 1) == 0) { Log_print("Failed read from Atari state file."); GetGZErrorText(); GZCLOSE(StateFile); StateFile = NULL; return FALSE; } if (StateVersion != SAVE_VERSION_NUMBER && StateVersion < 3) { Log_print("Cannot read this state file because it is an incompatible version."); GZCLOSE(StateFile); StateFile = NULL; return FALSE; } Atari800_StateRead(); if (StateVersion >= 4) { CARTRIDGE_StateRead(); SIO_StateRead(); } ANTIC_StateRead(); CPU_StateRead(SaveVerbose, StateVersion); GTIA_StateRead(); PIA_StateRead(); POKEY_StateRead(); if (StateVersion >= 6) { #ifdef XEP80_EMULATION XEP80_StateRead(); #else int local_xep80_enabled; 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); StateFile = NULL; return FALSE; } #endif /* XEP80_EMULATION */ PBI_StateRead(); #ifdef PBI_MIO PBI_MIO_StateRead(); #else { int local_mio_enabled; 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); StateFile = NULL; return FALSE; } } #endif /* PBI_MIO */ #ifdef PBI_BB PBI_BB_StateRead(); #else { int local_bb_enabled; 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); StateFile = NULL; return FALSE; } } #endif /* PBI_BB */ #ifdef PBI_XLD PBI_XLD_StateRead(); #else { int local_xld_enabled; 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); StateFile = NULL; return FALSE; } } #endif /* PBI_XLD */ } #ifdef DREAMCAST DCStateRead(); #endif GZCLOSE(StateFile); StateFile = NULL; if (nFileError != Z_OK) return FALSE; return TRUE; }
/* Opens a ZLIB compressed (gzip) file, creates a temporary filename, and decompresses the contents of the .gz file to the temporary file name. Note that *outfilename is actually blank coming in and is filled by mkstemp */ FILE * openzlib(int diskno, const char *infilename, char *outfilename ) { #ifndef HAVE_LIBZ Aprint( "This executable cannot decompress ZLIB files" ); return NULL; #else gzFile gzSource; FILE *file = NULL, *outfile = NULL; char *curptr = outfilename; char *zlib_buffer = NULL; if( zlib_capable() == -1 ) { Aprint( "This executable cannot decompress ZLIB files" ); return NULL; } zlib_buffer = malloc( ZLIB_BUFFER_SIZE + 1 ); if( !zlib_buffer ) { Aprint( "Could not obtain memory for zlib decompression" ); return NULL; } curptr += prepend_tmpfile_path( outfilename ); strcpy(curptr,"TMP_XXXXXX\0"); outfile = fdopen(mkstemp(curptr), "wb"); if (!outfile) { Aprint( "Could not open temporary file" ); free( zlib_buffer ); return NULL; } gzSource = GZOPEN( infilename, "rb" ); if( !gzSource ) { Aprint( "ZLIB could not open file %s", infilename ); fclose( outfile ); } else /* Convert the gzip file to the temporary file */ { int result, temp; Aprint( "Converting %s to %s", infilename, outfilename ); do { result = GZREAD( gzSource, &zlib_buffer[0], ZLIB_BUFFER_SIZE ); if( result > 0 ) { if( fwrite(zlib_buffer, 1, result, outfile) != result ) { Aprint( "Error writing to temporary file %s, disk may be full", outfilename ); result = -1; } } } while( result == ZLIB_BUFFER_SIZE ); temp = GZCLOSE( gzSource ); fclose( outfile ); if( result > -1 ) file = fopen(outfilename, "rb"); else { Aprint( "Error while parsing gzip file" ); file = NULL; } } if(!file) { if( zlib_buffer ) free( zlib_buffer ); Aprint( "Removing temporary file %s", outfilename ); remove( outfilename ); } return file; #endif /* HAVE_LIBZ */ }