[Scummvm-cvs-logs] SF.net SVN: scummvm: [29153] scummvm/trunk/backends/platform/dc/vmsave.cpp

marcus_c at users.sourceforge.net marcus_c at users.sourceforge.net
Thu Oct 4 00:04:37 CEST 2007


Revision: 29153
          http://scummvm.svn.sourceforge.net/scummvm/?rev=29153&view=rev
Author:   marcus_c
Date:     2007-10-03 15:04:36 -0700 (Wed, 03 Oct 2007)

Log Message:
-----------
* Added removeSavefile()
* New style listSavefiles() using a glob

Modified Paths:
--------------
    scummvm/trunk/backends/platform/dc/vmsave.cpp

Modified: scummvm/trunk/backends/platform/dc/vmsave.cpp
===================================================================
--- scummvm/trunk/backends/platform/dc/vmsave.cpp	2007-10-03 21:50:20 UTC (rev 29152)
+++ scummvm/trunk/backends/platform/dc/vmsave.cpp	2007-10-03 22:04:36 UTC (rev 29153)
@@ -156,13 +156,54 @@
   return false;
 }
 
-static void tryList(const char *prefix, bool *marks, int num, int vm)
+static bool tryDelete(const char *filename, int vm)
 {
   struct vmsinfo info;
   struct superblock super;
+
+  if (!vmsfs_check_unit(vm, 0, &info))
+    return false;
+  if (!vmsfs_get_superblock(&info, &super))
+    return false;
+
+#if 0
+  // FIXME: implement this function in vmsfs...
+  if (!vmsfs_delete_file(&super, filename))
+    return false;
+#else
+  return false;
+#endif
+
+  return true;
+}
+
+static bool matches(const char *glob, const char *name)
+{
+  while(*glob)
+    if(*glob == '*') {
+      while(*glob == '*')
+	glob++;
+      do {
+	if((*name == *glob || *glob == '?') &&
+	   matches(glob, name))
+	  return true;
+      } while(*name++);
+      return false;
+    } else if(!*name)
+      return false;
+    else if(*glob == '?' || *glob == *name) {
+      glob++;
+      name++;
+    }
+  return !*name;
+}
+
+static void tryList(const char *glob, int vm, Common::StringList &list)
+{
+  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;
@@ -171,15 +212,11 @@
   vmsfs_open_dir(&super, &iter);
   while (vmsfs_next_dir_entry(&iter, &de))
     if (de.entry[0]) {
-      char buf[16], *endp = NULL;
+      char buf[16];
       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;
+      if (matches(glob, buf))
+	list.push_back(buf);
     }
 }
 
@@ -217,7 +254,22 @@
   return false;
 }
 
+bool deleteSaveGame(const char *filename)
+{
+  if (lastvm >= 0 &&
+     tryDelete(filename, lastvm))
+    return true;
 
+  for (int i=0; i<24; i++)
+    if (tryDelete(filename, i)) {
+      lastvm = i;
+      return true;
+    }
+
+  return false;
+}
+
+
 class InVMSave : public Common::InSaveFile {
 private:
   char *buffer;
@@ -302,7 +354,11 @@
 	}
   }
 
-  virtual void listSavefiles(const char *prefix, bool *marks, int num);
+  virtual bool removeSavefile(const char *filename) {
+	return ::deleteSaveGame(filename);
+  }
+
+  virtual Common::StringList VMSaveManager::listSavefiles(const char *glob);
 };
 
 void OutVMSave::finalize()
@@ -394,12 +450,14 @@
 }
 
 
-void VMSaveManager::listSavefiles(const char *prefix, bool *marks, int num)
+Common::StringList VMSaveManager::listSavefiles(const char *glob)
 {
-  memset(marks, false, num*sizeof(bool));
+  Common::StringList list;
 
   for (int i=0; i<24; i++)
-    tryList(prefix, marks, num, i);
+    tryList(glob, i, list);
+
+  return list;
 }
 
 Common::SaveFileManager *OSystem_Dreamcast::createSavefileManager()


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list