[Scummvm-cvs-logs] SF.net SVN: scummvm:[40324] scummvm/trunk/engines/sci/engine

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Tue May 5 14:23:06 CEST 2009


Revision: 40324
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40324&view=rev
Author:   fingolfin
Date:     2009-05-05 12:23:05 +0000 (Tue, 05 May 2009)

Log Message:
-----------
SCI: Actually, it turns out the SystemString is more messed up than I thought: In some places it allocates a memory block of max_size bytes; sometimes max_size+1 bytes; and sometimes max_size*sizeof(reg_t) bytes. And sometimes strings frags are accessed as plain C strings (e.g. when saved), sometimes as a string encode as a series of reg_t values. Ouch :/

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/game.cpp
    scummvm/trunk/engines/sci/engine/savegame.cpp

Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp	2009-05-05 12:20:28 UTC (rev 40323)
+++ scummvm/trunk/engines/sci/engine/game.cpp	2009-05-05 12:23:05 UTC (rev 40324)
@@ -433,9 +433,9 @@
 	SystemString *str = &s->sys_strings->strings[SYS_STRING_SAVEDIR];
 	str->name = strdup("savedir");
 	str->max_size = MAX_SAVE_DIR_SIZE;
-	str->value = (reg_t*)sci_malloc(sizeof(reg_t)*MAX_SAVE_DIR_SIZE);
-	str->value->segment = s->string_frag_segment; // Set to empty string
-	str->value->offset = 0; 
+	str->value = (reg_t *)calloc(MAX_SAVE_DIR_SIZE, sizeof(reg_t));	// FIXME -- sizeof(char) or sizeof(reg_t) ??
+	str->value[0].segment = s->string_frag_segment; // Set to empty string
+	str->value[0].offset = 0; 
 
 
 	s->save_dir_copy = make_reg(s->sys_strings_segment, SYS_STRING_SAVEDIR);
@@ -481,7 +481,7 @@
 void script_set_gamestate_save_dir(EngineState *s, const char *path) {
 	SystemString *str = &s->sys_strings->strings[SYS_STRING_SAVEDIR];
 	
-	strncpy((char *)str->value, path, str->max_size);
+	strncpy((char *)str->value, path, str->max_size);		// FIXME -- strncpy or internal_stringfrag_strncpy ?
 	str->value[str->max_size - 1].segment = s->string_frag_segment; // Make sure to terminate
 	str->value[str->max_size - 1].offset &= 0xff00; // Make sure to terminate
 }
@@ -576,7 +576,7 @@
 	SystemString *str = &s->sys_strings->strings[SYS_STRING_PARSER_BASE];
 	str->name = strdup("parser-base");
 	str->max_size = MAX_PARSER_BASE;
-	str->value = (reg_t*)sci_malloc(MAX_PARSER_BASE + 1);
+	str->value = (reg_t *)calloc(MAX_PARSER_BASE + 1, sizeof(char));	// FIXME -- sizeof(char) or sizeof(reg_t) ??
 	str->value[0].segment = s->string_frag_segment; // Set to empty string
 	str->value[0].offset = 0; // Set to empty string
 

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-05-05 12:20:28 UTC (rev 40323)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-05-05 12:23:05 UTC (rev 40324)
@@ -846,10 +846,10 @@
 	// First, pad memory
 	for (int i = 0; i < SYS_STRINGS_MAX; i++) {
 		str = &retval->sys_strings->strings[i];
-		char *data = (char *) str->value;
+		char *data = (char *)str->value;
 		if (data) {
-			str->value = (reg_t *)sci_malloc(str->max_size + 1);
-			strcpy((char *)str->value, data);
+			str->value = (reg_t *)calloc(str->max_size+1, sizeof(char));	// FIXME -- sizeof(char) or sizeof(reg_t) ??
+			strncpy((char *)str->value, data, str->max_size+1);		// FIXME -- strncpy or internal_stringfrag_strncpy ?
 			free(data);
 		}
 	}


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