aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Comstedt2002-02-02 23:27:06 +0000
committerMarcus Comstedt2002-02-02 23:27:06 +0000
commit01c4ef997ca17705cfba205057adc9271ba52c66 (patch)
treea357b094a2d1dc74ecdab03cf7104d3dedcd7581
parent141b489db97fbfaa4f63d49c21aa93e4888e57eb (diff)
downloadscummvm-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.cpp36
-rw-r--r--scumm.h28
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) {
diff --git a/scumm.h b/scumm.h
index 3e8fb0a625..1d32fedf78 100644
--- a/scumm.h
+++ b/scumm.h
@@ -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;