[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