aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorMarcus Comstedt2003-08-10 20:49:13 +0000
committerMarcus Comstedt2003-08-10 20:49:13 +0000
commita5aa5c0d73fa3c9faec0ba167cb88d3595f089e5 (patch)
tree252958493844e9bf628dcaeb84a9e658557af648 /common
parent9d09512765bcca0a507361297aa70c8f122ce512 (diff)
downloadscummvm-rg350-a5aa5c0d73fa3c9faec0ba167cb88d3595f089e5.tar.gz
scummvm-rg350-a5aa5c0d73fa3c9faec0ba167cb88d3595f089e5.tar.bz2
scummvm-rg350-a5aa5c0d73fa3c9faec0ba167cb88d3595f089e5.zip
Harmonized SaveFile API with File API a bit.
svn-id: r9626
Diffstat (limited to 'common')
-rw-r--r--common/module.mk3
-rw-r--r--common/savefile.cpp131
-rw-r--r--common/savefile.h42
3 files changed, 162 insertions, 14 deletions
diff --git a/common/module.mk b/common/module.mk
index 56092b637c..e0e898335f 100644
--- a/common/module.mk
+++ b/common/module.mk
@@ -8,7 +8,8 @@ MODULE_OBJS = \
common/scaler.o \
common/str.o \
common/timer.o \
- common/util.o
+ common/util.o \
+ common/savefile.o
# Include common rules
include common.rules
diff --git a/common/savefile.cpp b/common/savefile.cpp
new file mode 100644
index 0000000000..7d99f0e5d3
--- /dev/null
+++ b/common/savefile.cpp
@@ -0,0 +1,131 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "common/savefile.h"
+#include "common/util.h"
+#include "common/engine.h" // For debug/warning/error
+
+uint32 SaveFile::read(void *ptr, uint32 size)
+{
+ return fread(ptr, 1, size);
+}
+
+byte SaveFile::readByte()
+{
+ byte b;
+ if (fread(&b, 1, 1) != 1)
+ return 0;
+ return b;
+}
+
+uint16 SaveFile::readUint16LE() {
+ uint16 a = readByte();
+ uint16 b = readByte();
+ return a | (b << 8);
+}
+
+uint32 SaveFile::readUint32LE() {
+ uint32 a = readUint16LE();
+ uint32 b = readUint16LE();
+ return (b << 16) | a;
+}
+
+uint16 SaveFile::readUint16BE() {
+ uint16 b = readByte();
+ uint16 a = readByte();
+ return a | (b << 8);
+}
+
+uint32 SaveFile::readUint32BE() {
+ uint32 b = readUint16BE();
+ uint32 a = readUint16BE();
+ return (b << 16) | a;
+}
+
+uint32 SaveFile::write(const void *ptr, uint32 size)
+{
+ return fwrite(ptr, 1, size);
+}
+
+void SaveFile::writeByte(byte value)
+{
+ fwrite(&value, 1, 1);
+}
+
+void SaveFile::writeUint16LE(uint16 value) {
+ writeByte((byte)(value & 0xff));
+ writeByte((byte)(value >> 8));
+}
+
+void SaveFile::writeUint32LE(uint32 value) {
+ writeUint16LE((uint16)(value & 0xffff));
+ writeUint16LE((uint16)(value >> 16));
+}
+
+void SaveFile::writeUint16BE(uint16 value) {
+ writeByte((byte)(value >> 8));
+ writeByte((byte)(value & 0xff));
+}
+
+void SaveFile::writeUint32BE(uint32 value) {
+ writeUint16BE((uint16)(value >> 16));
+ writeUint16BE((uint16)(value & 0xffff));
+}
+
+SaveFile *SaveFileManager::open_savefile(const char *filename, const char *directory, bool saveOrLoad)
+{
+ char buf[256];
+ join_paths(filename, directory, buf, sizeof(buf));
+ StdioSaveFile *sf = new StdioSaveFile(buf,
+ (saveOrLoad? "wb":"rb"));
+ if (!sf->is_open()) {
+ delete sf;
+ sf = NULL;
+ }
+ return sf;
+}
+
+void SaveFileManager::join_paths(const char *filename, const char *directory,
+ char *buf, int bufsize)
+{
+ buf[bufsize-1] = '\0';
+ strncpy(buf, directory, bufsize-1);
+
+#ifdef WIN32
+ // Fix for Win98 issue related with game directory pointing to root drive ex. "c:\"
+ if ((buf[0] != 0) && (buf[1] == ':') && (buf[2] == '\\') && (buf[3] == 0)) {
+ buf[2] = 0;
+ }
+#endif
+
+ const int dirLen = strlen(buf);
+
+ if (dirLen > 0) {
+#ifdef __MORPHOS__
+ if (buf[dirLen-1] != ':' && buf[dirLen-1] != '/')
+#endif
+
+#if !defined(__GP32__) && !defined(__PALM_OS__)
+ strncat(buf, "/", bufsize-1); // prevent double /
+#endif
+ }
+ strncat(buf, filename, bufsize-1);
+}
diff --git a/common/savefile.h b/common/savefile.h
index 3f8afb5a8c..31271c656d 100644
--- a/common/savefile.h
+++ b/common/savefile.h
@@ -23,14 +23,34 @@
#ifndef COMMON_SAVEFILE_H
#define COMMON_SAVEFILE_H
+#include "stdafx.h"
+#include "common/scummsys.h"
+
#include <stdio.h>
#include <string.h>
class SaveFile {
public:
virtual ~SaveFile() {}
+
+ /* Compatible with File API */
+ uint32 read(void *ptr, uint32 size);
+ byte readByte();
+ uint16 readUint16LE();
+ uint32 readUint32LE();
+ uint16 readUint16BE();
+ uint32 readUint32BE();
+ uint32 write(const void *ptr, uint32 size);
+ void writeByte(byte value);
+ void writeUint16LE(uint16 value);
+ void writeUint32LE(uint32 value);
+ void writeUint16BE(uint16 value);
+ void writeUint32BE(uint32 value);
+
+protected:
+ /* Only for internal use, use File compatible API above instead */
virtual int fread(void *buf, int size, int cnt) = 0;
- virtual int fwrite(void *buf, int size, int cnt) = 0;
+ virtual int fwrite(const void *buf, int size, int cnt) = 0;
};
class StdioSaveFile : public SaveFile {
@@ -45,10 +65,10 @@ public:
bool is_open() { return fh != NULL; }
-
+protected:
int fread(void *buf, int size, int cnt)
{ return ::fread(buf, size, cnt, fh); }
- int fwrite(void *buf, int size, int cnt)
+ int fwrite(const void *buf, int size, int cnt)
{ return ::fwrite(buf, size, cnt, fh); }
};
@@ -57,20 +77,16 @@ class SaveFileManager {
public:
virtual ~SaveFileManager() {}
- virtual SaveFile *open_savefile(const char *filename, bool saveOrLoad) {
- StdioSaveFile *sf = new StdioSaveFile(filename,
- (saveOrLoad? "wb":"rb"));
- if (!sf->is_open()) {
- delete sf;
- sf = NULL;
- }
- return sf;
- }
+ virtual SaveFile *open_savefile(const char *filename, const char *directory, bool saveOrLoad);
- virtual void list_savefiles(const char * /* prefix */, bool *marks, int num) {
+ virtual void list_savefiles(const char * /* prefix */, const char *directory, bool *marks, int num) {
memset(marks, true, num * sizeof(bool));
}
+protected:
+ void join_paths(const char *filename, const char *directory,
+ char *buf, int bufsize);
+
};
#endif