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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Mon Feb 23 04:04:52 CET 2009


Revision: 38805
          http://scummvm.svn.sourceforge.net/scummvm/?rev=38805&view=rev
Author:   fingolfin
Date:     2009-02-23 03:04:52 +0000 (Mon, 23 Feb 2009)

Log Message:
-----------
SCI: Changed selector name table to a Common::StringList

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/game.cpp
    scummvm/trunk/engines/sci/engine/kscripts.cpp
    scummvm/trunk/engines/sci/engine/savegame.cfsml
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/scriptconsole.cpp
    scummvm/trunk/engines/sci/engine/scriptdebug.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp
    scummvm/trunk/engines/sci/include/engine.h
    scummvm/trunk/engines/sci/include/script.h
    scummvm/trunk/engines/sci/include/vocabulary.h
    scummvm/trunk/engines/sci/scicore/script.cpp
    scummvm/trunk/engines/sci/scicore/vocab_debug.cpp

Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/engine/game.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -59,14 +59,11 @@
 
 	s->opcodes = vocabulary_get_opcodes(s->resmgr);
 
-	if (!(s->selector_names = vocabulary_get_snames(s->resmgr, NULL, s->version))) {
+	if (!vocabulary_get_snames(s->resmgr, s->version, s->_selectorNames)) {
 		sciprintf("_init_vocabulary(): Could not retrieve selector names (vocab.997)!\n");
 		return 1;
 	}
 
-	for (s->selector_names_nr = 0; s->selector_names[s->selector_names_nr]; s->selector_names_nr++);
-	// Counts the number of selector names
-
 	script_map_selectors(s, &(s->selector_map));
 	// Maps a few special selectors for later use
 
@@ -85,12 +82,11 @@
 		vocab_free_rule_list(s->parser_rules);
 	}
 
-	vocabulary_free_snames(s->selector_names);
+	s->_selectorNames.clear();
 	vocabulary_free_knames(s->kernel_names);
 	vocabulary_free_opcodes(s->opcodes);
 	s->opcodes = NULL;
 
-	s->selector_names = NULL;
 	s->kernel_names = NULL;
 	s->opcodes = NULL;
 }
@@ -586,8 +582,6 @@
 	seg_manager = 0;
 	gc_countdown = 0;
 
-	selector_names_nr = 0;
-	selector_names = 0;
 	kernel_names_nr = 0;
 	kernel_names = 0;
 
@@ -781,7 +775,7 @@
 
 	srand(g_system->getMillis()); // Initialize random number generator
 
-//	script_dissect(0, s->selector_names, s->selector_names_nr);
+//	script_dissect(0, s->_selectorNames);
 	game_obj = script_lookup_export(s, 0, 0);
 	// The first entry in the export table of script 0 points to the game object
 

