[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