[Scummvm-cvs-logs] CVS: scummvm/backends/dc Makefile,1.5,1.6 dc.h,1.5,1.6 vmsave.cpp,1.5,1.6

Marcus Comstedt marcus_c at users.sourceforge.net
Mon Dec 16 17:16:06 CET 2002


Update of /cvsroot/scummvm/scummvm/backends/dc
In directory sc8-pr-cvs1:/tmp/cvs-serv32726/backends/dc

Modified Files:
	Makefile dc.h vmsave.cpp 
Log Message:
New savefile backend system (bye bye NONSTANDARD_SAVE...)

Index: Makefile
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/dc/Makefile,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- Makefile	9 Dec 2002 13:38:01 -0000	1.5
+++ Makefile	17 Dec 2002 01:15:12 -0000	1.6
@@ -6,7 +6,7 @@
 
 CXX     = sh-elf-g++ -ml -m4-single-only
 CXXFLAGS= -O1 -Wno-multichar
-DEFINES = -D__DC__ -DNONSTANDARD_PORT -DNONSTANDARD_SAVE
+DEFINES = -D__DC__ -DNONSTANDARD_PORT
 LDFLAGS := -Wl,-Ttext,0x8c010000 -nostartfiles ronin/crt0.o
 INCLUDES:= -I./ -I../.. -I../../common
 CPPFLAGS= $(DEFINES) $(INCLUDES)

Index: dc.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/dc/dc.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- dc.h	18 Oct 2002 20:59:03 -0000	1.5
+++ dc.h	17 Dec 2002 01:15:12 -0000	1.6
@@ -84,6 +84,9 @@
   virtual void unlock_mutex(void *mutex);
   virtual void delete_mutex(void *mutex);
 
+  // Savefile handling
+  virtual SaveFileManager *get_savefile_manager();
+
 
   static OSystem *create();
 

Index: vmsave.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/dc/vmsave.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- vmsave.cpp	6 Dec 2002 01:30:57 -0000	1.5
+++ vmsave.cpp	17 Dec 2002 01:15:12 -0000	1.6
@@ -155,6 +155,33 @@
   return false;
 }
 
+static void tryList(const char *prefix, bool *marks, int num, int vm)
+{
+  struct vmsinfo info;
+  struct superblock super;
+  struct dir_iterator iter;
+  struct dir_entry de;
+  int pl = strlen(prefix);
+
+  if(!vmsfs_check_unit(vm, 0, &info))
+    return;
+  if(!vmsfs_get_superblock(&info, &super))
+    return;
+  vmsfs_open_dir(&super, &iter);
+  while(vmsfs_next_dir_entry(&iter, &de))
+    if(de.entry[0]) {
+      char buf[16], *endp = NULL;
+      strncpy(buf, (char *)de.entry+4, 12);
+      buf[12] = 0;
+      int l = strlen(buf);
+      long i = 42;
+      if(l > pl && !strncmp(buf, prefix, pl) &&
+	 (i = strtol(buf+pl, &endp, 10))>=0 && i<num &&
+	 (endp - buf) == l)
+	marks[i] = true;
+    }
+}
+
 vmsaveResult writeSaveGame(const char *gamename, const char *data, int size,
 			   const char *filename, class Icon &icon)
 {
@@ -190,104 +217,130 @@
 }
 
 