Modified: scummvm/trunk/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kscripts.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -41,7 +41,7 @@
 void write_selector(EngineState *s, reg_t object, selector_t selector_id, reg_t value, const char *fname, int line) {
 	reg_t *address;
 
-	if ((selector_id < 0) || (selector_id > s->selector_names_nr)) {
+	if ((selector_id < 0) || (selector_id > (int)s->_selectorNames.size())) {
 		warning("Attempt to write to invalid selector %d of"
 		         " object at "PREG" (%s L%d).", selector_id, PRINT_REG(object), fname, line);
 		return;
@@ -49,7 +49,7 @@
 
 	if (lookup_selector(s, object, selector_id, &address, NULL) != SELECTOR_VARIABLE)
 		warning("Selector '%s' of object at "PREG" could not be"
-		         " written to (%s L%d)", s->selector_names[selector_id], PRINT_REG(object), fname, line);
+		         " written to (%s L%d)", s->_selectorNames[selector_id].c_str(), PRINT_REG(object), fname, line);
 	else
 		*address = value;
 }
@@ -72,7 +72,7 @@
 
 	if (slc_type == SELECTOR_NONE) {
 		SCIkwarn(SCIkERROR, "Selector '%s' of object at "PREG" could not be invoked (%s L%d)\n",
-		         s->selector_names[selector_id], PRINT_REG(object), fname, line);
+		         s->_selectorNames[selector_id].c_str(), PRINT_REG(object), fname, line);
 		if (noinvalid == 0)
 			KERNEL_OOPS("Not recoverable: VM was halted\n");
 		return 1;

Modified: scummvm/trunk/engines/sci/engine/savegame.cfsml
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cfsml	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/engine/savegame.cfsml	2009-02-23 03:04:52 UTC (rev 38805)
@@ -1124,8 +1124,7 @@
 	retval->parser_branches = s->parser_branches;
 
 	// static VM/Kernel information:
-	retval->selector_names_nr = s->selector_names_nr;
-	retval->selector_names = s->selector_names;
+	retval->_selectorNames = s->_selectorNames;
 	retval->kernel_names_nr = s->kernel_names_nr;
 	retval->kernel_names = s->kernel_names;
 	retval->kfunct_table = s->kfunct_table;

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -5253,8 +5253,7 @@
 	retval->parser_branches = s->parser_branches;
 
 	// static VM/Kernel information:
-	retval->selector_names_nr = s->selector_names_nr;
-	retval->selector_names = s->selector_names;
+	retval->_selectorNames = s->_selectorNames;
 	retval->kernel_names_nr = s->kernel_names_nr;
 	retval->kernel_names = s->kernel_names;
 	retval->kfunct_table = s->kfunct_table;
@@ -5327,7 +5326,7 @@
 		}
 	}
 // End of auto-generated CFSML data reader code
-#line 1170 "engines/sci/engine/savegame.cfsml"
+#line 1169 "engines/sci/engine/savegame.cfsml"
 
 	if (read_eof)
 		return false;

Modified: scummvm/trunk/engines/sci/engine/scriptconsole.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptconsole.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/engine/scriptconsole.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -1010,28 +1010,22 @@
 }
 
 static int c_selectornames(EngineState * s) {
-	int namectr;
-	char **snames	= NULL;
-	int seeker = 0;
+	Common::StringList selectorNames;
 
 	if (NULL == s) {
 		sciprintf("console.c: c_selectornames(): NULL passed for parameter s\n");
 		return -1;
 	}
 
-	snames = vocabulary_get_snames(s->resmgr, &namectr, s ? s->version : 0);
-
-	if (!snames) {
+	if (!vocabulary_get_snames(s->resmgr, s ? s->version : 0, selectorNames)) {
 		sciprintf("No selector name table found!\n");
 		return 1;
 	}
 
 	sciprintf("Selector names in numeric order:\n");
-	while (snames[seeker]) {
-		sciprintf("%03x: %s\n", seeker, snames[seeker]);
-		seeker++;
+	for (uint seeker = 0; seeker < selectorNames.size(); seeker++) {
+		sciprintf("%03x: %s\n", seeker, selectorNames[seeker].c_str());
 	}
-	vocabulary_free_snames(snames);
 
 	return 0;
 }
@@ -1066,7 +1060,7 @@
 		return -1;
 	}
 
-	script_dissect(s->resmgr, cmd_params[0].val, s->selector_names, s->selector_names_nr);
+	script_dissect(s->resmgr, cmd_params[0].val, s->_selectorNames);
 	return 0;
 }
 

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -1173,8 +1173,8 @@
 }
 
 const char *selector_name(EngineState *s, int selector) {
-	if (selector >= 0 && selector < s->selector_names_nr)
-		return s->selector_names[selector];
+	if (selector >= 0 && selector < (int)s->_selectorNames.size())
+		return s->_selectorNames[selector].c_str();
 	else
 		return "--INVALID--";
 }
@@ -1422,7 +1422,7 @@
 				if (!name)
 					name = "<invalid>";
 
