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

lskovlun at users.sourceforge.net lskovlun at users.sourceforge.net
Tue Mar 10 15:52:02 CET 2009


Revision: 39297
          http://scummvm.svn.sourceforge.net/scummvm/?rev=39297&view=rev
Author:   lskovlun
Date:     2009-03-10 14:52:02 +0000 (Tue, 10 Mar 2009)

Log Message:
-----------
String fragments support
WIP: No regressions in this part, I hope

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/game.cpp
    scummvm/trunk/engines/sci/engine/savegame.cfsml
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/scriptdebug.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.h
    scummvm/trunk/engines/sci/engine/state.cpp
    scummvm/trunk/engines/sci/engine/state.h
    scummvm/trunk/engines/sci/engine/vm.h
    scummvm/trunk/engines/sci/module.mk

Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/game.cpp	2009-03-10 14:52:02 UTC (rev 39297)
@@ -471,13 +471,17 @@
 	s->script_000 = &(s->seg_manager->heap[s->script_000_segment]->data.script);
 
 	s->sys_strings = s->seg_manager->allocateSysStrings(&s->sys_strings_segment);
+	s->string_frag_segment = s->seg_manager->allocateStringFrags();
+
 	// Allocate static buffer for savegame and CWD directories
 	SystemString *str = &s->sys_strings->strings[SYS_STRING_SAVEDIR];
 	str->name = strdup("savedir");
 	str->max_size = MAX_SAVE_DIR_SIZE;
-	str->value = (char*)sci_malloc(MAX_SAVE_DIR_SIZE + 1);
-	str->value[0] = 0; // Set to empty string
+	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; 
 
+
 	s->save_dir_copy = make_reg(s->sys_strings_segment, SYS_STRING_SAVEDIR);
 	s->save_dir_edit_offset = 0;
 
@@ -519,10 +523,20 @@
 
 void script_set_gamestate_save_dir(EngineState *s, const char *path) {
 	SystemString *str = &s->sys_strings->strings[SYS_STRING_SAVEDIR];
-	strncpy(str->value, path, str->max_size);
-	str->value[str->max_size] = 0; // Make sure to terminate
+	
+	strncpy((char *)str->value, path, str->max_size);
+	str->value[str->max_size].segment = s->string_frag_segment; // Make sure to terminate
+	str->value[str->max_size].offset &= 0xff00; // Make sure to terminate
 }
 
+void internal_stringfrag_strncpy(EngineState *s, reg_t *dest, reg_t *src, int len);
+
+void script_set_gamestate_save_dir(EngineState *s, reg_t path) {
+	SystemString *str = &s->sys_strings->strings[SYS_STRING_SAVEDIR];
+	reg_t *srcbuf = kernel_dereference_reg_pointer(s, path, 1);
+	internal_stringfrag_strncpy(s, str->value, srcbuf, MAX_SAVE_DIR_SIZE);
+}
+
 void script_free_vm_memory(EngineState *s) {
 	sciprintf("Freeing VM memory\n");
 	s->save_dir_copy_buf = NULL;
@@ -606,8 +620,9 @@
 	SystemString *str = &s->sys_strings->strings[SYS_STRING_PARSER_BASE];
 	str->name = strdup("parser-base");
 	str->max_size = MAX_PARSER_BASE;
-	str->value = (char*)sci_malloc(MAX_PARSER_BASE + 1);
-	str->value[0] = 0; // Set to empty string
+	str->value = (reg_t*)sci_malloc(MAX_PARSER_BASE + 1);
+	str->value[0].segment = s->string_frag_segment; // Set to empty string
+	str->value[0].offset = 0; // Set to empty string
 
 	s->parser_base = make_reg(s->sys_strings_segment, SYS_STRING_PARSER_BASE);
 

Modified: scummvm/trunk/engines/sci/engine/savegame.cfsml
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cfsml	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/savegame.cfsml	2009-03-10 14:52:02 UTC (rev 39297)
@@ -601,7 +601,9 @@
 	{MEM_OBJ_LISTS,"LISTS"},
 	{MEM_OBJ_NODES,"NODES"},
 	{MEM_OBJ_HUNK,"HUNK"},
-	{MEM_OBJ_DYNMEM,"DYNMEM"}};
+	{MEM_OBJ_DYNMEM,"DYNMEM"},
+	{MEM_OBJ_STRING_FRAG,"STRING_FRAGS"},
+};
 
 int mem_obj_string_to_enum(const char *str) {
 	int i;
@@ -635,6 +637,8 @@
 	break;
 	case MEM_OBJ_HUNK:
 		break;
+	case MEM_OBJ_STRING_FRAG:
+		break;
 	case MEM_OBJ_LISTS:
 		%CFSMLWRITE ListTable &foo->data.lists INTO fh;
 	break;
@@ -683,6 +687,8 @@
 	case MEM_OBJ_HUNK:
 		init_Hunk_table(&foo->data.hunks);
 		break;
+        case MEM_OBJ_STRING_FRAG:
+                break;
 	case MEM_OBJ_DYNMEM:
 		%CFSMLREAD DynMem  &foo->data.dynmem FROM fh ERRVAR *hiteof LINECOUNTER *line;
 	break;
@@ -1039,6 +1045,8 @@
 	}
 }
 
