[Scummvm-cvs-logs] SF.net SVN: scummvm:[41563] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Tue Jun 16 01:07:55 CEST 2009


Revision: 41563
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41563&view=rev
Author:   drmccoy
Date:     2009-06-15 23:07:55 +0000 (Mon, 15 Jun 2009)

Log Message:
-----------
Renamed varPos to varBase and split off getVarBase() from parseVarIndex() and parseExpr()

Modified Paths:
--------------
    scummvm/trunk/engines/gob/parse.cpp
    scummvm/trunk/engines/gob/parse.h

Modified: scummvm/trunk/engines/gob/parse.cpp
===================================================================
--- scummvm/trunk/engines/gob/parse.cpp	2009-06-15 23:07:38 UTC (rev 41562)
+++ scummvm/trunk/engines/gob/parse.cpp	2009-06-15 23:07:55 UTC (rev 41563)
@@ -456,16 +456,6 @@
 	return;
 }
 
-int16 Parse::getOffset(int16 arg_0, byte arg_2, uint32 arg_3, uint16 arg_7, uint16 arg_9) {
-	if (arg_0 < 0)
-		return 0;
-
-	if (arg_2 > arg_0)
-		return arg_0;
-
-	return arg_2 - 1;
-}
-
 int Parse::cmpHelper(byte *operPtr, int32 *valPtr) {
 	byte var_C = operPtr[-3];
 	int cmpTemp = 0;
@@ -482,76 +472,90 @@
 	return cmpTemp;
 }
 
-int16 Parse::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
-	int16 temp2;
-	byte *arrDesc;
-	int16 dim;
-	int16 dimCount;
-	int16 operation;
-	int16 temp;
-	int16 offset;
-	int16 val;
-	uint32 varPos = 0;
+bool Parse::getVarBase(uint32 &varBase, bool mindStop, uint16 *arg_0, uint16 *oper) {
+	varBase = 0;
 
-	operation = *_vm->_global->_inter_execPtr++;
-
+	byte operation = *_vm->_global->_inter_execPtr;
 	while ((operation == 14) || (operation == 15)) {
+		_vm->_global->_inter_execPtr++;
+
 		if (operation == 14) {
-			uint16 n = _vm->_inter->load16();
-			varPos += n * 4;
+			// Add a direct offset
 
+			varBase += _vm->_inter->load16() * 4;
+
 			if (arg_0)
 				*arg_0 = READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			if (arg_4)
-				*arg_4 = 14;
+			if (oper)
+				*oper = 14;
 
 			_vm->_global->_inter_execPtr += 2;
 
-			debugC(2, kDebugParser, "parseVarIndex: Prefix %d (%d)", varPos, operation);
+			debugC(2, kDebugParser, "varBase: %d, by %d", varBase, operation);
 
-			if (*_vm->_global->_inter_execPtr != 97)
-				return varPos;
+			if (*_vm->_global->_inter_execPtr != 97) {
+				if (mindStop)
+					return true;
+			} else
+				_vm->_global->_inter_execPtr++;
 
-			_vm->_global->_inter_execPtr++;
-
 		} else if (operation == 15) {
-			uint16 n = _vm->_inter->load16();
-			varPos += n * 4;
+			// Add an offset from an array
 
-			uint16 var_0C = _vm->_inter->load16();
-			if (arg_0)
-				*arg_0 = var_0C;
-			if (arg_4)
-				*arg_4 = 15;
+			varBase += _vm->_inter->load16() * 4;
 
-			uint8 var_A = *_vm->_global->_inter_execPtr++;
+			uint16 offset1 = _vm->_inter->load16();
 
-			byte *var_12 = _vm->_global->_inter_execPtr;
-			_vm->_global->_inter_execPtr += var_A;
+			if (arg_0)
+				*arg_0 = offset1;
+			if (oper)
+				*oper = 15;
 
-			uint16 var_6 = 0;
+			uint8 dimCount = *_vm->_global->_inter_execPtr++;
+			byte *dimArray = _vm->_global->_inter_execPtr;
 
-			for (int i = 0; i < var_A; i++) {
-				temp2 = parseValExpr(OP_END_MARKER);
+			_vm->_global->_inter_execPtr += dimCount;
 
-				int16 ax = getOffset(temp2, var_12[i], varPos, 0, 0);
+			uint16 offset2 = 0;
+			for (int i = 0; i < dimCount; i++) {
+				int16 dim = CLIP<int>(parseValExpr(OP_END_MARKER), 0, dimArray[i] - 1);
 
-				var_6 = var_6 * var_12[i] + ax;
+				offset2 = offset2 * dimArray[i] + dim;
 			}
 
-			varPos += var_6 * var_0C * 4;
+			varBase += offset2 * offset1 * 4;
 
-			debugC(2, kDebugParser, "parseVarIndex: Prefix %d (%d)", varPos, operation);
+			debugC(2, kDebugParser, "varBase: %d, by %d", varBase, operation);
 
-			if (*_vm->_global->_inter_execPtr != 97)
-				return varPos;
-
-			_vm->_global->_inter_execPtr++;
+			if (*_vm->_global->_inter_execPtr != 97) {
+				if (mindStop)
+					return true;
+			} else
+				_vm->_global->_inter_execPtr++;
 		}
 
-		operation = *_vm->_global->_inter_execPtr++;
+		operation = *_vm->_global->_inter_execPtr;
 	}
 
+	return false;
+}
+
+int16 Parse::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
+	int16 temp2;
+	byte *arrDesc;
+	int16 dim;
+	int16 dimCount;
+	int16 operation;
+	int16 temp;
+	int16 offset;
+	int16 val;
+	uint32 varBase;
+
+	if (getVarBase(varBase, true, arg_0, arg_4))
+		return varBase;
+
+	operation = *_vm->_global->_inter_execPtr++;
+
 	if (arg_0)
 		*arg_0 = 0;
 	if (arg_4)
@@ -573,24 +577,24 @@
 			offset = arrDesc[dim] * offset + temp2;
 		}
 		if (operation == OP_ARRAY_UINT8)
