[Scummvm-cvs-logs] SF.net SVN: scummvm:[40421] scummvm/trunk/engines/sci/engine
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Sun May 10 15:47:38 CEST 2009
Revision: 40421
http://scummvm.svn.sourceforge.net/scummvm/?rev=40421&view=rev
Author: thebluegr
Date: 2009-05-10 13:47:38 +0000 (Sun, 10 May 2009)
Log Message:
-----------
Applied patch by waltervn to remove the length parameter from getText() and fixed a silly bug in getLength()
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/kstring.cpp
scummvm/trunk/engines/sci/engine/message.cpp
scummvm/trunk/engines/sci/engine/message.h
Modified: scummvm/trunk/engines/sci/engine/kstring.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kstring.cpp 2009-05-10 13:40:28 UTC (rev 40420)
+++ scummvm/trunk/engines/sci/engine/kstring.cpp 2009-05-10 13:47:38 UTC (rev 40421)
@@ -727,56 +727,49 @@
static MessageState state;
reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+ MessageTuple tuple;
+
if (!state.isInitialized())
message_state_initialize(s->resmgr, &state);
switch (UKPV(0)) {
- case 0 : {
- char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
- MessageTuple tuple;
- int module = UKPV(1);
+ case 0:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ if (!state.loadRes(UKPV(1)))
+ return NULL_REG;
tuple.noun = UKPV(2);
tuple.verb = UKPV(3);
tuple.cond = UKPV(4);
tuple.seq = UKPV(5);
+ }
- if (state.loadRes(module) && state.getSpecific(&tuple)) {
+ switch (UKPV(0)) {
+ case 0 :
+ case 1 :
+ if (UKPV(0) == 0 ? state.getSpecific(&tuple) : state.getNext()) {
+ char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], state.getLength() + 1) : NULL;
+
if (buffer)
- state.getText(buffer, 100);
+ state.getText(buffer);
// Talker id
return make_reg(0, state.getTalker());
} else {
- if (buffer) strcpy(buffer, DUMMY_MESSAGE);
- return NULL_REG;
- }
- }
- case 1 : {
- char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
+ char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
- if (state.getNext()) {
if (buffer)
- state.getText(buffer, 100);
- // Talker id
- return make_reg(0, state.getTalker());
- } else {
- if (buffer) strcpy(buffer, DUMMY_MESSAGE);
+ strcpy(buffer, DUMMY_MESSAGE);
+
return NULL_REG;
}
- }
- case 2 : {
- MessageTuple tuple;
- int module = UKPV(1);
- tuple.noun = UKPV(2);
- tuple.verb = UKPV(3);
- tuple.cond = UKPV(4);
- tuple.seq = UKPV(5);
-
- if (state.loadRes(module) && state.getSpecific(&tuple))
+ case 2:
+ if (state.getSpecific(&tuple))
return make_reg(0, state.getLength() + 1);
else return NULL_REG;
}
- }
return NULL_REG;
}
@@ -785,8 +778,6 @@
if (!state.isInitialized())
message_state_initialize(s->resmgr, &state);
- char *buffer = kernel_dereference_char_pointer(s, argv[3], 0);
-
MessageTuple tuple;
tuple.noun = UKPV(0);
int module = UKPV(1);
@@ -794,12 +785,17 @@
tuple.cond = 0;
tuple.seq = 0;
- if (buffer && state.loadRes(module) && state.getSpecific(&tuple)) {
- state.getText(buffer, 255);
- return argv[3];
- } else {
- return NULL_REG;
+ if (state.loadRes(module) && state.getSpecific(&tuple)) {
+ int len = state.getLength();
+ char *buffer = kernel_dereference_char_pointer(s, argv[3], len + 1);
+
+ if (buffer) {
+ state.getText(buffer);
+ return argv[3];
+ }
}
+
+ return NULL_REG;
}
} // End of namespace Sci
Modified: scummvm/trunk/engines/sci/engine/message.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/message.cpp 2009-05-10 13:40:28 UTC (rev 40420)
+++ scummvm/trunk/engines/sci/engine/message.cpp 2009-05-10 13:47:38 UTC (rev 40421)
@@ -93,22 +93,16 @@
return *(_engineCursor.index_record + 4);
}
-int MessageState::getText(char *buffer, int length) {
- int offset;
- if (_version == 2101)
- offset = READ_LE_UINT16(_engineCursor.index_record + 2);
- else
- offset = READ_LE_UINT16(_engineCursor.index_record + 5);
-
+void MessageState::getText(char *buffer) {
+ int offset = READ_LE_UINT16(_engineCursor.index_record + ((_version == 2101) ? 2 : 5));
char *stringptr = (char *)_engineCursor.resource_beginning + offset;
- strncpy(buffer, stringptr, length);
-
- return strlen(buffer);
+ strcpy(buffer, stringptr);
}
int MessageState::getLength() {
- char buffer[500];
- return getText(buffer, sizeof(buffer));
+ int offset = READ_LE_UINT16(_engineCursor.index_record + ((_version == 2101) ? 2 : 5));
+ char *stringptr = (char *)_engineCursor.resource_beginning + offset;
+ return strlen(stringptr);
}
int MessageState::loadRes(int module) {
Modified: scummvm/trunk/engines/sci/engine/message.h
===================================================================
--- scummvm/trunk/engines/sci/engine/message.h 2009-05-10 13:40:28 UTC (rev 40420)
+++ scummvm/trunk/engines/sci/engine/message.h 2009-05-10 13:47:38 UTC (rev 40421)
@@ -46,7 +46,7 @@
//typedef int index_record_size_t();
typedef void parse_index_record_t(IndexRecordCursor *index_record, MessageTuple *t);
typedef int get_talker_t(IndexRecordCursor *cursor);
-typedef void get_text_t(IndexRecordCursor *cursor, char *buffer, int buffer_size);
+typedef void get_text_t(IndexRecordCursor *cursor);
typedef int index_record_count_t(byte *header);
class MessageState {
@@ -55,7 +55,7 @@
int getNext();
int getTalker();
int getLength();
- int getText(char *buffer, int length);
+ void getText(char *buffer);
int loadRes(int module);
int isInitialized() { return _initialized; }
void initialize(ResourceManager *resmgr);
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