+void internal_stringfrag_strncpy(EngineState *s, reg_t *dest, reg_t *src, int len);
+
 EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
 	int read_eof = 0;
 	EngineState *retval;
@@ -1126,17 +1134,18 @@
 	// First, pad memory
 	for (int i = 0; i < SYS_STRINGS_MAX; i++) {
 		str = &retval->sys_strings->strings[i];
-		char *data = str->value;
+		char *data = (char *) str->value;
 		if (data) {
-			str->value = (char *)sci_malloc(str->max_size + 1);
-			strcpy(str->value, data);
+			str->value = (reg_t *)sci_malloc(str->max_size + 1);
+			strcpy((char *)str->value, data);
 			free(data);
 		}
 	}
 
 	str = &retval->sys_strings->strings[SYS_STRING_SAVEDIR];
-	strncpy(str->value, s->sys_strings->strings[SYS_STRING_SAVEDIR].value, str->max_size);
-	str->value[str->max_size] = 0; // Make sure to terminate
+	internal_stringfrag_strncpy(s, str->value, s->sys_strings->strings[SYS_STRING_SAVEDIR].value, str->max_size);
+	str->value[str->max_size].segment = s->string_frag_segment; // Make sure to terminate
+	str->value[str->max_size].offset &= 0xff00; // Make sure to terminate
 	
 	// Time state:
 	retval->last_wait_time = g_system->getMillis();

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-03-10 14:52:02 UTC (rev 39297)
@@ -4288,7 +4288,9 @@
 	{MEM_OBJ_LISTS,"LISTS"},
 	{MEM_OBJ_NODES,"NODES"},
 	{MEM_OBJ_HUNK,"HUNK"},
