diff options
| author | Filippos Karapetis | 2009-02-26 23:03:35 +0000 | 
|---|---|---|
| committer | Filippos Karapetis | 2009-02-26 23:03:35 +0000 | 
| commit | 6c879e96d122aa4746276d94a46d339595c9f0d4 (patch) | |
| tree | 48dcfcdb1f094e9f4abe54eae86d6c410b3b7dbd | |
| parent | 2d1fd81f90ca0583d1e28b57926079cec3d6c48c (diff) | |
| download | scummvm-rg350-6c879e96d122aa4746276d94a46d339595c9f0d4.tar.gz scummvm-rg350-6c879e96d122aa4746276d94a46d339595c9f0d4.tar.bz2 scummvm-rg350-6c879e96d122aa4746276d94a46d339595c9f0d4.zip  | |
- Removed engine/sys_strings.*
- Renamed sys_string_t -> SystemString, sys_strings_t -> SystemStrings
svn-id: r38916
| -rw-r--r-- | engines/sci/engine/game.cpp | 17 | ||||
| -rw-r--r-- | engines/sci/engine/savegame.cfsml | 29 | ||||
| -rw-r--r-- | engines/sci/engine/savegame.cpp | 283 | ||||
| -rw-r--r-- | engines/sci/engine/scriptdebug.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/engine/seg_manager.cpp | 22 | ||||
| -rw-r--r-- | engines/sci/engine/seg_manager.h | 3 | ||||
| -rw-r--r-- | engines/sci/engine/sys_strings.cpp | 111 | ||||
| -rw-r--r-- | engines/sci/engine/sys_strings.h | 80 | ||||
| -rw-r--r-- | engines/sci/engine/vm.h | 23 | ||||
| -rw-r--r-- | engines/sci/include/engine.h | 2 | ||||
| -rw-r--r-- | engines/sci/module.mk | 1 | 
11 files changed, 227 insertions, 346 deletions
diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index 03fbb74266..337f20f09f 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -633,7 +633,11 @@ int script_init_engine(EngineState *s, sci_version_t version) {  	s->sys_strings = s->seg_manager->allocateSysStrings(&s->sys_strings_segment);  	// Allocate static buffer for savegame and CWD directories -	sys_string_acquire(s->sys_strings, SYS_STRING_SAVEDIR, "savedir", MAX_SAVE_DIR_SIZE); +	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  	s->save_dir_copy = make_reg(s->sys_strings_segment, SYS_STRING_SAVEDIR);  	s->save_dir_edit_offset = 0; @@ -677,7 +681,9 @@ int script_init_engine(EngineState *s, sci_version_t version) {  }  void script_set_gamestate_save_dir(EngineState *s, const char *path) { -	sys_string_set(s->sys_strings, SYS_STRING_SAVEDIR, 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  }  void script_free_vm_memory(EngineState *s) { @@ -759,7 +765,12 @@ int game_init(EngineState *s) {  	s->status_bar_foreground = 0;  	s->status_bar_background = s->resmgr->sci_version >= SCI_VERSION_01_VGA ? 255 : 15; -	sys_string_acquire(s->sys_strings, SYS_STRING_PARSER_BASE, "parser-base", MAX_PARSER_BASE); +	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 +  	s->parser_base = make_reg(s->sys_strings_segment, SYS_STRING_PARSER_BASE);  	s->game_start_time = g_system->getMillis(); diff --git a/engines/sci/engine/savegame.cfsml b/engines/sci/engine/savegame.cfsml index b146599e71..b0cf1d0f61 100644 --- a/engines/sci/engine/savegame.cfsml +++ b/engines/sci/engine/savegame.cfsml @@ -428,14 +428,14 @@ RECORD script_t "script_t" {  	int marked_as_deleted;  } -RECORD sys_string_t "sys_string_t" { +RECORD SystemString "SystemString" {  	string name;  	int max_size;  	string value;  } -RECORD sys_strings_t "sys_strings_t" { -	sys_string_t strings[STATIC SYS_STRINGS_MAX]; +RECORD SystemStrings "SystemStrings" { +	SystemString strings[STATIC SYS_STRINGS_MAX];  }  RECORD dynmem_t "dynmem_t" { @@ -624,7 +624,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {  		%CFSMLWRITE local_variables_t &foo->data.locals INTO fh;  	break;  	case MEM_OBJ_SYS_STRINGS: -		%CFSMLWRITE sys_strings_t &foo->data.sys_strings INTO fh; +		%CFSMLWRITE SystemStrings &foo->data.sys_strings INTO fh;  	break;  	case MEM_OBJ_STACK:  		%CFSMLWRITE int &foo->data.stack.nr INTO fh; @@ -664,7 +664,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l  		%CFSMLREAD local_variables_t &foo->data.locals FROM fh ERRVAR *hiteof LINECOUNTER *line;  	break;  	case MEM_OBJ_SYS_STRINGS: -		%CFSMLREAD sys_strings_t &foo->data.sys_strings FROM fh ERRVAR *hiteof LINECOUNTER *line; +		%CFSMLREAD SystemStrings &foo->data.sys_strings FROM fh ERRVAR *hiteof LINECOUNTER *line;  	break;  	case MEM_OBJ_LISTS:  		%CFSMLREAD list_table_t &foo->data.lists FROM fh ERRVAR *hiteof LINECOUNTER *line; @@ -1104,8 +1104,25 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {  	retval->save_dir_edit_offset = 0;  	retval->sys_strings_segment = find_unique_seg_by_type(retval->seg_manager, MEM_OBJ_SYS_STRINGS);  	retval->sys_strings = &(((mem_obj_t *)(GET_SEGMENT(*retval->seg_manager, retval->sys_strings_segment, MEM_OBJ_SYS_STRINGS)))->data.sys_strings); -	sys_strings_restore(retval->sys_strings, s->sys_strings); +	// Restore system strings +	SystemString *str; + +	// First, pad memory +	for (int i = 0; i < SYS_STRINGS_MAX; i++) { +		str = &retval->sys_strings->strings[i]; +		char *data = str->value; +		if (data) { +			str->value = (char *)sci_malloc(str->max_size + 1); +			strcpy(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 +	  	// Time state:  	retval->last_wait_time = g_system->getMillis();  	retval->game_start_time = g_system->getMillis() - retval->game_time * 1000; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 593476fe06..5d80fca594 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -512,8 +512,8 @@ static void _cfsml_write_node_table_t(Common::WriteStream *fh, node_table_t* sav  static int _cfsml_read_node_table_t(Common::SeekableReadStream *fh, node_table_t* save_struc, const char *lastval, int *line, int *hiteof);  #line 382 "engines/sci/engine/savegame.cfsml" -static void _cfsml_write_sys_strings_t(Common::WriteStream *fh, sys_strings_t* save_struc); -static int _cfsml_read_sys_strings_t(Common::SeekableReadStream *fh, sys_strings_t* save_struc, const char *lastval, int *line, int *hiteof); +static void _cfsml_write_SystemString(Common::WriteStream *fh, SystemString* save_struc); +static int _cfsml_read_SystemString(Common::SeekableReadStream *fh, SystemString* save_struc, const char *lastval, int *line, int *hiteof);  #line 382 "engines/sci/engine/savegame.cfsml"  static void _cfsml_write_byte(Common::WriteStream *fh, byte* save_struc); @@ -524,6 +524,10 @@ static void _cfsml_write_node_t(Common::WriteStream *fh, node_t* save_struc);  static int _cfsml_read_node_t(Common::SeekableReadStream *fh, node_t* save_struc, const char *lastval, int *line, int *hiteof);  #line 382 "engines/sci/engine/savegame.cfsml" +static void _cfsml_write_SystemStrings(Common::WriteStream *fh, SystemStrings* save_struc); +static int _cfsml_read_SystemStrings(Common::SeekableReadStream *fh, SystemStrings* save_struc, const char *lastval, int *line, int *hiteof); + +#line 382 "engines/sci/engine/savegame.cfsml"  static void _cfsml_write_list_table_t(Common::WriteStream *fh, list_table_t* save_struc);  static int _cfsml_read_list_table_t(Common::SeekableReadStream *fh, list_table_t* save_struc, const char *lastval, int *line, int *hiteof); @@ -568,10 +572,6 @@ static void _cfsml_write_list_t(Common::WriteStream *fh, list_t* save_struc);  static int _cfsml_read_list_t(Common::SeekableReadStream *fh, list_t* save_struc, const char *lastval, int *line, int *hiteof);  #line 382 "engines/sci/engine/savegame.cfsml" -static void _cfsml_write_sys_string_t(Common::WriteStream *fh, sys_string_t* save_struc); -static int _cfsml_read_sys_string_t(Common::SeekableReadStream *fh, sys_string_t* save_struc, const char *lastval, int *line, int *hiteof); - -#line 382 "engines/sci/engine/savegame.cfsml"  static void _cfsml_write_script_t(Common::WriteStream *fh, script_t* save_struc);  static int _cfsml_read_script_t(Common::SeekableReadStream *fh, script_t* save_struc, const char *lastval, int *line, int *hiteof); @@ -2227,34 +2227,32 @@ _cfsml_read_node_table_t(Common::SeekableReadStream *fh, node_table_t* save_stru  #line 394 "engines/sci/engine/savegame.cfsml"  static void -_cfsml_write_sys_strings_t(Common::WriteStream *fh, sys_strings_t* save_struc) +_cfsml_write_SystemString(Common::WriteStream *fh, SystemString* save_struc)  {  #line 411 "engines/sci/engine/savegame.cfsml"  	WSprintf(fh, "{\n"); -	WSprintf(fh, "strings = "); -	int min, max; -	min = max = SYS_STRINGS_MAX; -#line 438 "engines/sci/engine/savegame.cfsml" -	WSprintf(fh, "[%d][\n", max); -	for (int i = 0; i < min; i++) { -		_cfsml_write_sys_string_t(fh, &(save_struc->strings[i])); -		WSprintf(fh, "\n"); -	} -	WSprintf(fh, "]"); +	WSprintf(fh, "name = "); +	_cfsml_write_string(fh, (char **) &(save_struc->name)); +	WSprintf(fh, "\n"); +	WSprintf(fh, "max_size = "); +	_cfsml_write_int(fh, (int*) &(save_struc->max_size)); +	WSprintf(fh, "\n"); +	WSprintf(fh, "value = "); +	_cfsml_write_string(fh, (char **) &(save_struc->value));  	WSprintf(fh, "\n");  	WSprintf(fh, "}");  }  #line 485 "engines/sci/engine/savegame.cfsml"  static int -_cfsml_read_sys_strings_t(Common::SeekableReadStream *fh, sys_strings_t* save_struc, const char *lastval, int *line, int *hiteof) +_cfsml_read_SystemString(Common::SeekableReadStream *fh, SystemString* save_struc, const char *lastval, int *line, int *hiteof)  {  #line 540 "engines/sci/engine/savegame.cfsml"  	char *token;  	int assignment, closed;  	if (strcmp(lastval, "{")) { -		_cfsml_error("Reading record sys_strings_t; expected opening braces in line %d, got \"%s\"\n", *line, lastval); +		_cfsml_error("Reading record SystemString; expected opening braces in line %d, got \"%s\"\n", *line, lastval);  		return CFSML_FAILURE;  	};  	closed = 0; @@ -2281,39 +2279,30 @@ _cfsml_read_sys_strings_t(Common::SeekableReadStream *fh, sys_strings_t* save_st  				_cfsml_error("Expected token at line %d\n", *line);  				return CFSML_FAILURE;  			} -				if (!strcmp(token, "strings")) { -#line 603 "engines/sci/engine/savegame.cfsml" -			if ((value[0] != '[') || (value[strlen(value) - 1] != '[')) { -				_cfsml_error("Opening brackets expected at line %d\n", *line); -				return CFSML_FAILURE; -			} -			int max,done,i; -			// Prepare to restore static array -			max = SYS_STRINGS_MAX; -#line 638 "engines/sci/engine/savegame.cfsml" -			done = i = 0; -			do { -			if (!(value = _cfsml_get_identifier(fh, line, hiteof, NULL))) { -#line 646 "engines/sci/engine/savegame.cfsml" -				_cfsml_error("Token expected at line %d\n", *line); -				return 1; -			} -			if (strcmp(value, "]")) { -				if (i == max) { -					_cfsml_error("More elements than space available (%d) in '%s' at line %d\n", max, token, *line); +				if (!strcmp(token, "name")) { +#line 689 "engines/sci/engine/savegame.cfsml" +				if (_cfsml_read_string(fh, (char **) &(save_struc->name), value, line, hiteof)) { +					_cfsml_error("Token expected by _cfsml_read_string() for name at line %d\n", *line);  					return CFSML_FAILURE;  				} -				if (_cfsml_read_sys_string_t(fh, &(save_struc->strings[i++]), value, line, hiteof)) { -					_cfsml_error("Token expected by _cfsml_read_sys_string_t() for strings[i++] at line %d\n", *line); +			} else +				if (!strcmp(token, "max_size")) { +#line 689 "engines/sci/engine/savegame.cfsml" +				if (_cfsml_read_int(fh, (int*) &(save_struc->max_size), value, line, hiteof)) { +					_cfsml_error("Token expected by _cfsml_read_int() for max_size at line %d\n", *line);  					return CFSML_FAILURE;  				}  			} else -				done = 1; -			} while (!done); +				if (!strcmp(token, "value")) { +#line 689 "engines/sci/engine/savegame.cfsml" +				if (_cfsml_read_string(fh, (char **) &(save_struc->value), value, line, hiteof)) { +					_cfsml_error("Token expected by _cfsml_read_string() for value at line %d\n", *line); +					return CFSML_FAILURE; +				}  			} else  #line 698 "engines/sci/engine/savegame.cfsml"  			{ -				_cfsml_error("sys_strings_t: Assignment to invalid identifier '%s' in line %d\n", token, *line); +				_cfsml_error("SystemString: Assignment to invalid identifier '%s' in line %d\n", token, *line);  				return CFSML_FAILURE;  			}  		} @@ -2444,6 +2433,102 @@ _cfsml_read_node_t(Common::SeekableReadStream *fh, node_t* save_struc, const cha  #line 394 "engines/sci/engine/savegame.cfsml"  static void +_cfsml_write_SystemStrings(Common::WriteStream *fh, SystemStrings* save_struc) +{ +#line 411 "engines/sci/engine/savegame.cfsml" +	WSprintf(fh, "{\n"); +	WSprintf(fh, "strings = "); +	int min, max; +	min = max = SYS_STRINGS_MAX; +#line 438 "engines/sci/engine/savegame.cfsml" +	WSprintf(fh, "[%d][\n", max); +	for (int i = 0; i < min; i++) { +		_cfsml_write_SystemString(fh, &(save_struc->strings[i])); +		WSprintf(fh, "\n"); +	} +	WSprintf(fh, "]"); +	WSprintf(fh, "\n"); +	WSprintf(fh, "}"); +} + +#line 485 "engines/sci/engine/savegame.cfsml" +static int +_cfsml_read_SystemStrings(Common::SeekableReadStream *fh, SystemStrings* save_struc, const char *lastval, int *line, int *hiteof) +{ +#line 540 "engines/sci/engine/savegame.cfsml" +	char *token; +	int assignment, closed; + +	if (strcmp(lastval, "{")) { +		_cfsml_error("Reading record SystemStrings; expected opening braces in line %d, got \"%s\"\n", *line, lastval); +		return CFSML_FAILURE; +	}; +	closed = 0; +	do { +		const char *value; +		token = _cfsml_get_identifier(fh, line, hiteof, &assignment); + +		if (!token) { +			_cfsml_error("Expected token at line %d\n", *line); +			return CFSML_FAILURE; +		} +		if (!assignment) { +			if (!strcmp(token, "}")) +				closed = 1; +			else { +				_cfsml_error("Expected assignment or closing braces in line %d\n", *line); +				return CFSML_FAILURE; +			} +		} else { +			value = ""; +			while (!value || !strcmp(value, "")) +				value = _cfsml_get_value(fh, line, hiteof); +			if (!value) { +				_cfsml_error("Expected token at line %d\n", *line); +				return CFSML_FAILURE; +			} +				if (!strcmp(token, "strings")) { +#line 603 "engines/sci/engine/savegame.cfsml" +			if ((value[0] != '[') || (value[strlen(value) - 1] != '[')) { +				_cfsml_error("Opening brackets expected at line %d\n", *line); +				return CFSML_FAILURE; +			} +			int max,done,i; +			// Prepare to restore static array +			max = SYS_STRINGS_MAX; +#line 638 "engines/sci/engine/savegame.cfsml" +			done = i = 0; +			do { +			if (!(value = _cfsml_get_identifier(fh, line, hiteof, NULL))) { +#line 646 "engines/sci/engine/savegame.cfsml" +				_cfsml_error("Token expected at line %d\n", *line); +				return 1; +			} +			if (strcmp(value, "]")) { +				if (i == max) { +					_cfsml_error("More elements than space available (%d) in '%s' at line %d\n", max, token, *line); +					return CFSML_FAILURE; +				} +				if (_cfsml_read_SystemString(fh, &(save_struc->strings[i++]), value, line, hiteof)) { +					_cfsml_error("Token expected by _cfsml_read_SystemString() for strings[i++] at line %d\n", *line); +					return CFSML_FAILURE; +				} +			} else +				done = 1; +			} while (!done); +			} else +#line 698 "engines/sci/engine/savegame.cfsml" +			{ +				_cfsml_error("SystemStrings: Assignment to invalid identifier '%s' in line %d\n", token, *line); +				return CFSML_FAILURE; +			} +		} +	} while (!closed); // Until closing braces are hit +	return CFSML_SUCCESS; +} + +#line 394 "engines/sci/engine/savegame.cfsml" +static void  _cfsml_write_list_table_t(Common::WriteStream *fh, list_table_t* save_struc)  {  #line 411 "engines/sci/engine/savegame.cfsml" @@ -3682,91 +3767,6 @@ _cfsml_read_list_t(Common::SeekableReadStream *fh, list_t* save_struc, const cha  #line 394 "engines/sci/engine/savegame.cfsml"  static void -_cfsml_write_sys_string_t(Common::WriteStream *fh, sys_string_t* save_struc) -{ -#line 411 "engines/sci/engine/savegame.cfsml" -	WSprintf(fh, "{\n"); -	WSprintf(fh, "name = "); -	_cfsml_write_string(fh, (char **) &(save_struc->name)); -	WSprintf(fh, "\n"); -	WSprintf(fh, "max_size = "); -	_cfsml_write_int(fh, (int*) &(save_struc->max_size)); -	WSprintf(fh, "\n"); -	WSprintf(fh, "value = "); -	_cfsml_write_string(fh, (char **) &(save_struc->value)); -	WSprintf(fh, "\n"); -	WSprintf(fh, "}"); -} - -#line 485 "engines/sci/engine/savegame.cfsml" -static int -_cfsml_read_sys_string_t(Common::SeekableReadStream *fh, sys_string_t* save_struc, const char *lastval, int *line, int *hiteof) -{ -#line 540 "engines/sci/engine/savegame.cfsml" -	char *token; -	int assignment, closed; - -	if (strcmp(lastval, "{")) { -		_cfsml_error("Reading record sys_string_t; expected opening braces in line %d, got \"%s\"\n", *line, lastval); -		return CFSML_FAILURE; -	}; -	closed = 0; -	do { -		const char *value; -		token = _cfsml_get_identifier(fh, line, hiteof, &assignment); - -		if (!token) { -			_cfsml_error("Expected token at line %d\n", *line); -			return CFSML_FAILURE; -		} -		if (!assignment) { -			if (!strcmp(token, "}")) -				closed = 1; -			else { -				_cfsml_error("Expected assignment or closing braces in line %d\n", *line); -				return CFSML_FAILURE; -			} -		} else { -			value = ""; -			while (!value || !strcmp(value, "")) -				value = _cfsml_get_value(fh, line, hiteof); -			if (!value) { -				_cfsml_error("Expected token at line %d\n", *line); -				return CFSML_FAILURE; -			} -				if (!strcmp(token, "name")) { -#line 689 "engines/sci/engine/savegame.cfsml" -				if (_cfsml_read_string(fh, (char **) &(save_struc->name), value, line, hiteof)) { -					_cfsml_error("Token expected by _cfsml_read_string() for name at line %d\n", *line); -					return CFSML_FAILURE; -				} -			} else -				if (!strcmp(token, "max_size")) { -#line 689 "engines/sci/engine/savegame.cfsml" -				if (_cfsml_read_int(fh, (int*) &(save_struc->max_size), value, line, hiteof)) { -					_cfsml_error("Token expected by _cfsml_read_int() for max_size at line %d\n", *line); -					return CFSML_FAILURE; -				} -			} else -				if (!strcmp(token, "value")) { -#line 689 "engines/sci/engine/savegame.cfsml" -				if (_cfsml_read_string(fh, (char **) &(save_struc->value), value, line, hiteof)) { -					_cfsml_error("Token expected by _cfsml_read_string() for value at line %d\n", *line); -					return CFSML_FAILURE; -				} -			} else -#line 698 "engines/sci/engine/savegame.cfsml" -			{ -				_cfsml_error("sys_string_t: Assignment to invalid identifier '%s' in line %d\n", token, *line); -				return CFSML_FAILURE; -			} -		} -	} while (!closed); // Until closing braces are hit -	return CFSML_SUCCESS; -} - -#line 394 "engines/sci/engine/savegame.cfsml" -static void  _cfsml_write_script_t(Common::WriteStream *fh, script_t* save_struc)  {  #line 411 "engines/sci/engine/savegame.cfsml" @@ -4334,7 +4334,7 @@ void write_mem_obj_t(Common::WriteStream *fh, mem_obj_t *foo) {  	case MEM_OBJ_SYS_STRINGS:  #line 818 "engines/sci/engine/savegame.cfsml"  // Auto-generated CFSML data writer code -	_cfsml_write_sys_strings_t(fh, &foo->data.sys_strings); +	_cfsml_write_SystemStrings(fh, &foo->data.sys_strings);  	WSprintf(fh, "\n");  // End of auto-generated CFSML data writer code  #line 628 "engines/sci/engine/savegame.cfsml" @@ -4512,7 +4512,7 @@ int read_mem_obj_t(Common::SeekableReadStream *fh, mem_obj_t *foo, const char *l  			_cfsml_error = CFSML_FAILURE;  		} else {  #line 788 "engines/sci/engine/savegame.cfsml" -			_cfsml_error = _cfsml_read_sys_strings_t(fh, &foo->data.sys_strings, _cfsml_inp, &(*line), &_cfsml_eof); +			_cfsml_error = _cfsml_read_SystemStrings(fh, &foo->data.sys_strings, _cfsml_inp, &(*line), &_cfsml_eof);  		}  #line 793 "engines/sci/engine/savegame.cfsml"  		*hiteof = _cfsml_error; @@ -5232,8 +5232,25 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {  	retval->save_dir_edit_offset = 0;  	retval->sys_strings_segment = find_unique_seg_by_type(retval->seg_manager, MEM_OBJ_SYS_STRINGS);  	retval->sys_strings = &(((mem_obj_t *)(GET_SEGMENT(*retval->seg_manager, retval->sys_strings_segment, MEM_OBJ_SYS_STRINGS)))->data.sys_strings); -	sys_strings_restore(retval->sys_strings, s->sys_strings); +	// Restore system strings +	SystemString *str; + +	// First, pad memory +	for (int i = 0; i < SYS_STRINGS_MAX; i++) { +		str = &retval->sys_strings->strings[i]; +		char *data = str->value; +		if (data) { +			str->value = (char *)sci_malloc(str->max_size + 1); +			strcpy(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 +	  	// Time state:  	retval->last_wait_time = g_system->getMillis();  	retval->game_start_time = g_system->getMillis() - retval->game_time * 1000; @@ -5319,7 +5336,7 @@ bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata*  		}  	}  // End of auto-generated CFSML data reader code -#line 1163 "engines/sci/engine/savegame.cfsml" +#line 1180 "engines/sci/engine/savegame.cfsml"  	if (read_eof)  		return false; diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 1f3ddfa235..5d753255bd 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -414,7 +414,7 @@ static void _c_single_seg_info(EngineState *s, mem_obj_t *mobj) {  	break;  	case MEM_OBJ_SYS_STRINGS: { -		sys_strings_t *strings = &(mobj->data.sys_strings); +		SystemStrings *strings = &(mobj->data.sys_strings);  		int i;  		sciprintf("system string table\n"); diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 5f662d5c6e..efa5746a61 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -232,6 +232,7 @@ int SegManager::initialiseScript(mem_obj_t *mem, EngineState *s, int script_nr)  int SegManager::deallocate(int seg, bool recursive) {  	mem_obj_t *mobj;  	VERIFY(check(seg), "invalid seg id"); +	int i;  	mobj = heap[seg];  	id_seg_map->removeKey(mobj->segmgr_id); @@ -255,8 +256,19 @@ int SegManager::deallocate(int seg, bool recursive) {  			free(mobj->data.dynmem.buf);  		mobj->data.dynmem.buf = NULL;  		break; -	case MEM_OBJ_SYS_STRINGS: -		sys_string_free_all(&(mobj->data.sys_strings)); +	case MEM_OBJ_SYS_STRINGS:  +		for (i = 0; i < SYS_STRINGS_MAX; i++) { +			SystemString *str = &mobj->data.sys_strings.strings[i]; +			if (str->name) { +				free(str->name); +				str->name = NULL; + +				free(str->value); +				str->value = NULL; + +				str->max_size = 0; +			} +		}  		break;  	case MEM_OBJ_STACK:  		free(mobj->data.stack.entries); @@ -1193,11 +1205,11 @@ dstack_t *SegManager::allocateStack(int size, seg_id_t *segid) {  	return retval;  } -sys_strings_t *SegManager::allocateSysStrings(seg_id_t *segid) { +SystemStrings *SegManager::allocateSysStrings(seg_id_t *segid) {  	mem_obj_t *memobj = allocNonscriptSegment(MEM_OBJ_SYS_STRINGS, segid); -	sys_strings_t *retval = &(memobj->data.sys_strings); +	SystemStrings *retval = &(memobj->data.sys_strings); -	memset(retval, 0, sizeof(sys_string_t)*SYS_STRINGS_MAX); +	memset(retval, 0, sizeof(SystemString)*SYS_STRINGS_MAX);  	return retval;  } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index acc4565ed1..0dc4b3755b 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -300,8 +300,7 @@ public:  	// Allocates a system string table  	// Returns   : (dstack_t *): The physical stack  	//             (seg_id_t) segid: Segment ID of the stack -	// See also sys_string_acquire(); -	sys_strings_t *allocateSysStrings(seg_id_t *segid); +	SystemStrings *allocateSysStrings(seg_id_t *segid);  	// 6, 7. Lists and Nodes diff --git a/engines/sci/engine/sys_strings.cpp b/engines/sci/engine/sys_strings.cpp deleted file mode 100644 index 7aba4b58d3..0000000000 --- a/engines/sci/engine/sys_strings.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "sci/tools.h" -#include "sci/engine/sys_strings.h" -#include "sci/sci_memory.h" - -namespace Sci { - -void sys_string_acquire(sys_strings_t *strings, int index, const char *name, int max_len) { -	sys_string_t *str = strings->strings + index; - -	if (index < 0 || index >= SYS_STRINGS_MAX) { -		fprintf(stderr, "[SYSSTR] Error: Attempt to acquire string #%d\n", -		        index); -		BREAKPOINT(); -	} - -	if (str->name -	        && (strcmp(name, str->name) -	            || (str->max_size != max_len))) { -		fprintf(stderr, "[SYSSTR] Error: Attempt to re-acquire existing string #%d;" -		        "was '%s', tried to claim as '%s'\n", -		        index, str->name, name); -		BREAKPOINT(); -	} - -	str->name = strdup(name); -	str->max_size = max_len; -	str->value = (char*)sci_malloc(max_len + 1); -	str->value[0] = 0; // Set to empty string -} - -int sys_string_set(sys_strings_t *strings, int index, const char *value) { -	sys_string_t *str = strings->strings + index; - -	if (index < 0 || index >= SYS_STRINGS_MAX || !str->name) { -		fprintf(stderr, "[SYSSTR] Error: Attempt to write to invalid/unused string #%d\n", -		        index); -		BREAKPOINT(); -		return 1; -	} - -	strncpy(str->value, value, str->max_size); -	str->value[str->max_size] = 0; // Make sure to terminate - -	return 0; -} - -void sys_string_free(sys_strings_t *strings, int index) { -	sys_string_t *str = strings->strings + index; - -	free(str->name); -	str->name = NULL; - -	free(str->value); -	str->value = NULL; - -	str->max_size = 0; -} - -void sys_string_free_all(sys_strings_t *strings) { -	int i; - -	for (i = 0;i < SYS_STRINGS_MAX;i++) { -		if (strings->strings[i].name) -			sys_string_free(strings, i); -	} - -} - -void sys_strings_restore(sys_strings_t *new_strings, sys_strings_t *old_strings) { -	int i; - -	// First, pad memory -	for (i = 0; i < SYS_STRINGS_MAX; i++) { -		sys_string_t *s = new_strings->strings + i; -		char *data = s->value; -		if (data) { -			s->value = (char *)sci_malloc(s->max_size + 1); -			strcpy(s->value, data); -			free(data); -		} -	} - -	sys_string_set(new_strings, SYS_STRING_SAVEDIR, old_strings->strings[SYS_STRING_SAVEDIR].value); -} - -} // End of namespace Sci diff --git a/engines/sci/engine/sys_strings.h b/engines/sci/engine/sys_strings.h deleted file mode 100644 index 3e7360c5cd..0000000000 --- a/engines/sci/engine/sys_strings.h +++ /dev/null @@ -1,80 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef SCI_ENGINE_SYS_STRINGS_H -#define SCI_ENGINE_SYS_STRINGS_H - -namespace Sci { - -enum { -	SYS_STRINGS_MAX = 4, - -	SYS_STRING_SAVEDIR = 0, -	SYS_STRING_PARSER_BASE = 1, - -	MAX_PARSER_BASE = 64 -}; - -struct sys_string_t { -	char *name; -	int max_size; -	char *value; -}; - -struct sys_strings_t { -	sys_string_t strings[SYS_STRINGS_MAX]; -}; - -void sys_string_acquire(sys_strings_t *strings, int index, const char *name, int max_len); -/* Reserves a new system string -** Parameters: (sys_strings_t *) strings: The string table to reserve in -**             (int) index: Index number to reserve -**             (const char *) name: Name the entry should be tagged with -**             (int) max_len: Maximum string length in bytes -*/ - -int sys_string_set(sys_strings_t *strings, int index, const char *value); -/* Sets the value of a system string -** Parameters: (sys_strings_t *) strings: The string table to use -**             (int) index: Index of the string to write to -**             (const char *) value: The value to copy -** Returns   : 0 on success, 1 on error -** Length clipping is performed. -*/ - -void sys_strings_restore(sys_strings_t *new_strings, sys_strings_t *old_strings); -/* Cleanup system strings after a gamestate restore -** Parameters: (sys_strings_t *) The freshly loaded system strings to clean up -**             (sys_strings_t *) The old system strings to clean up -*/ - -void sys_string_free_all(sys_strings_t *strings); -/* Deallocates all allocated system strings -** Parameters: (sys_strings_t *) strings: The string table to deallocate -*/ - -} // End of namespace Sci - -#endif // SCI_ENGINE_SYS_STRINGS_H diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 721360932f..50d2032b44 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -32,12 +32,29 @@  #include "sci/include/vm_types.h"	// for reg_t  #include "sci/include/heapmgr.h" -#include "sci/engine/sys_strings.h" -  namespace Sci {  struct IntMapper; +enum { +	SYS_STRINGS_MAX = 4, + +	SYS_STRING_SAVEDIR = 0, +	SYS_STRING_PARSER_BASE = 1, + +	MAX_PARSER_BASE = 64 +}; + +struct SystemString { +	char *name; +	int max_size; +	char *value; +}; + +struct SystemStrings { +	SystemString strings[SYS_STRINGS_MAX]; +}; +  #define VM_STACK_SIZE 0x1000  /* Number of bytes to be allocated for the stack */ @@ -277,7 +294,7 @@ struct mem_obj_t {  		clone_table_t clones;  		local_variables_t locals;  		dstack_t stack; -		sys_strings_t sys_strings; +		SystemStrings sys_strings;  		list_table_t lists;  		node_table_t nodes;  		hunk_table_t hunks; diff --git a/engines/sci/include/engine.h b/engines/sci/include/engine.h index 13e58ecd8b..085b50b2e4 100644 --- a/engines/sci/include/engine.h +++ b/engines/sci/include/engine.h @@ -226,7 +226,7 @@ struct EngineState {  	/* System strings */  	seg_id_t sys_strings_segment; -	sys_strings_t *sys_strings; +	SystemStrings *sys_strings;  	/* Parser data: */  	word_t **parser_words; diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 34d9a9bb60..39cca125cc 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -31,7 +31,6 @@ MODULE_OBJS = \  	engine/scriptconsole.o \  	engine/scriptdebug.o \  	engine/seg_manager.o \ -	engine/sys_strings.o \  	engine/vm.o \  	gfx/font.o \  	gfx/gfx_driver.o \  | 
