aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/kstring.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/kstring.cpp')
-rw-r--r--engines/sci/engine/kstring.cpp44
1 files changed, 39 insertions, 5 deletions
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp
index b1bd5dbb65..0de81724b4 100644
--- a/engines/sci/engine/kstring.cpp
+++ b/engines/sci/engine/kstring.cpp
@@ -749,16 +749,47 @@ reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
switch (UKPV(0)) {
case 0 :
+ if (state.getMessage(&tuple)) {
+ char *buffer = NULL;
+
+ if ((argc == 7) && (argv[6] != NULL_REG))
+ buffer = kernel_dereference_char_pointer(s, argv[6], state.getLength() + 1);
+
+ int talker = state.getTalker();
+
+ if (buffer)
+ state.getText(buffer);
+ // Talker id
+ return make_reg(0, talker);
+ } else {
+ char *buffer = NULL;
+
+ if ((argc == 7) && (argv[6] != NULL_REG))
+ buffer = kernel_dereference_char_pointer(s, argv[6], strlen(DUMMY_MESSAGE) + 1);
+
+ if (buffer)
+ strcpy(buffer, DUMMY_MESSAGE);
+
+ return NULL_REG;
+ }
case 1 :
- if (UKPV(0) == 0 ? state.getMessage(&tuple) : state.getNext()) {
- char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], state.getLength() + 1) : NULL;
+ if (state.getNext()) {
+ char *buffer = NULL;
+
+ if ((argc == 2) && (argv[1] != NULL_REG))
+ buffer = kernel_dereference_char_pointer(s, argv[1], state.getLength() + 1);
+
+ int talker = state.getTalker();
if (buffer)
state.getText(buffer);
// Talker id
- return make_reg(0, state.getTalker());
+ return make_reg(0, talker);
} else {
- char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
+ char *buffer = NULL;
+
+ if ((argc == 2) && (argv[1] != NULL_REG))
+ buffer = kernel_dereference_char_pointer(s, argv[1], strlen(DUMMY_MESSAGE) + 1);
if (buffer)
strcpy(buffer, DUMMY_MESSAGE);
@@ -768,7 +799,10 @@ reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
case 2:
if (state.getMessage(&tuple))
return make_reg(0, state.getLength() + 1);
- else return NULL_REG;
+ else
+ return NULL_REG;
+ default:
+ warning("kMessage subfunction %i invoked (not implemented)", UKPV(0));
}
return NULL_REG;