aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/saveload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/saveload.cpp')
-rw-r--r--engines/gob/saveload.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/engines/gob/saveload.cpp b/engines/gob/saveload.cpp
index 50f41db47e..2788716858 100644
--- a/engines/gob/saveload.cpp
+++ b/engines/gob/saveload.cpp
@@ -160,6 +160,60 @@ PlainSave::~PlainSave() {
}
bool PlainSave::save(int16 dataVar, int32 size, int32 offset, const char *name,
+ const Variables *variables) {
+
+ if ((size <= 0) || (offset != 0)) {
+ warning("Invalid size (%d) or offset (%d)", size, offset);
+ return false;
+ }
+
+ byte *vars = new byte[size];
+ byte *varSizes = new byte[size];
+
+ if (!variables->copyTo(dataVar, vars, varSizes, size)) {
+ delete[] vars;
+ delete[] varSizes;
+ warning("dataVar (%d) or size (%d) out of range", dataVar, size);
+ return false;
+ }
+
+ bool result = save(0, size, offset, name, vars, varSizes);
+
+ delete[] vars;
+ delete[] varSizes;
+
+ return result;
+}
+
+bool PlainSave::load(int16 dataVar, int32 size, int32 offset, const char *name,
+ Variables *variables) {
+
+ if ((size <= 0) || (offset != 0)) {
+ warning("Invalid size (%d) or offset (%d)", size, offset);
+ return false;
+ }
+
+ byte *vars = new byte[size];
+ byte *varSizes = new byte[size];
+
+ bool result = load(0, size, offset, name, vars, varSizes);
+
+ if (result && variables) {
+ if (!variables->copyFrom(dataVar, vars, varSizes, size)) {
+ delete[] vars;
+ delete[] varSizes;
+ warning("dataVar (%d) or size (%d) out of range", dataVar, size);
+ return false;
+ }
+ }
+
+ delete[] vars;
+ delete[] varSizes;
+
+ return result;
+}
+
+bool PlainSave::save(int16 dataVar, int32 size, int32 offset, const char *name,
const byte *variables, const byte *variableSizes) const {
if ((size <= 0) || (offset != 0)) {
@@ -286,6 +340,64 @@ void StagedSave::assertMode(Mode mode, const char *name) {
}
bool StagedSave::save(int16 dataVar, int32 size, int32 offset, const char *name,
+ const Variables *variables) {
+
+ if ((dataVar < 0) || (size <= 0) || (offset < 0)) {
+ warning("Invalid dataVar (%d), size (%d) or offset (%d)", dataVar, size, offset);
+ return false;
+ }
+
+ byte *vars = 0, *varSizes = 0;
+
+ if (variables) {
+ vars = new byte[size];
+ varSizes = new byte[size];
+
+ if (!variables->copyTo(dataVar, vars, varSizes, size)) {
+ delete[] vars;
+ delete[] varSizes;
+ warning("dataVar (%d) or size (%d) out of range", dataVar, size);
+ return false;
+ }
+ }
+
+ bool result = save(0, size, offset, name, vars, varSizes);
+
+ delete[] vars;
+ delete[] varSizes;
+
+ return result;
+}
+
+bool StagedSave::load(int16 dataVar, int32 size, int32 offset, const char *name,
+ Variables *variables) {
+
+ if ((dataVar < 0) || (size <= 0) || (offset < 0)) {
+ warning("Invalid dataVar (%d), size (%d) or offset (%d)", dataVar, size, offset);
+ return false;
+ }
+
+ byte *vars = new byte[size];
+ byte *varSizes = new byte[size];
+
+ bool result = load(0, size, offset, name, vars, varSizes);
+
+ if (result && variables) {
+ if (!variables->copyFrom(dataVar, vars, varSizes, size)) {
+ delete[] vars;
+ delete[] varSizes;
+ warning("dataVar (%d) or size (%d) out of range", dataVar, size);
+ return false;
+ }
+ }
+
+ delete[] vars;
+ delete[] varSizes;
+
+ return result;
+}
+
+bool StagedSave::save(int16 dataVar, int32 size, int32 offset, const char *name,
const byte *variables, const byte *variableSizes) {
if ((dataVar < 0) || (size <= 0) || (offset < 0)) {