-	{MEM_OBJ_DYNMEM,"DYNMEM"}};
+	{MEM_OBJ_DYNMEM,"DYNMEM"},
+	{MEM_OBJ_STRING_FRAG,"STRING_FRAGS"},
+};
 
 int mem_obj_string_to_enum(const char *str) {
 	int i;
@@ -4308,7 +4310,7 @@
 	_cfsml_write_int(fh, &foo->segmgr_id);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 620 "engines/sci/engine/savegame.cfsml"
+#line 622 "engines/sci/engine/savegame.cfsml"
 	switch (foo->type) {
 	case MEM_OBJ_SCRIPT:
 #line 822 "engines/sci/engine/savegame.cfsml"
@@ -4316,7 +4318,7 @@
 	_cfsml_write_Script(fh, &foo->data.script);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 623 "engines/sci/engine/savegame.cfsml"
+#line 625 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_CLONES:
 #line 822 "engines/sci/engine/savegame.cfsml"
@@ -4324,7 +4326,7 @@
 	_cfsml_write_CloneTable(fh, &foo->data.clones);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 626 "engines/sci/engine/savegame.cfsml"
+#line 628 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_LOCALS:
 #line 822 "engines/sci/engine/savegame.cfsml"
@@ -4332,7 +4334,7 @@
 	_cfsml_write_LocalVariables(fh, &foo->data.locals);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 629 "engines/sci/engine/savegame.cfsml"
+#line 631 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_SYS_STRINGS:
 #line 822 "engines/sci/engine/savegame.cfsml"
@@ -4340,7 +4342,7 @@
 	_cfsml_write_SystemStrings(fh, &foo->data.sys_strings);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 632 "engines/sci/engine/savegame.cfsml"
+#line 634 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_STACK:
 #line 822 "engines/sci/engine/savegame.cfsml"
@@ -4348,17 +4350,19 @@
 	_cfsml_write_int(fh, &foo->data.stack.nr);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 635 "engines/sci/engine/savegame.cfsml"
+#line 637 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_HUNK:
 		break;
+	case MEM_OBJ_STRING_FRAG:
+		break;
 	case MEM_OBJ_LISTS:
 #line 822 "engines/sci/engine/savegame.cfsml"
 // Auto-generated CFSML data writer code
 	_cfsml_write_ListTable(fh, &foo->data.lists);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 640 "engines/sci/engine/savegame.cfsml"
+#line 644 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_NODES:
 #line 822 "engines/sci/engine/savegame.cfsml"
@@ -4366,7 +4370,7 @@
 	_cfsml_write_NodeTable(fh, &foo->data.nodes);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 643 "engines/sci/engine/savegame.cfsml"
+#line 647 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_DYNMEM:
 #line 822 "engines/sci/engine/savegame.cfsml"
@@ -4374,7 +4378,7 @@
 	_cfsml_write_DynMem(fh, &foo->data.dynmem);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 646 "engines/sci/engine/savegame.cfsml"
+#line 650 "engines/sci/engine/savegame.cfsml"
 	break;
 	default:
 	break;
@@ -4414,7 +4418,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 660 "engines/sci/engine/savegame.cfsml"
+#line 664 "engines/sci/engine/savegame.cfsml"
 	switch (foo->type) {
 	case MEM_OBJ_SCRIPT:
 // Auto-generated CFSML data reader code
@@ -4443,7 +4447,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 663 "engines/sci/engine/savegame.cfsml"
+#line 667 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_CLONES:
 // Auto-generated CFSML data reader code
@@ -4472,7 +4476,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 666 "engines/sci/engine/savegame.cfsml"
+#line 670 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_LOCALS:
 // Auto-generated CFSML data reader code
@@ -4501,7 +4505,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 669 "engines/sci/engine/savegame.cfsml"
+#line 673 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_SYS_STRINGS:
 // Auto-generated CFSML data reader code
@@ -4530,7 +4534,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 672 "engines/sci/engine/savegame.cfsml"
+#line 676 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_LISTS:
 // Auto-generated CFSML data reader code
@@ -4559,7 +4563,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 675 "engines/sci/engine/savegame.cfsml"
+#line 679 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_NODES:
 // Auto-generated CFSML data reader code
@@ -4588,7 +4592,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 678 "engines/sci/engine/savegame.cfsml"
+#line 682 "engines/sci/engine/savegame.cfsml"
 	break;
 	case MEM_OBJ_STACK:
 // Auto-generated CFSML data reader code
@@ -4617,12 +4621,14 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 681 "engines/sci/engine/savegame.cfsml"
+#line 685 "engines/sci/engine/savegame.cfsml"
 	foo->data.stack.entries = (reg_t *)sci_calloc(foo->data.stack.nr, sizeof(reg_t));
 	break;
 	case MEM_OBJ_HUNK:
 		init_Hunk_table(&foo->data.hunks);
 		break;
+        case MEM_OBJ_STRING_FRAG:
+                break;
 	case MEM_OBJ_DYNMEM:
 // Auto-generated CFSML data reader code
 #line 766 "engines/sci/engine/savegame.cfsml"
@@ -4650,7 +4656,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 688 "engines/sci/engine/savegame.cfsml"
+#line 694 "engines/sci/engine/savegame.cfsml"
 	break;
 	default:
 		break;
@@ -4666,7 +4672,7 @@
 	write_MemObject(fh, (*foo));
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 699 "engines/sci/engine/savegame.cfsml"
+#line 705 "engines/sci/engine/savegame.cfsml"
 	} else { // Nothing to write
 		WSprintf(fh, "\\null\\");
 	}
@@ -4701,7 +4707,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 710 "engines/sci/engine/savegame.cfsml"
+#line 716 "engines/sci/engine/savegame.cfsml"
 		return *hiteof;
 	}
 	return 0;
@@ -4715,7 +4721,7 @@
 	_cfsml_write_string(fh, (&t));
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 719 "engines/sci/engine/savegame.cfsml"
+#line 725 "engines/sci/engine/savegame.cfsml"
 }
 
 int read_CommonString(Common::SeekableReadStream *fh, Common::String *string, const char *lastval, int *line, int *hiteof)
@@ -4750,7 +4756,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 726 "engines/sci/engine/savegame.cfsml"
+#line 732 "engines/sci/engine/savegame.cfsml"
 	if (*hiteof) return *hiteof;
 	*string = t;
 	free(t);
@@ -4763,13 +4769,13 @@
 	_cfsml_write_bool(fh, &((*foo)->isSci1_1));
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 734 "engines/sci/engine/savegame.cfsml"
+#line 740 "engines/sci/engine/savegame.cfsml"
 #line 822 "engines/sci/engine/savegame.cfsml"
 // Auto-generated CFSML data writer code
 	_cfsml_write_SegManager(fh, *foo);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 735 "engines/sci/engine/savegame.cfsml"
