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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Thu Jun 4 23:42:24 CEST 2009


Revision: 41176
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41176&view=rev
Author:   fingolfin
Date:     2009-06-04 21:42:24 +0000 (Thu, 04 Jun 2009)

Log Message:
-----------
SCI: Renamed _kfuncTable -> _kernelFuncs; and simplified/streamlined the kernel func map in kernel.cpp a bit

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kernel.h
    scummvm/trunk/engines/sci/engine/kmisc.cpp
    scummvm/trunk/engines/sci/engine/scriptdebug.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-06-04 20:51:40 UTC (rev 41175)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-06-04 21:42:24 UTC (rev 41176)
@@ -298,21 +298,14 @@
 	/*0x88*/ "DbugStr"
 };
 
-enum KernelFuncType {
-	KF_NEW = 1,
-	KF_NONE = -1, /**< No mapping, but name is known */
-	KF_TERMINATOR = -42 /**< terminates kfunct_mappers */
-};
-
 struct SciKernelFunction {
-	KernelFuncType type;
 	const char *name;
 	KernelFunc *fun; /* The actual function */
 	const char *signature;  /* kfunct signature */
 };
 
-#define DEFUN(nm, cname, sig) {KF_NEW, nm, cname, sig}
-#define NOFUN(nm) {KF_NONE, nm, NULL, NULL}
+#define DEFUN(name, fun, sig) {name, fun, sig}
+#define NOFUN(name) {name, NULL, NULL}
 
 SciKernelFunction kfunct_mappers[] = {
 	/*00*/	DEFUN("Load", kLoad, "iii*"),
@@ -434,8 +427,8 @@
 	/*6f*/	DEFUN("6f", kTimesCos, "ii"),
 	/*70*/	DEFUN("Graph", kGraph, ".*"),
 	/*71*/	DEFUN("Joystick", kJoystick, ".*"),
-	/*72*/	NOFUN(NULL),
-	/*73*/	NOFUN(NULL),
+	/*72*/	NOFUN("unknown72"),
+	/*73*/	NOFUN("unknown73"),
 
 	// Experimental functions
 	/*74*/	DEFUN("FileIO", kFileIO, "i.*"),
@@ -464,9 +457,9 @@
 	DEFUN("SetVideoMode", kSetVideoMode, "i"),
 
 	// Special and NOP stuff
-	{KF_NEW, NULL, k_Unknown, NULL},
+	{NULL, k_Unknown, NULL},
 
-	{KF_TERMINATOR, NULL, NULL, NULL} // Terminator
+	{NULL, NULL, NULL} // Terminator
 };
 
 static const char *argtype_description[] = {
@@ -673,50 +666,49 @@
 		functions_nr = max_functions_nr;
 	}
 
-	_kfuncTable.resize(functions_nr);
+	_kernelFuncs.resize(functions_nr);
 
 	for (uint functnr = 0; functnr < functions_nr; functnr++) {
-		int seeker, found = -1;
-		Common::String sought_name;
+		int found = -1;
 
+		// First, get the name, if known, of the kernel function with number functnr
+		Common::String sought_name;
 		if (functnr < getKernelNamesSize())
 			sought_name = getKernelName(functnr);
 
-		if (!sought_name.empty())
-			for (seeker = 0; (found == -1) && kfunct_mappers[seeker].type != KF_TERMINATOR; seeker++)
-				if (kfunct_mappers[seeker].name && sought_name == kfunct_mappers[seeker].name)
-					found = seeker; // Found a kernel function with the same name!
+		// If the name is known, look it up in kfunct_mappers. This table
+		// maps kernel func names to actual function (pointers).
+		if (!sought_name.empty()) {
+			for (uint seeker = 0; (found == -1) && kfunct_mappers[seeker].name; seeker++)
+				if (sought_name == kfunct_mappers[seeker].name)
+					found = seeker; // Found a kernel function with the correct name!
+		}
 
+		// Reset the table entry
+		_kernelFuncs[functnr].fun = NULL;
+		_kernelFuncs[functnr].signature = NULL;
+		_kernelFuncs[functnr].orig_name = sought_name;
+
 		if (found == -1) {
 			if (!sought_name.empty()) {
-				warning("Kernel function %s[%x] unmapped", getKernelName(functnr).c_str(), functnr);
-				_kfuncTable[functnr].fun = kNOP;
+				// No match but a name was given -> NOP
+				warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functnr);
+				_kernelFuncs[functnr].fun = kNOP;
 			} else {
+				// No match and no name was given -> must be an unknown opcode
 				warning("Flagging kernel function %x as unknown", functnr);
-				_kfuncTable[functnr].fun = k_Unknown;
+				_kernelFuncs[functnr].fun = k_Unknown;
 			}
-
-			_kfuncTable[functnr].signature = NULL;
-			_kfuncTable[functnr].orig_name = sought_name;
-		} else
-			switch (kfunct_mappers[found].type) {
-			case KF_NONE:
-				_kfuncTable[functnr].signature = NULL;
-				++ignored;
-				break;
-
-			case KF_NEW:
-				_kfuncTable[functnr].fun = kfunct_mappers[found].fun;
-				_kfuncTable[functnr].signature = kfunct_mappers[found].signature;
-				_kfuncTable[functnr].orig_name.clear();
-				kernel_compile_signature(&(_kfuncTable[functnr].signature));
+		} else {
+			// A match in kfunct_mappers was found
+			if (kfunct_mappers[found].fun) {
+				_kernelFuncs[functnr].fun = kfunct_mappers[found].fun;
+				_kernelFuncs[functnr].signature = kfunct_mappers[found].signature;
+				kernel_compile_signature(&(_kernelFuncs[functnr].signature));
 				++mapped;
-				break;
-			case KF_TERMINATOR:
-				error("Unexpectedly encountered KF_TERMINATOR");
-				break;
-			}
-
+			} else
+				++ignored;
+		}
 	} // for all functions requesting to be mapped
 
 	sciprintf("Handled %d/%d kernel functions, mapping %d", mapped + ignored, getKernelNamesSize(), mapped);

Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h	2009-06-04 20:51:40 UTC (rev 41175)
+++ scummvm/trunk/engines/sci/engine/kernel.h	2009-06-04 21:42:24 UTC (rev 41176)
@@ -88,7 +88,7 @@
 	void dumpScriptClass(char *data, int seeker, int objsize);
 
 	selector_map_t _selectorMap; /**< Shortcut list for important selectors */