-			return varPos + temp + offset;
+			return varBase + temp + offset;
 		if (operation == OP_ARRAY_UINT32)
-			return varPos + (temp + offset) * 4;
+			return varBase + (temp + offset) * 4;
 		if (operation == OP_ARRAY_UINT16)
-			return varPos + (temp + offset) * 2;
+			return varBase + (temp + offset) * 2;
 		temp *= 4;
 		offset *= 4;
 		if (*_vm->_global->_inter_execPtr == 13) {
 			_vm->_global->_inter_execPtr++;
 			temp += parseValExpr(OP_END_MARKER);
 		}
-		return varPos + offset * _vm->_global->_inter_animDataSize + temp;
+		return varBase + offset * _vm->_global->_inter_animDataSize + temp;
 
 	case OP_LOAD_VAR_INT16:
-		return varPos + _vm->_inter->load16() * 2;
+		return varBase + _vm->_inter->load16() * 2;
 
 	case OP_LOAD_VAR_INT8:
-		return varPos + _vm->_inter->load16();
+		return varBase + _vm->_inter->load16();
 
 	case 23:
 	case 24:
@@ -604,7 +608,7 @@
 			temp += val;
 			debugC(5, kDebugParser, "parse subscript = %d", val);
 		}
-		return varPos + temp;
+		return varBase + temp;
 
 	default:
 		return 0;
@@ -635,7 +639,7 @@
 	bool var_1A;
 	int16 stkPos;
 	int16 brackStart;
-	uint32 varPos = 0;
+	uint32 varBase;
 
 	memset(operStack, 0, 20);
 