-				sciprintf("  %s::%s[", name, (selector > s->selector_names_nr) ? "<invalid>" : selector_name(s, selector));
+				sciprintf("  %s::%s[", name, (selector > s->_selectorNames.size()) ? "<invalid>" : selector_name(s, selector));
 
 				switch (lookup_selector(s, called_obj_addr, selector, &val_ref, &fun_ref)) {
 				case SELECTOR_METHOD:
@@ -1557,7 +1557,7 @@
 
 		case EXEC_STACK_TYPE_VARSELECTOR:
 			sciprintf(" %x:[%x] vs%s %s::%s (", i, call->origin, (call->argc) ? "write" : "read",
-			          objname, s->selector_names[call->selector]);
+			          objname, s->_selectorNames[call->selector].c_str());
 			break;
 		}
 
@@ -2155,7 +2155,7 @@
 	reg_t *vptr;
 	reg_t fptr;
 
-	selector_id = vocabulary_lookup_sname(s->selector_names, selector_name);
+	selector_id = vocabulary_lookup_sname(s->_selectorNames, selector_name);
 
 	if (selector_id < 0) {
 		sciprintf("Unknown selector: \"%s\"\n", selector_name);

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -346,7 +346,7 @@
 			breakpoint_t *bp;
 			char method_name [256];
 
-			sprintf(method_name, "%s::%s", obj_get_name(s, send_obj), s->selector_names [selector]);
+			sprintf(method_name, "%s::%s", obj_get_name(s, send_obj), s->_selectorNames[selector].c_str());
 
 			bp = s->bp_list;
 			while (bp) {
@@ -365,7 +365,7 @@
 		}
 
 #ifdef VM_DEBUG_SEND
-		sciprintf("Send to "PREG", selector %04x (%s):", PRINT_REG(send_obj), selector, s->selector_names[selector]);
+		sciprintf("Send to "PREG", selector %04x (%s):", PRINT_REG(send_obj), selector, s->_selectorNames[selector].c_str());
 #endif // VM_DEBUG_SEND
 
 		if (++send_calls_nr == (send_calls_allocated - 1)) {

Modified: scummvm/trunk/engines/sci/include/engine.h
===================================================================
--- scummvm/trunk/engines/sci/include/engine.h	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/include/engine.h	2009-02-23 03:04:52 UTC (rev 38805)
@@ -253,8 +253,7 @@
 	SegManager *seg_manager;
 	int gc_countdown; /* Number of kernel calls until next gc */
 
-	int selector_names_nr; /* Number of selector names */
-	char **selector_names; /* Zero-terminated selector name list */
+	Common::StringList _selectorNames;
 	int kernel_names_nr; /* Number of kernel function names */
 	char **kernel_names; /* List of kernel names */
 

Modified: scummvm/trunk/engines/sci/include/script.h
===================================================================
--- scummvm/trunk/engines/sci/include/script.h	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/include/script.h	2009-02-23 03:04:52 UTC (rev 38805)
@@ -58,7 +58,7 @@
 	sci_obj_localvars
 };
 
-void script_dissect(ResourceManager *resmgr, int res_no, char **snames, int snames_nr);
+void script_dissect(ResourceManager *resmgr, int res_no, const Common::StringList &selectorNames);
 
 /* Opcode formats as used by script.c */
 enum opcode_format {

Modified: scummvm/trunk/engines/sci/include/vocabulary.h
===================================================================
--- scummvm/trunk/engines/sci/include/vocabulary.h	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/include/vocabulary.h	2009-02-23 03:04:52 UTC (rev 38805)
@@ -198,17 +198,13 @@
 int vocabulary_get_class_count(ResourceManager *resmgr);
 
 /**
- * Returns a null terminated array of selector names.
+ * Fills the given StringList with selector names.
+ * Returns true upon success, false oterwise.
  */
-char **vocabulary_get_snames(ResourceManager *resmgr, int *pcount, sci_version_t version);
+bool vocabulary_get_snames(ResourceManager *resmgr, sci_version_t version, Common::StringList &selectorNames);
 
-/**
- * Frees the aforementioned array
- */
-void vocabulary_free_snames(char **snames_list);
-
 /* Look up a selector name in an array, return the index */
-int vocabulary_lookup_sname(char **snames_list, char *sname);
+int vocabulary_lookup_sname(const Common::StringList &selectorNames, const char *sname);
 
 
 /**

Modified: scummvm/trunk/engines/sci/scicore/script.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/script.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/scicore/script.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -108,12 +108,11 @@
 }
 
 int script_find_selector(EngineState *s, const char *selectorname) {
-	int i;
+	for (uint pos = 0; pos < s->_selectorNames.size(); ++pos) {
+		if (s->_selectorNames[pos] == selectorname)
+			return pos;
+	}
 
-	for (i = 0; i < s->selector_names_nr; i++)
-		if (strcmp(selectorname, s->selector_names[i]) == 0)
-			return i;
-
 	sciprintf("Warning: Could not map '%s' to any selector!\n", selectorname);
 
 	return -1;
@@ -237,7 +236,7 @@
 	return 0;
 }
 
-static void script_dump_object(char *data, int seeker, int objsize, char **snames, int snames_nr) {
+static void script_dump_object(char *data, int seeker, int objsize, const Common::StringList &selectorNames) {
 	int selectors, overloads, selectorsize;
 	int species = getInt16((unsigned char *) data + 8 + seeker);
 	int superclass = getInt16((unsigned char *) data + 10 + seeker);
@@ -273,14 +272,14 @@
 		while (overloads--) {
 			int selector = getInt16((unsigned char *) data + (seeker));
 
-			sciprintf("  [%03x] %s: @", selector & 0xffff, (snames && selector >= 0 && selector < snames_nr) ? snames[selector] : "<?>");
+			sciprintf("  [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)selectorNames.size()) ? selectorNames[selector].c_str() : "<?>");
 			sciprintf("%04x\n", getInt16((unsigned char *)data + seeker + selectors*2 + 2) & 0xffff);
 
 			seeker += 2;
 		}
 }
 
-static void script_dump_class(char *data, int seeker, int objsize, char **snames, int snames_nr) {
+static void script_dump_class(char *data, int seeker, int objsize, const Common::StringList &selectorNames) {
 	int selectors, overloads, selectorsize;
 	int species = getInt16((unsigned char *) data + 8 + seeker);
 	int superclass = getInt16((unsigned char *) data + 10 + seeker);
@@ -304,7 +303,7 @@
 	while (selectors--) {
 		int selector = getInt16((unsigned char *) data + (seeker) + selectorsize);
 
-		sciprintf("  [%03x] %s = 0x%x\n", 0xffff & selector, (snames && selector >= 0 && selector < snames_nr) ? snames[selector] : "<?>",
+		sciprintf("  [%03x] %s = 0x%x\n", 0xffff & selector, (selector >= 0 && selector < (int)selectorNames.size()) ? selectorNames[selector].c_str() : "<?>",
 		          getInt16((unsigned char *)data + seeker) & 0xffff);
 
 		seeker += 2;
@@ -318,16 +317,16 @@
 
 	while (overloads--) {
 		int selector = getInt16((unsigned char *)data + (seeker));
-		fprintf(stderr, "selector=%d; snames_nr =%d\n", selector, snames_nr);
-		sciprintf("  [%03x] %s: @", selector & 0xffff, (snames && selector >= 0 && selector < snames_nr) ?
-		          snames[selector] : "<?>");
+		fprintf(stderr, "selector=%d; selectorNames.size() =%d\n", selector, selectorNames.size());
+		sciprintf("  [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)selectorNames.size()) ?
+		          selectorNames[selector].c_str() : "<?>");
 		sciprintf("%04x\n", getInt16((unsigned char *)data + seeker + selectors * 2 + 2) & 0xffff);
 
 		seeker += 2;
 	}
 }
 
-void script_dissect(ResourceManager *resmgr, int res_no, char **snames, int snames_nr) {
+void script_dissect(ResourceManager *resmgr, int res_no, const Common::StringList &selectorNames) {
 	int objectctr[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 	unsigned int _seeker = 0;
 	resource_t *script = scir_find_resource(resmgr, sci_script, res_no, 0);
@@ -350,7 +349,6 @@
 			sciprintf("End of script object (#0) encountered.\n");
 			sciprintf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)",
 			          objectctr[6], objectctr[1], objectctr[7], objectctr[10]);
-			//vocabulary_free_snames(snames);
 			vocab_free_words(words, word_count);
 			return;
 		}
@@ -367,7 +365,7 @@
 
 		switch (objtype) {
 		case sci_obj_object:
-			script_dump_object((char *)script->data, seeker, objsize, snames, snames_nr);
+			script_dump_object((char *)script->data, seeker, objsize, selectorNames);
 			break;
 
 		case sci_obj_code: {
@@ -444,7 +442,7 @@
 		break;
 
 		case sci_obj_class:
-			script_dump_class((char *)script->data, seeker, objsize, snames, snames_nr);
+			script_dump_class((char *)script->data, seeker, objsize, selectorNames);
 			break;
 
 		case sci_obj_exports: {
@@ -479,8 +477,6 @@
 	}
 
 	sciprintf("Script ends without terminator\n");
-
-	//vocabulary_free_snames(snames);
 }
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/scicore/vocab_debug.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/vocab_debug.cpp	2009-02-23 02:17:26 UTC (rev 38804)
+++ scummvm/trunk/engines/sci/scicore/vocab_debug.cpp	2009-02-23 03:04:52 UTC (rev 38805)
@@ -180,69 +180,41 @@
 	return r->size / 4;
 }
 
-char** vocabulary_get_snames(ResourceManager *resmgr, int* pcount, sci_version_t version) {
-	char** t;
+bool vocabulary_get_snames(ResourceManager *resmgr, sci_version_t version, Common::StringList &selectorNames) {
 	int count;
-	int i, j;
-	int magic;
 
-	resource_t* r = scir_find_resource(resmgr, sci_vocab, 997, 0);
+	resource_t *r = scir_find_resource(resmgr, sci_vocab, 997, 0);
 
 	if (!r) // No such resource?
-		return NULL;
+		return false;
 
 	count = getInt(r->data) + 1; // Counter is slightly off
 
-	magic = ((version == 0) || (version >= SCI_VERSION_FTU_NEW_SCRIPT_HEADER)) ? 1 : 2;
-
-	t = (char **)sci_malloc(sizeof(char*) * magic * (count + 1));
-
-	j = 0;
-
-	for (i = 0; i < count; i++) {
+	for (int i = 0; i < count; i++) {
 		int offset = getInt(r->data + 2 + i * 2);
 		int len = getInt(r->data + offset);
-		t[j] = (char *)sci_malloc(len + 1);
-		memcpy(t[j], r->data + offset + 2, len);
-		t[j][len] = '\0';
-		j++;
+		
+		Common::String tmp((const char *)r->data + offset + 2, len);
+		selectorNames.push_back(tmp);
 		if ((version != 0) && (version < SCI_VERSION_FTU_NEW_SCRIPT_HEADER)) {
-			t[j] = (char *)sci_malloc(len + 1);
-			memcpy(t[j], r->data + offset + 2, len);
-			t[j][len] = '\0';
-			j++;
+			// Early SCI versions used the LSB in the selector ID as a read/write
+			// toggle. To compensate for that, we add every selector name twice.
+			selectorNames.push_back(tmp);
 		}
 	}
 
-	t[j] = 0;
-
-	if (pcount != NULL)
-		*pcount = magic * count;
-
-	return t;
+	return true;
 }
 
-int vocabulary_lookup_sname(char **snames_list, char *sname) {
-	int pos = 0;
-
-	while (snames_list[pos]) {
-		if (!scumm_stricmp(sname, snames_list[pos]))
+int vocabulary_lookup_sname(const Common::StringList &selectorNames, const char *sname) {
+	for (uint pos = 0; pos < selectorNames.size(); ++pos) {
+		if (selectorNames[pos] == sname)
 			return pos;
-		pos++;
 	}
 
 	return -1;
 }
 
-void vocabulary_free_snames(char **snames_list) {
-	int pos = 0;
-
-	while (snames_list[pos])
-		free(snames_list[pos++]);
-
-	free(snames_list);
-}
-
 opcode* vocabulary_get_opcodes(ResourceManager *resmgr) {
 	opcode* o;
 	int count, i = 0;


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