-	Common::Array<KernelFuncWithSignature> _kfuncTable; /**< Table of kernel functions */
+	Common::Array<KernelFuncWithSignature> _kernelFuncs; /**< Table of kernel functions */
 
 private:
 	/**

Modified: scummvm/trunk/engines/sci/engine/kmisc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmisc.cpp	2009-06-04 20:51:40 UTC (rev 41175)
+++ scummvm/trunk/engines/sci/engine/kmisc.cpp	2009-06-04 21:42:24 UTC (rev 41176)
@@ -249,7 +249,7 @@
 }
 
 reg_t kNOP(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	warning("Kernel function 0x%02x (%s) invoked: unmapped", funct_nr, s->_kernel->_kfuncTable[funct_nr].orig_name.c_str());
+	warning("Kernel function 0x%02x (%s) invoked: unmapped", funct_nr, s->_kernel->_kernelFuncs[funct_nr].orig_name.c_str());
 	return NULL_REG;
 }
 

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-06-04 20:51:40 UTC (rev 41175)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-06-04 21:42:24 UTC (rev 41176)
@@ -411,7 +411,7 @@
 			}
 
 			if (opcode == op_callk)
-				sciprintf(" %s[%x]", (param_value < s->_kernel->_kfuncTable.size()) ?
+				sciprintf(" %s[%x]", (param_value < s->_kernel->_kernelFuncs.size()) ?
 							((param_value < s->_kernel->getKernelNamesSize()) ? s->_kernel->getKernelName(param_value).c_str() : "[Unknown(postulated)]")
 							: "<invalid>", param_value);
 			else

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-06-04 20:51:40 UTC (rev 41175)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-06-04 21:42:24 UTC (rev 41176)
@@ -976,7 +976,7 @@
 				s->r_amp_rest = 0; // We just used up the restadjust, remember?
 			}
 
-			if (opparams[0] >= (int)s->_kernel->_kfuncTable.size()) {
+			if (opparams[0] >= (int)s->_kernel->_kernelFuncs.size()) {
 				error("Invalid kernel function 0x%x requested\n", opparams[0]);
 			} else {
 				int argc = ASSERT_ARITHMETIC(xs->sp[0]);
@@ -984,11 +984,11 @@
 				if (!(s->flags & GF_SCI0_OLD))
 					argc += restadjust;
 
-				if (s->_kernel->_kfuncTable[opparams[0]].signature
-				        && !kernel_matches_signature(s, s->_kernel->_kfuncTable[opparams[0]].signature, argc, xs->sp + 1)) {
+				if (s->_kernel->_kernelFuncs[opparams[0]].signature
+				        && !kernel_matches_signature(s, s->_kernel->_kernelFuncs[opparams[0]].signature, argc, xs->sp + 1)) {
 					error("[VM] Invalid arguments to kernel call %x\n", opparams[0]);
 				} else {
-					s->r_acc = s->_kernel->_kfuncTable[opparams[0]].fun(s, opparams[0], argc, xs->sp + 1);
+					s->r_acc = s->_kernel->_kernelFuncs[opparams[0]].fun(s, opparams[0], argc, xs->sp + 1);
 				}
 				// Call kernel function
 


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