@@ -644,51 +648,13 @@
 	valPtr = values - 1;
 
 	while (true) {
-		operation = *_vm->_global->_inter_execPtr++;
+		getVarBase(varBase);
 
-		while ((operation == 14) || (operation == 15)) {
-			if (operation == 14) {
-				uint16 n = _vm->_inter->load16();
-				varPos += n * 4;
-
-				_vm->_global->_inter_execPtr += 2;
-				if (*_vm->_global->_inter_execPtr == 97)
-					_vm->_global->_inter_execPtr++;
-			} else if (operation == 15) {
-				uint16 n = _vm->_inter->load16();
-				varPos += n * 4;
-
-				uint16 var_0C = _vm->_inter->load16();
-				uint8 var_A = *_vm->_global->_inter_execPtr++;
-
-				byte *var_12 = _vm->_global->_inter_execPtr;
-				_vm->_global->_inter_execPtr += var_A;
-
-				uint16 var_6 = 0;
-
-				for (int i = 0; i < var_A; i++) {
-					temp2 = parseValExpr(OP_END_MARKER);
-
-					int16 ax = getOffset(temp2, var_12[i], varPos, 0, 0);
-
-					var_6 = var_6 * var_12[i] + ax;
-				}
-
-				varPos += var_6 * var_0C * 4;
-
-				if (*_vm->_global->_inter_execPtr == 97)
-					_vm->_global->_inter_execPtr++;
-			}
-
-			debugC(2, kDebugParser, "parseExpr: Prefix %d (%d)", varPos, operation);
-
-			operation = *_vm->_global->_inter_execPtr++;
-		}
-
 		stkPos++;
 		operPtr++;
 		valPtr++;
 
+		operation = *_vm->_global->_inter_execPtr++;
 		if ((operation >= OP_ARRAY_UINT8) && (operation <= OP_FUNC)) {
 			switch (operation) {
 			case OP_ARRAY_UINT8:
@@ -706,20 +672,20 @@
 					offset = offset * arrDescPtr[dim] + temp2;
 				}
 				if (operation == OP_ARRAY_UINT8)
-					*valPtr = (int8) READ_VARO_UINT8(varPos + temp + offset);
+					*valPtr = (int8) READ_VARO_UINT8(varBase + temp + offset);
 				else if (operation == OP_ARRAY_UINT32)
-					*valPtr = READ_VARO_UINT32(varPos + temp * 4 + offset * 4);
+					*valPtr = READ_VARO_UINT32(varBase + temp * 4 + offset * 4);
 				else if (operation == OP_ARRAY_UINT16)
-					*valPtr = (int16) READ_VARO_UINT16(varPos + temp * 2 + offset * 2);
+					*valPtr = (int16) READ_VARO_UINT16(varBase + temp * 2 + offset * 2);
 				else if (operation == OP_ARRAY_STR) {
 					*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(
-								varPos + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4),
+								varBase + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4),
 							kInterVar);
 					if (*_vm->_global->_inter_execPtr == 13) {
 						_vm->_global->_inter_execPtr++;
 						temp2 = parseValExpr(OP_END_MARKER);
 						*operPtr = OP_LOAD_IMM_INT16;
-						*valPtr = READ_VARO_UINT8(varPos + temp * 4 +
+						*valPtr = READ_VARO_UINT8(varBase + temp * 4 +
 								offset * 4 * _vm->_global->_inter_animDataSize + temp2);
 					}
 				}
@@ -727,17 +693,17 @@
 
 			case OP_LOAD_VAR_INT16:
 				*operPtr = OP_LOAD_IMM_INT16;
-				*valPtr = (int16) READ_VARO_UINT16(varPos + _vm->_inter->load16() * 2);
+				*valPtr = (int16) READ_VARO_UINT16(varBase + _vm->_inter->load16() * 2);
 				break;
 
 			case OP_LOAD_VAR_INT8:
 				*operPtr = OP_LOAD_IMM_INT16;
-				*valPtr = (int8) READ_VARO_UINT8(varPos + _vm->_inter->load16());
+				*valPtr = (int8) READ_VARO_UINT8(varBase + _vm->_inter->load16());
 				break;
 
 			case OP_LOAD_IMM_INT32:
 				*operPtr = OP_LOAD_IMM_INT16;
-				*valPtr = READ_LE_UINT32(varPos + _vm->_global->_inter_execPtr);
+				*valPtr = READ_LE_UINT32(varBase + _vm->_global->_inter_execPtr);
 				_vm->_global->_inter_execPtr += 4;
 				break;
 
@@ -760,23 +726,23 @@
 
 			case 23:
 				*operPtr = OP_LOAD_IMM_INT16;
-				*valPtr = READ_VARO_UINT32(varPos + _vm->_inter->load16() * 4);
+				*valPtr = READ_VARO_UINT32(varBase + _vm->_inter->load16() * 4);
 				break;
 
 			case 24:
 				*operPtr = OP_LOAD_IMM_INT16;
-				*valPtr = (int16) READ_VARO_UINT16(varPos + _vm->_inter->load16() * 4);
+				*valPtr = (int16) READ_VARO_UINT16(varBase + _vm->_inter->load16() * 4);
 				break;
 
 			case OP_LOAD_VAR_STR:
 				*operPtr = OP_LOAD_IMM_STR;
 				temp = _vm->_inter->load16() * 4;
-				*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(varPos + temp), kInterVar);
+				*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(varBase + temp), kInterVar);
 				if (*_vm->_global->_inter_execPtr == 13) {
 					_vm->_global->_inter_execPtr++;
 					temp += parseValExpr(OP_END_MARKER);
 					*operPtr = OP_LOAD_IMM_INT16;
-					*valPtr = READ_VARO_UINT8(varPos + temp);
+					*valPtr = READ_VARO_UINT8(varBase + temp);
 				}
 				break;
 
@@ -832,10 +798,8 @@
 					*operPtr = (operPtr[1] == GOB_FALSE) ? GOB_TRUE : GOB_FALSE;
 			}
 
-			if (stkPos <= 0) {
-				varPos = 0;
+			if (stkPos <= 0)
 				continue;
-			}
 
 			switch (operPtr[-1]) {
 			case OP_ADD:
@@ -879,7 +843,6 @@
 				valPtr -= 2;
 				break;
 			}
-			varPos = 0;
 			continue;
 		} // (op >= OP_ARRAY_UINT8) && (op <= OP_FUNC)
 

Modified: scummvm/trunk/engines/gob/parse.h
===================================================================
--- scummvm/trunk/engines/gob/parse.h	2009-06-15 23:07:38 UTC (rev 41562)
+++ scummvm/trunk/engines/gob/parse.h	2009-06-15 23:07:55 UTC (rev 41563)
@@ -119,8 +119,9 @@
 
 	void printExpr_internal(char stopToken);
 
-	int16 getOffset(int16 arg_0, byte arg_2, uint32 arg_3, uint16 arg_7, uint16 arg_9);
 	int cmpHelper(byte *operPtr, int32 *valPtr);
+
+	bool getVarBase(uint32 &varBase, bool mindStop = false, uint16 *arg_0 = 0, uint16 *oper = 0);
 };
 
 } // End of namespace Gob


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