+#line 741 "engines/sci/engine/savegame.cfsml"
 }
 
 int read_SegManagerPtr(Common::SeekableReadStream *fh, SegManager **foo, const char *lastval, int *line, int *hiteof) {
@@ -4800,7 +4806,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 742 "engines/sci/engine/savegame.cfsml"
+#line 748 "engines/sci/engine/savegame.cfsml"
 	*foo = new SegManager(sci11);
 	token = _cfsml_get_identifier(fh, line, hiteof, &assignment);
 // Auto-generated CFSML data reader code
@@ -4827,7 +4833,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 745 "engines/sci/engine/savegame.cfsml"
+#line 751 "engines/sci/engine/savegame.cfsml"
 	return 0;
 }
 
@@ -4877,13 +4883,13 @@
 	_cfsml_write_SavegameMetadata(fh, (&meta));
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 790 "engines/sci/engine/savegame.cfsml"
+#line 796 "engines/sci/engine/savegame.cfsml"
 #line 822 "engines/sci/engine/savegame.cfsml"
 // Auto-generated CFSML data writer code
 	_cfsml_write_EngineState(fh, s);
 	WSprintf(fh, "\n");
 // End of auto-generated CFSML data writer code
-#line 791 "engines/sci/engine/savegame.cfsml"
+#line 797 "engines/sci/engine/savegame.cfsml"
 
 	_gamestate_unfrob(s);
 
@@ -5135,6 +5141,8 @@
 	}
 }
 
+void internal_stringfrag_strncpy(EngineState *s, reg_t *dest, reg_t *src, int len);
+
 EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
 	int read_eof = 0;
 	EngineState *retval;
@@ -5189,7 +5197,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 1065 "engines/sci/engine/savegame.cfsml"
+#line 1073 "engines/sci/engine/savegame.cfsml"
 
 	if (read_eof)
 		return false;
@@ -5245,7 +5253,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 1089 "engines/sci/engine/savegame.cfsml"
+#line 1097 "engines/sci/engine/savegame.cfsml"
 
 	sfx_exit(&s->sound);
 	_gamestate_unfrob(retval);
@@ -5286,17 +5294,18 @@
 	// First, pad memory
 	for (int i = 0; i < SYS_STRINGS_MAX; i++) {
 		str = &retval->sys_strings->strings[i];
-		char *data = str->value;
+		char *data = (char *) str->value;
 		if (data) {
-			str->value = (char *)sci_malloc(str->max_size + 1);
-			strcpy(str->value, data);
+			str->value = (reg_t *)sci_malloc(str->max_size + 1);
+			strcpy((char *)str->value, data);
 			free(data);
 		}
 	}
 
 	str = &retval->sys_strings->strings[SYS_STRING_SAVEDIR];
-	strncpy(str->value, s->sys_strings->strings[SYS_STRING_SAVEDIR].value, str->max_size);
-	str->value[str->max_size] = 0; // Make sure to terminate
+	internal_stringfrag_strncpy(s, str->value, s->sys_strings->strings[SYS_STRING_SAVEDIR].value, str->max_size);
+	str->value[str->max_size].segment = s->string_frag_segment; // Make sure to terminate
+	str->value[str->max_size].offset &= 0xff00; // Make sure to terminate
 	
 	// Time state:
 	retval->last_wait_time = g_system->getMillis();
@@ -5382,7 +5391,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 1194 "engines/sci/engine/savegame.cfsml"
+#line 1203 "engines/sci/engine/savegame.cfsml"
 
 	if (read_eof)
 		return false;

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-03-10 14:52:02 UTC (rev 39297)
@@ -87,7 +87,8 @@
 
 const char *_debug_get_input_default() {
 	char newinpbuf[256];
-
+	char *newline;
+	
 	printf("> ");
 	fgets(newinpbuf, 254, stdin);
 
@@ -327,6 +328,10 @@
 				sciprintf("M  dynmem: %d bytes", mobj->data.dynmem.size);
 				break;
 
+			case MEM_OBJ_STRING_FRAG:
+				sciprintf("F  string fragments");
+				break;
+
 			default:
 				sciprintf("I  Invalid (type = %x)", mobj->type);
 				break;
@@ -424,10 +429,12 @@
 		SystemStrings *strings = &(mobj->data.sys_strings);
 		int i;
 
-		sciprintf("system string table\n");
+		sciprintf("system string table - viewing currently disabled\n");
+#if 0
 		for (i = 0; i < SYS_STRINGS_MAX; i++)
 			if (strings->strings[i].name)
 				sciprintf("  %s[%d]=\"%s\"\n", strings->strings[i].name, strings->strings[i].max_size, strings->strings[i].value);
+#endif
 	}
 	break;
 
