/** * Open/Create snapshot file, and set flag so 'MemorySnapShot_Store' knows * how to handle data. */ static bool MemorySnapShot_OpenFile(const char *pszFileName, bool bSave) { char VersionString[] = VERSION_STRING; /* Set error */ bCaptureError = false; /* after opening file, set bCaptureSave to indicate whether * 'MemorySnapShot_Store' should load from or save to a file */ if (bSave) { if (!File_QueryOverwrite(pszFileName)) return false; /* Save */ CaptureFile = MemorySnapShot_fopen(pszFileName, "wb"); if (!CaptureFile) { fprintf(stderr, "Failed to open save file '%s': %s\n", pszFileName, strerror(errno)); bCaptureError = true; return false; } bCaptureSave = true; /* Store version string */ MemorySnapShot_Store(VersionString, sizeof(VersionString)); } else { /* Restore */ CaptureFile = MemorySnapShot_fopen(pszFileName, "rb"); if (!CaptureFile) { fprintf(stderr, "Failed to open file '%s': %s\n", pszFileName, strerror(errno)); bCaptureError = true; return false; } bCaptureSave = false; /* Restore version string */ MemorySnapShot_Store(VersionString, sizeof(VersionString)); /* Does match current version? */ if (strcasecmp(VersionString, VERSION_STRING)) { /* No, inform user and error */ Log_AlertDlg(LOG_ERROR, "Unable to restore Hatari memory state. File\n" "is compatible only with Hatari version %s.", VersionString); bCaptureError = true; return false; } } /* All OK */ return true; }
/** * Save file to disk, return FALSE if errors */ bool File_Save(const char *pszFileName, const Uint8 *pAddress, size_t Size, bool bQueryOverwrite) { bool bRet = false; /* Check if need to ask user if to overwrite */ if (bQueryOverwrite) { /* If file exists, ask if OK to overwrite */ if (!File_QueryOverwrite(pszFileName)) return false; } #if HAVE_LIBZ /* Normal file or gzipped file? */ if (File_DoesFileExtensionMatch(pszFileName, ".gz")) { gzFile hGzFile; /* Create a gzipped file: */ hGzFile = gzopen(pszFileName, "wb"); if (hGzFile != NULL) { /* Write data, set success flag */ if (gzwrite(hGzFile, pAddress, Size) == (int)Size) bRet = true; gzclose(hGzFile); } } else #endif /* HAVE_LIBZ */ { FILE *hDiskFile; /* Create a normal file: */ hDiskFile = fopen(pszFileName, "wb"); if (hDiskFile != NULL) { /* Write data, set success flag */ if (fwrite(pAddress, 1, Size, hDiskFile) == Size) bRet = true; fclose(hDiskFile); } } return bRet; }