aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2010-01-30 01:45:59 +0000
committerFilippos Karapetis2010-01-30 01:45:59 +0000
commit928b4a6df6cc24c57ce899c431a5d98da4325af8 (patch)
tree0205b2d0ea7b49158ebb1e356f3b60b850c29fb9
parent42ec4e37801b7724380437033c86180e79b9a67a (diff)
downloadscummvm-rg350-928b4a6df6cc24c57ce899c431a5d98da4325af8.tar.gz
scummvm-rg350-928b4a6df6cc24c57ce899c431a5d98da4325af8.tar.bz2
scummvm-rg350-928b4a6df6cc24c57ce899c431a5d98da4325af8.zip
Added support for String types to kFormat (seems to work but needs testing...)
svn-id: r47694
-rw-r--r--engines/sci/engine/kernel32.cpp10
-rw-r--r--engines/sci/engine/kstring.cpp6
2 files changed, 7 insertions, 9 deletions
diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp
index 6a112af0a3..1a63eceba9 100644
--- a/engines/sci/engine/kernel32.cpp
+++ b/engines/sci/engine/kernel32.cpp
@@ -617,15 +617,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) {
warning("kString(Printf)");
break;
case 12: // Printf Buf
- if (argc == 3)
- return kFormat(s, argc - 1, argv + 1);
- else
- // TODO
- // For some reason, argc > 3 crashes, e.g. in Torin full (there's a format
- // string %s%s, but the string passed for the first %s is invalid). Perhaps
- // a list is passed in this case?
- warning("kString(PrintBuf) - parameter count %d not supported", argc);
- break;
+ return kFormat(s, argc - 1, argv + 1);
case 13: { // atoi
Common::String string = s->_segMan->getString(argv[1]);
return make_reg(0, (uint16)atoi(string.c_str()));
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp
index 769964e914..89d1d0da56 100644
--- a/engines/sci/engine/kstring.cpp
+++ b/engines/sci/engine/kstring.cpp
@@ -28,6 +28,7 @@
#include "sci/resource.h"
#include "sci/engine/state.h"
#include "sci/engine/message.h"
+#include "sci/engine/selector.h"
#include "sci/engine/kernel.h"
namespace Sci {
@@ -270,6 +271,11 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
switch (xfer) {
case 's': { /* Copy string */
reg_t reg = argv[startarg + paramindex];
+ if (s->_segMan->isObject(reg)) {
+ Selector slc = s->_kernel->findSelector("data"); // TODO: place in selector table
+ reg = read_selector(s->_segMan, reg, slc);
+ }
+
Common::String tempsource = (reg == NULL_REG) ? "" : kernel_lookup_text(s, reg,
arguments[paramindex + 1]);
int slen = strlen(tempsource.c_str());