[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