diff options
| author | Marcus Comstedt | 2002-02-02 23:27:06 +0000 |
|---|---|---|
| committer | Marcus Comstedt | 2002-02-02 23:27:06 +0000 |
| commit | 01c4ef997ca17705cfba205057adc9271ba52c66 (patch) | |
| tree | a357b094a2d1dc74ecdab03cf7104d3dedcd7581 | |
| parent | 141b489db97fbfaa4f63d49c21aa93e4888e57eb (diff) | |
| download | scummvm-rg350-01c4ef997ca17705cfba205057adc9271ba52c66.tar.gz scummvm-rg350-01c4ef997ca17705cfba205057adc9271ba52c66.tar.bz2 scummvm-rg350-01c4ef997ca17705cfba205057adc9271ba52c66.zip | |
Added support for non-FILE* based savegames.
svn-id: r3554
| -rw-r--r-- | saveload.cpp | 36 | ||||
| -rw-r--r-- | scumm.h | 28 |
2 files changed, 43 insertions, 21 deletions
diff --git a/saveload.cpp b/saveload.cpp index 7b3cbaedf2..ec365e0c77 100644 --- a/saveload.cpp +++ b/saveload.cpp @@ -34,14 +34,13 @@ struct SaveGameHeader { bool Scumm::saveState(int slot, bool compat) { char filename[256]; - FILE *out; + SerializerStream out; SaveGameHeader hdr; Serializer ser; makeSavegameName(filename, slot, compat); - out = fopen(filename,"wb"); - if (out==NULL) + if (!out.fopen(filename,"wb")) return false; memcpy(hdr.name, _saveLoadName, sizeof(hdr.name)); @@ -50,20 +49,20 @@ bool Scumm::saveState(int slot, bool compat) { hdr.size = 0; hdr.ver = CURRENT_VER; - fwrite(&hdr, sizeof(hdr), 1, out); + out.fwrite(&hdr, sizeof(hdr), 1); ser._saveLoadStream = out; ser._saveOrLoad = true; saveOrLoad(&ser); - fclose(out); + out.fclose(); debug(1,"State saved as '%s'", filename); return true; } bool Scumm::loadState(int slot, bool compat) { char filename[256]; - FILE *out; + SerializerStream out; int i,j; SaveGameHeader hdr; Serializer ser; @@ -71,21 +70,19 @@ bool Scumm::loadState(int slot, bool compat) { SoundEngine *se; makeSavegameName(filename, slot, compat); - out = fopen(filename,"rb"); - - if (out==NULL) + if (!out.fopen(filename,"rb")) return false; - fread(&hdr, sizeof(hdr), 1, out); + out.fread(&hdr, sizeof(hdr), 1); if (hdr.type != MKID('SCVM')) { warning("Invalid savegame '%s'", filename); - fclose(out); + out.fclose(); return false; } if (hdr.ver != CURRENT_VER) { warning("Invalid version of '%s'", filename); - fclose(out); + out.fclose(); return false; } @@ -111,7 +108,7 @@ bool Scumm::loadState(int slot, bool compat) { ser._saveLoadStream = out; ser._saveOrLoad = false; saveOrLoad(&ser); - fclose(out); + out.fclose(); sb = _screenB; sh = _screenH; @@ -154,19 +151,18 @@ void Scumm::makeSavegameName(char *out, int slot, bool compatible) { bool Scumm::getSavegameName(int slot, char *desc) { char filename[256]; - FILE *out; + SerializerStream out; SaveGameHeader hdr; bool result; int len; makeSavegameName(filename, slot, false); - out = fopen(filename,"rb"); - if (out==NULL) { + if (!out.fopen(filename,"rb")) { strcpy(desc,""); return false; } - len = fread(&hdr, sizeof(hdr), 1, out); - fclose(out); + len = out.fread(&hdr, sizeof(hdr), 1); + out.fclose(); if (len!=1 || hdr.type != MKID('SCVM')) { strcpy(desc, "Invalid savegame"); @@ -561,9 +557,9 @@ void Scumm::saveLoadResource(Serializer *ser, int type, int index) { void Serializer::saveLoadBytes(void *b, int len) { if (_saveOrLoad) - fwrite(b, 1, len, _saveLoadStream); + _saveLoadStream.fwrite(b, 1, len); else - fread(b, 1, len, _saveLoadStream); + _saveLoadStream.fread(b, 1, len); } void Serializer::saveUint32(uint32 d) { @@ -2146,8 +2146,34 @@ typedef int SerializerSaveReference(void *me, byte type, void *ref); typedef void *SerializerLoadReference(void *me, byte type, int ref); +struct SerializerStream { +#ifdef NONSTANDARD_SAVE + void *context; + + bool fopen(const char *filename, const char *mode); + void fclose(); + int fread(void *buf, int size, int cnt); + int fwrite(void *buf, int size, int cnt); +#else + FILE *out; + + FILE *fopen(const char *filename, const char *mode) { + return out = ::fopen(filename, mode); + } + void fclose() { + ::fclose(out); + } + int fread(void *buf, int size, int cnt) { + return ::fread(buf, size, cnt, out); + } + int fwrite(void *buf, int size, int cnt) { + return ::fwrite(buf, size, cnt, out); + } +#endif +}; + struct Serializer { - FILE *_saveLoadStream; + SerializerStream _saveLoadStream; union { SerializerSaveReference *_save_ref; |