-struct vmStreamContext {
+class VMSave : public SaveFile {
+private:
   bool issave;
   char *buffer;
   int pos, size;
   char filename[16];
-};
 
-bool SerializerStream::fopen(const char *filename, const char *mode)
-{
-  vmStreamContext *c = new vmStreamContext;
-  context = c;
-  if(strchr(mode, 'w')) {
-    c->issave = true;
-    strncpy(c->filename, filename, 16);
-    c->pos = 0;
-    c->buffer = new char[c->size = MAX_SAVE_SIZE];
-    return true;
-  } else if(readSaveGame(c->buffer, c->size, filename)) {
-    if(c->size > 0 && c->buffer[0] != 'S') {
+public:
+  VMSave(const char *_filename, bool _saveOrLoad) 
+    : issave(_saveOrLoad), pos(0), buffer(NULL)
+  {
+    strncpy(filename, _filename, 16);
+    if(issave)
+      buffer = new char[size = MAX_SAVE_SIZE];
+  }
+
+  ~VMSave();
+
+  virtual int fread(void *buf, int size, int cnt);
+  virtual int fwrite(void *buf, int size, int cnt);
+
+  bool readSaveGame()
+  { return ::readSaveGame(buffer, size, filename); }
+
+  void tryUncompress()
+  {
+    if(size > 0 && buffer[0] != 'S') {
       // Data does not start with "SCVM".  Maybe compressed?
       char *expbuf = new char[MAX_SAVE_SIZE];
       unsigned long destlen = MAX_SAVE_SIZE;
-      if(!uncompress((Bytef*)expbuf, &destlen, (Bytef*)c->buffer, c->size)) {
-	delete(c->buffer);
-	c->buffer = expbuf;
-	c->size = destlen;
+      if(!uncompress((Bytef*)expbuf, &destlen, (Bytef*)buffer, size)) {
+	delete(buffer);
+	buffer = expbuf;
+	size = destlen;
       } else delete expbuf;
     }
-    c->issave = false;
-    c->pos = 0;
-    return true;
+  }
+};
+
+class VMSaveManager : public SaveFileManager {
+  virtual SaveFile *open_savefile(const char *filename, bool saveOrLoad);
+  virtual void list_savefiles(const char *prefix, bool *marks, int num);
+};
+
+SaveFile *VMSaveManager::open_savefile(const char *filename,
+				       bool saveOrLoad)
+{
+  VMSave *s = new VMSave(filename, saveOrLoad);
+  if(saveOrLoad)
+    return s;
+  else if(s->readSaveGame()) {
+    s->tryUncompress();
+    return s;
   } else {
-    delete c;
-    context = NULL;
-    return false;
+    delete s;
+    return NULL;
   }
 }
 
-void SerializerStream::fclose()
+VMSave::~VMSave()
 {
   extern const char *gGameName;
   extern Icon icon;
 
-  if(context) {
-    vmStreamContext *c = (vmStreamContext *)context;
-    if(c->issave) {
-      if(c->pos) {
-	// Try compression
-	char *compbuf = new char[c->pos];
-	unsigned long destlen = c->pos;
-	if(!compress((Bytef*)compbuf, &destlen, (Bytef*)c->buffer, c->pos)) {
-	  delete c->buffer;
-	  c->buffer = compbuf;
-	  c->pos = destlen;
-	} else delete compbuf;
-      }
-      displaySaveResult(writeSaveGame(gGameName, c->buffer,
-				      c->pos, c->filename, icon));
+  if(issave) {
+    if(pos) {
+      // Try compression
+      char *compbuf = new char[pos];
+      unsigned long destlen = pos;
+      if(!compress((Bytef*)compbuf, &destlen, (Bytef*)buffer, pos)) {
+	delete buffer;
+	buffer = compbuf;
+	pos = destlen;
+      } else delete compbuf;
     }
-    delete c->buffer;
-    delete c;
-    context = NULL;
+    displaySaveResult(writeSaveGame(gGameName, buffer,
+				    pos, filename, icon));
   }
+  delete buffer;
 }
 
-int SerializerStream::fread(void *buf, int size, int cnt)
+int VMSave::fread(void *buf, int sz, int cnt)
 {
-  vmStreamContext *c = (vmStreamContext *)context;
-
-  if (!c || c->issave)
+  if (issave)
     return -1; 
 
-  int nbyt = size*cnt;
-  if (c->pos + nbyt > c->size) {
-    cnt = (c->size - c->pos)/size;
-    nbyt = size*cnt;
+  int nbyt = sz*cnt;
+  if (pos + nbyt > size) {
+    cnt = (size - pos)/sz;
+    nbyt = sz*cnt;
   }
   if (nbyt)
-    memcpy(buf, c->buffer + c->pos, nbyt);
-  c->pos += nbyt;
+    memcpy(buf, buffer + pos, nbyt);
+  pos += nbyt;
   return cnt;
 }
 
-int SerializerStream::fwrite(void *buf, int size, int cnt)
+int VMSave::fwrite(void *buf, int sz, int cnt)
 {
-  vmStreamContext *c = (vmStreamContext *)context;
-
-  if (!c || !c->issave)
+  if (!issave)
     return -1;
 
-  int nbyt = size*cnt;
-  if (c->pos + nbyt > c->size) {
-    cnt = (c->size - c->pos)/size;
-    nbyt = size*cnt;
+  int nbyt = sz*cnt;
+  if (pos + nbyt > size) {
+    cnt = (size - pos)/sz;
+    nbyt = sz*cnt;
   }
   if (nbyt)
-    memcpy(c->buffer + c->pos, buf, nbyt);
-  c->pos += nbyt;
+    memcpy(buffer + pos, buf, nbyt);
+  pos += nbyt;
   return cnt;
 }
 
+
+void VMSaveManager::list_savefiles(const char *prefix,
+				   bool *marks, int num)
+{
+  memset(marks, false, num*sizeof(bool));
+  
+  for(int i=0; i<24; i++)
+    tryList(prefix, marks, num, i);
+}
+
+SaveFileManager *OSystem_Dreamcast::get_savefile_manager()
+{
+  return new VMSaveManager();
+}





More information about the Scummvm-git-logs mailing list