SAVESTATE_t* ReadSave(FILE *ifile) { int i; int compressed = false; int chunk_offset,chunk_count; char string[128]; char temp_save[PATH_MAX]; SAVESTATE_t *save; CHUNK_t *chunk; FILE *tmpfile; fread(string, 1, 8, ifile); string[8] = 0; if (strncmp(DETECT_CMP_STR, string, 8) == 0) { i = fgetc(ifile); GetAppDataString(temp_save, PATH_MAX - 1 - strlen(tmpSuffix)); strcat(temp_save, tmpSuffix); mkstemp(temp_save); tmpfile = fopen(temp_save,"wb"); if (!tmpfile) { return nullptr; } //int error; switch(i) { #ifdef ZLIB_WINAPI case ZLIB_CMP: { int error = inf(ifile,tmpfile); fclose(tmpfile); ifile = fopen(temp_save,"rb"); //this is not a leak, file gets closed // outside of this routine. if (!ifile) { return nullptr; } compressed = true; fread(string, 1, 8, ifile); break; } #endif default: fclose(tmpfile); remove(temp_save); return nullptr; } } if (strncmp(DETECT_STR, string, 8) != 0){ if (compressed == true) fclose(ifile); return nullptr; } save = (SAVESTATE_t *) malloc(sizeof(SAVESTATE_t)); if (!save) { if (compressed == true) fclose(ifile); return nullptr; } chunk_offset = fgeti(ifile); save->version_major = fgeti(ifile); save->version_minor = fgeti(ifile); save->version_build = fgeti(ifile); if (save->version_major != CUR_MAJOR) { fclose(ifile); free(save); return nullptr; } save->model = fgeti(ifile); chunk_count = fgeti(ifile); fread(save->author,1,32,ifile); fread(save->comment,1,64,ifile); fseek(ifile, chunk_offset + 8 + 4, SEEK_SET); for(i = 0; i < 512; i++) { save->chunks[i] = nullptr; } save->chunk_count = 0; for(i = 0; i < chunk_count; i++) { string[0] = fgetc(ifile); string[1] = fgetc(ifile); string[2] = fgetc(ifile); string[3] = fgetc(ifile); string[4] = 0; chunk = NewChunk(save,string); chunk->size = fgeti(ifile); chunk->data = (unsigned char *) malloc(chunk->size); fread(chunk->data,1,chunk->size,ifile); } if (compressed == true) { fclose(ifile); remove(temp_save); } /* check for read errors... */ return save; }
SAVESTATE_t* ReadSave(FILE *ifile) { int i; int compressed = FALSE; int chunk_offset,chunk_count; char string[128]; TCHAR tmpfn[L_tmpnam]; TCHAR temp_save[MAX_PATH]; SAVESTATE_t *save; CHUNK_t *chunk; FILE *tmpfile; fread(string, 1, 8, ifile); string[8] = 0; if (strncmp(DETECT_CMP_STR, string, 8) == 0) { i = fgetc(ifile); #ifdef WINVER _ttmpnam_s(tmpfn); GetAppDataString(temp_save, sizeof(temp_save)); StringCbCat(temp_save, sizeof(temp_save), tmpfn); _tfopen_s(&tmpfile, temp_save, _T("wb")); #else tmpnam(tmpfn); strcpy(temp_save, getenv("appdata")); strcat(temp_save, tmpfn); tmpfile = fopen(temp_save,"wb"); #endif if (!tmpfile) { return NULL; } //int error; switch(i) { #ifdef ZLIB_WINAPI case ZLIB_CMP: { int error = inf(ifile,tmpfile); break; } #endif default: fclose(tmpfile); #ifdef _WINDOWS _tremove(tmpfn); #else remove(tmpfn); #endif return NULL; } fclose(tmpfile); #ifdef WINVER _tfopen_s(&ifile, temp_save, _T("rb")); //this is not a leak, file gets closed // outside of this routine. #else ifile = fopen(temp_save,"rb"); //this is not a leak, file gets closed // outside of this routine. #endif if (!ifile) { return NULL; } compressed = TRUE; fread(string, 1, 8, ifile); } if (strncmp(DETECT_STR, string, 8) != 0){ if (compressed == TRUE) fclose(ifile); return NULL; } save = (SAVESTATE_t *) malloc(sizeof(SAVESTATE_t)); if (!save) { if (compressed == TRUE) fclose(ifile); return NULL; } chunk_offset = fgeti(ifile); save->version_major = fgeti(ifile); save->version_minor = fgeti(ifile); save->version_build = fgeti(ifile); if (save->version_major != CUR_MAJOR) { fclose(ifile); free(save); return NULL; } save->model = fgeti(ifile); chunk_count = fgeti(ifile); fread(save->author,1,32,ifile); fread(save->comment,1,64,ifile); fseek(ifile, chunk_offset + 8 + 4, SEEK_SET); for(i = 0; i < 512; i++) { save->chunks[i] = NULL; } save->chunk_count = 0; for(i = 0; i < chunk_count; i++) { string[0] = fgetc(ifile); string[1] = fgetc(ifile); string[2] = fgetc(ifile); string[3] = fgetc(ifile); string[4] = 0; chunk = NewChunk(save,string); chunk->size = fgeti(ifile); chunk->data = (unsigned char *) malloc(chunk->size); fread(chunk->data,1,chunk->size,ifile); } if (compressed == TRUE) { fclose(ifile); #ifdef _WINDOWS _tremove(temp_save); #else remove(temp_save); #endif } /* check for read errors... */ return save; }
void WriteSave(const char *fn, SAVESTATE_t* save, int compress) { int i; FILE* ofile; FILE* cfile; char temp_save[PATH_MAX]; if (!save) { return; } if (compress == 0) { ofile = fopen(fn, "wb"); } else { GetAppDataString(temp_save, PATH_MAX - 1 - strlen(tmpSuffix)); strcat(temp_save, tmpSuffix); mkstemp(temp_save); ofile = fopen(temp_save,"wb"); } if (!ofile) { return; } fputs(DETECT_STR, ofile); fputi(SAVE_HEADERSIZE, ofile); fputi(save->version_major, ofile); fputi(save->version_minor, ofile); fputi(save->version_build, ofile); fputi(save->model, ofile); fputi(save->chunk_count, ofile); fwrite(save->author, 1,32, ofile); fwrite(save->comment, 1, 64, ofile); for(i = 0; i < save->chunk_count; i++) { fputc(save->chunks[i]->tag[0], ofile); fputc(save->chunks[i]->tag[1], ofile); fputc(save->chunks[i]->tag[2], ofile); fputc(save->chunks[i]->tag[3], ofile); fputi(save->chunks[i]->size,ofile); fwrite(save->chunks[i]->data, 1, save->chunks[i]->size, ofile); } fclose(ofile); if (compress) { cfile = fopen(fn, "wb"); if (!cfile) { return; } ofile = fopen(temp_save,"rb"); if (!ofile) { return; } //int error; fputs(DETECT_CMP_STR, cfile); switch(compress) { #ifdef ZLIB_WINAPI case ZLIB_CMP: { fputc(ZLIB_CMP, cfile); int error = def(ofile, cfile, 9); break; } #endif default: break; } fclose(ofile); fclose(cfile); remove(temp_save); } }
void WriteSave(const TCHAR *fn, SAVESTATE_t* save, int compress) { int i; FILE* ofile; FILE* cfile; TCHAR tmpfn[L_tmpnam]; TCHAR temp_save[MAX_PATH]; if (!save) { _putts(_T("Save was null for write")); return; } if (compress == 0) { #ifdef WINVER _tfopen_s(&ofile, fn, _T("wb")); #else ofile = fopen(fn,"wb"); #endif } else { #ifdef WINVER _ttmpnam_s(tmpfn, sizeof(tmpfn)); GetAppDataString(temp_save, sizeof(temp_save)); StringCbCat(temp_save, sizeof(temp_save), tmpfn); _tfopen_s(&ofile, temp_save, _T("wb")); #else tmpnam(tmpfn); strcpy(temp_save, getenv("appdata")); strcat(temp_save, tmpfn); ofile = fopen(temp_save,"wb"); #endif } if (!ofile) { _putts(_T("Could not open save file for write")); return; } fputs(DETECT_STR, ofile); fputi(SAVE_HEADERSIZE, ofile); fputi(save->version_major, ofile); fputi(save->version_minor, ofile); fputi(save->version_build, ofile); fputi(save->model, ofile); fputi(save->chunk_count, ofile); fwrite(save->author, 1,32, ofile); fwrite(save->comment, 1, 64, ofile); for(i = 0; i < save->chunk_count; i++) { fputc(save->chunks[i]->tag[0], ofile); fputc(save->chunks[i]->tag[1], ofile); fputc(save->chunks[i]->tag[2], ofile); fputc(save->chunks[i]->tag[3], ofile); fputi(save->chunks[i]->size,ofile); fwrite(save->chunks[i]->data, 1, save->chunks[i]->size, ofile); } fclose(ofile); if (compress) { #ifdef WINVER _tfopen_s(&cfile, fn, _T("wb")); #else cfile = fopen(fn,"wb"); #endif if (!cfile) { return; } #ifdef WINVER _tfopen_s(&ofile, temp_save, _T("rb")); #else ofile = fopen(temp_save,"rb"); #endif if (!ofile) { return; } //int error; fputs(DETECT_CMP_STR, cfile); switch(compress) { #ifdef ZLIB_WINAPI case ZLIB_CMP: { fputc(ZLIB_CMP, cfile); int error = def(ofile, cfile, 9); break; } #endif default: break; } fclose(ofile); fclose(cfile); #ifdef _WINDOWS _tremove(temp_save); #else remove(temp_save); #endif } }