[Scummvm-cvs-logs] SF.net SVN: scummvm:[49469] scummvm/trunk/engines/sci/engine/kfile.cpp

waltervn at users.sourceforge.net waltervn at users.sourceforge.net
Mon Jun 7 04:11:01 CEST 2010


Revision: 49469
          http://scummvm.svn.sourceforge.net/scummvm/?rev=49469&view=rev
Author:   waltervn
Date:     2010-06-07 02:11:01 +0000 (Mon, 07 Jun 2010)

Log Message:
-----------
SCI: Adjust kGetSaveFiles for SCI32.

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kfile.cpp

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2010-06-07 01:43:35 UTC (rev 49468)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2010-06-07 02:11:01 UTC (rev 49469)
@@ -460,29 +460,37 @@
 
 reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) {
 	Common::String game_id = s->_segMan->getString(argv[0]);
-	reg_t nametarget = argv[1];
-	reg_t *slot = s->_segMan->derefRegPtr(argv[2], 0);
 
 	debug(3, "kGetSaveFiles(%s)", game_id.c_str());
 
 	Common::Array<SavegameDesc> saves;
 	listSavegames(saves);
 
-	s->r_acc = NULL_REG;
+	uint totalSaves = MIN<uint>(saves.size(), MAX_SAVEGAME_NR);
 
-	for (uint i = 0; i < MIN<uint>(saves.size(), MAX_SAVEGAME_NR); i++) {
-		*slot++ = s->r_acc; // Store savegame ID
-		++s->r_acc.offset; // Increase number of files found
+	reg_t *slot = s->_segMan->derefRegPtr(argv[2], totalSaves);
 
-		s->_segMan->strcpy(nametarget, saves[i].name);
+	if (!slot) {
+		warning("kGetSaveFiles: %04X:%04X invalid or too small to hold slot data", PRINT_REG(argv[2]));
+		totalSaves = 0;
+	}
 
-		// Increase name offset pointer accordingly
-		nametarget.offset += SCI_MAX_SAVENAME_LENGTH;
+	const uint bufSize = (totalSaves * SCI_MAX_SAVENAME_LENGTH) + 1;
+	char *saveNames = new char[bufSize];
+	char *saveNamePtr = saveNames;
+
+	for (uint i = 0; i < totalSaves; i++) {
+		*slot++ = make_reg(0, i); // Store slot
+		strcpy(saveNamePtr, saves[i].name);
+		saveNamePtr += SCI_MAX_SAVENAME_LENGTH;
 	}
 
-	s->_segMan->strcpy(nametarget, ""); // Terminate list
+	*saveNamePtr = 0; // Terminate list
 
-	return s->r_acc;
+	s->_segMan->memcpy(argv[1], (byte *)saveNames, bufSize);
+	delete[] saveNames;
+
+	return make_reg(0, totalSaves);
 }
 
 reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) {


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