@@ -483,6 +490,11 @@
 	}
 	break;
 
+	case MEM_OBJ_STRING_FRAG: {
+		sciprintf("string frags\n");
+		break;
+	}
+
 	default :
 		sciprintf("Invalid type %d\n", mobj->type);
 		break;

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-03-10 14:52:02 UTC (rev 39297)
@@ -1215,6 +1215,14 @@
 	return retval;
 }
 
+SegmentId SegManager::allocateStringFrags() {
+	SegmentId segid;
+	
+	allocNonscriptSegment(MEM_OBJ_STRING_FRAG, &segid);
+
+	return segid;
+}
+
 #if 0
 // Unreferenced - removed
 SegmentId SegManager::sm_allocate_reserved_segment(char *src_name) {
@@ -1660,7 +1668,14 @@
 		SegInterface(segmgr, mobj, segId, MEM_OBJ_SYS_STRINGS) {}
 };
 
+//-------------------- string frags --------------------
+class SegInterfaceStringFrag : public SegInterface {
+public:
+	SegInterfaceStringFrag(SegManager *segmgr, MemObject *mobj, SegmentId segId) :
+		SegInterface(segmgr, mobj, segId, MEM_OBJ_STRING_FRAG) {}
+};
 
+
 //-------------------- lists --------------------
 class SegInterfaceLists : public SegInterface {
 public:
@@ -1806,6 +1821,9 @@
 	case MEM_OBJ_DYNMEM:
 		retval = new SegInterfaceDynMem(this, mobj, segid);
 		break;
+	case MEM_OBJ_STRING_FRAG:
+		retval = new SegInterfaceStringFrag(this, mobj, segid);
+		break;
 	case MEM_OBJ_RESERVED:
 		retval = new SegInterfaceReserved(this, mobj, segid);
 		break;

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-03-10 14:52:02 UTC (rev 39297)
@@ -304,6 +304,14 @@
 	SystemStrings *allocateSysStrings(SegmentId *segid);
 
 
+	// 5. System Strings
+
+	// Allocates a string fragments segment
+	// Returns   : (SegmentId): Segment ID to use for string fragments
+	// See also stringfrag.h
+	SegmentId allocateStringFrags();
+
+
 	// 6, 7. Lists and Nodes
 
 	// Allocate a fresh list

Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/state.cpp	2009-03-10 14:52:02 UTC (rev 39297)
@@ -137,6 +137,8 @@
 	script_000_segment = 0;
 	script_000 = 0;
 
+	string_frag_segment = 0;
+
 	parser_lastmatch_word = 0;
 	bp_list = 0;
 	have_bp = 0;

Modified: scummvm/trunk/engines/sci/engine/state.h
===================================================================
--- scummvm/trunk/engines/sci/engine/state.h	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/state.h	2009-03-10 14:52:02 UTC (rev 39297)
@@ -251,6 +251,8 @@
 	SegmentId sys_strings_segment;
 	SystemStrings *sys_strings;
 
+	SegmentId string_frag_segment;
+
 	/* Parser data: */
 	word_t **parser_words;
 	int parser_words_nr;

Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/engine/vm.h	2009-03-10 14:52:02 UTC (rev 39297)
@@ -48,7 +48,7 @@
 struct SystemString {
 	char *name;
 	int max_size;
-	char *value;
+	reg_t *value;
 };
 
 struct SystemStrings {
@@ -284,7 +284,8 @@
 	MEM_OBJ_NODES = 7,
 	MEM_OBJ_HUNK = 8,
 	MEM_OBJ_DYNMEM = 9,
-	MEM_OBJ_RESERVED = 10,
+	MEM_OBJ_STRING_FRAG = 10,
+	MEM_OBJ_RESERVED = 11,
 	MEM_OBJ_MAX = MEM_OBJ_RESERVED // For sanity checking
 };
 

Modified: scummvm/trunk/engines/sci/module.mk
===================================================================
--- scummvm/trunk/engines/sci/module.mk	2009-03-10 13:48:42 UTC (rev 39296)
+++ scummvm/trunk/engines/sci/module.mk	2009-03-10 14:52:02 UTC (rev 39297)
@@ -32,6 +32,7 @@
 	engine/scriptconsole.o \
 	engine/scriptdebug.o \
 	engine/seg_manager.o \
+	engine/stringfrag.o \
 	engine/state.o \
 	engine/vm.o \
 	gfx/font.o \


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