aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/parse.cpp
diff options
context:
space:
mode:
authorMax Horn2006-02-11 22:45:04 +0000
committerMax Horn2006-02-11 22:45:04 +0000
commit26ee630756ebdd7c96bccede0881a8c8b98e8f2b (patch)
tree26e378d5cf990a2b81c2c96e9e683a7f333b62e8 /engines/gob/parse.cpp
parent2a9a0d4211b1ea5723f1409d91cb95de8984429e (diff)
downloadscummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.gz
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.bz2
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.zip
Moved engines to the new engines/ directory
svn-id: r20582
Diffstat (limited to 'engines/gob/parse.cpp')
-rw-r--r--engines/gob/parse.cpp420
1 files changed, 420 insertions, 0 deletions
diff --git a/engines/gob/parse.cpp b/engines/gob/parse.cpp
new file mode 100644
index 0000000000..45de528adb
--- /dev/null
+++ b/engines/gob/parse.cpp
@@ -0,0 +1,420 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2004 Ivan Dubrov
+ * Copyright (C) 2004-2006 The ScummVM project
+ *
+ * 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 "gob/gob.h"
+#include "gob/global.h"
+#include "gob/game.h"
+#include "gob/parse.h"
+#include "gob/util.h"
+#include "gob/inter.h"
+
+namespace Gob {
+
+Parse::Parse(GobEngine *vm) : _vm(vm) {
+}
+
+int32 Parse::encodePtr(char *ptr, int type) {
+ int32 offset;
+
+ switch (type) {
+ case kExecPtr:
+ offset = ptr - _vm->_game->_totFileData;
+ break;
+ case kInterVar:
+ offset = ptr - _vm->_global->_inter_variables;
+ break;
+ case kResStr:
+ offset = ptr - _vm->_global->_inter_resStr;
+ break;
+ default:
+ error("encodePtr: Unknown pointer type");
+ }
+ assert((offset & 0xF0000000) == 0);
+ return (type << 28) | offset;
+}
+
+char *Parse::decodePtr(int32 n) {
+ char *ptr;
+
+ switch (n >> 28) {
+ case kExecPtr:
+ ptr = _vm->_game->_totFileData;
+ break;
+ case kInterVar:
+ ptr = _vm->_global->_inter_variables;
+ break;
+ case kResStr:
+ ptr = _vm->_global->_inter_resStr;
+ break;
+ default:
+ error("decodePtr: Unknown pointer type");
+ }
+ return ptr + (n & 0x0FFFFFFF);
+}
+
+void Parse::skipExpr(char stopToken) {
+ int16 dimCount;
+ char operation;
+ int16 num;
+ int16 dim;
+
+ num = 0;
+ while (1) {
+ operation = *_vm->_global->_inter_execPtr++;
+
+ if (operation >= 19 && operation <= 29) {
+ switch (operation) {
+ case 20:
+ case 23:
+ _vm->_global->_inter_execPtr += 2;
+ break;
+
+ case 19:
+ _vm->_global->_inter_execPtr += 4;
+ break;
+
+ case 22:
+ _vm->_global->_inter_execPtr += strlen(_vm->_global->_inter_execPtr) + 1;
+ break;
+
+ case 25:
+ _vm->_global->_inter_execPtr += 2;
+ if (*_vm->_global->_inter_execPtr == 13) {
+ _vm->_global->_inter_execPtr++;
+ skipExpr(12);
+ }
+ break;
+
+ case 26:
+ case 28:
+ dimCount = _vm->_global->_inter_execPtr[2];
+ _vm->_global->_inter_execPtr += 3 + dimCount; // ???
+ for (dim = 0; dim < dimCount; dim++)
+ skipExpr(12);
+
+ if (operation == 28 && *_vm->_global->_inter_execPtr == 13) {
+ _vm->_global->_inter_execPtr++;
+ skipExpr(12);
+ }
+ break;
+
+ case 29:
+ _vm->_global->_inter_execPtr++;
+ skipExpr(10);
+ }
+ continue;
+ } // if (operation >= 19 && operation <= 29)
+
+ if (operation == 9) {
+ num++;
+ continue;
+ }
+
+ if (operation == 11 || (operation >= 1 && operation <= 8))
+ continue;
+
+ if (operation >= 30 && operation <= 37)
+ continue;
+
+ if (operation == 10)
+ num--;
+
+ if (operation != stopToken)
+ continue;
+
+ if (stopToken != 10 || num < 0)
+ return;
+ }
+}
+
+void Parse::printExpr(char stopToken) {
+ int16 dimCount;
+ char operation;
+ int16 num;
+ int16 dim;
+ char *arrDesc;
+ char func;
+ char saved = 0;
+ static char *savedPos = 0;
+
+ if (savedPos == 0) {
+ savedPos = _vm->_global->_inter_execPtr;
+ saved = 1;
+ }
+
+ num = 0;
+ while (1) {
+ operation = *_vm->_global->_inter_execPtr++;
+
+ if (operation >= 19 && operation <= 29) {
+ switch (operation) {
+ case 19:
+ debugN(5, "%l", READ_LE_UINT32(_vm->_global->_inter_execPtr));
+ _vm->_global->_inter_execPtr += 4;
+ break;
+
+ case 20:
+ debugN(5, "%d", _vm->_inter->load16());
+ break;
+
+ case 22:
+ debugN(5, "\42%s\42", _vm->_global->_inter_execPtr);
+ _vm->_global->_inter_execPtr += strlen(_vm->_global->_inter_execPtr) + 1;
+ break;
+
+ case 23:
+ {
+ int16 varnum = _vm->_inter->load16();
+ debugN(5, "var_%d (val=%d)", varnum, READ_LE_UINT32(_vm->_global->_inter_variables + varnum * 4) );
+ break;
+ }
+ case 25:
+ debugN(5, "(&var_%d)", _vm->_inter->load16());
+ if (*_vm->_global->_inter_execPtr == 13) {
+ _vm->_global->_inter_execPtr++;
+ debugN(5, "{");
+ printExpr(12);
+ debugN(5, "}");
+ }
+ break;
+
+ case 26:
+ case 28:
+ if (operation == 28)
+ debugN(5, "(&");
+
+ debugN(5, "var_%d[", _vm->_inter->load16());
+ dimCount = *_vm->_global->_inter_execPtr++;
+ arrDesc = _vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr += dimCount;
+ for (dim = 0; dim < dimCount; dim++) {
+ printExpr(12);
+ debugN(5, " of %d", (int16)arrDesc[dim]);
+ if (dim != dimCount - 1)
+ debugN(5, ",");
+ }
+ debugN(5, "]");
+ if (operation == 28)
+ debugN(5, ")");
+
+ if (operation == 28 && *_vm->_global->_inter_execPtr == 13) {
+ _vm->_global->_inter_execPtr++;
+ debugN(5, "{");
+ printExpr(12);
+// debugN(5, "}");
+ }
+ break;
+
+ case 29:
+ func = *_vm->_global->_inter_execPtr++;
+ if (func == 5)
+ debugN(5, "sqr(");
+ else if (func == 10)
+ debugN(5, "rand(");
+ else if (func == 7)
+ debugN(5, "abs(");
+ else if (func == 0 || func == 1 || func == 6)
+ debugN(5, "sqrt(");
+ else
+ debugN(5, "id(");
+ printExpr(10);
+ break;
+
+ default:
+ debugN(5, "<%d>", (int16)operation);
+ break;
+ }
+ continue;
+ } // if (operation >= 19 && operation <= 29)
+ switch (operation) {
+ case 9:
+ debugN(5, "(");
+ break;
+
+ case 11:
+ debugN(5, "!");
+ break;
+
+ case 10:
+ debugN(5, ")");
+ break;
+
+ case 1:
+ debugN(5, "-");
+ break;
+
+ case 2:
+ debugN(5, "+");
+ break;
+
+ case 3:
+ debugN(5, "-");
+ break;
+
+ case 4:
+ debugN(5, "|");
+ break;
+
+ case 5:
+ debugN(5, "*");
+ break;
+
+ case 6:
+ debugN(5, "/");
+ break;
+
+ case 7:
+ debugN(5, "%");
+ break;
+
+ case 8:
+ debugN(5, "&");
+ break;
+
+ case 30:
+ debugN(5, "||");
+ break;
+
+ case 31:
+ debugN(5, "&&");
+ break;
+
+ case 32:
+ debugN(5, "<");
+ break;
+
+ case 33:
+ debugN(5, "<=");
+ break;
+
+ case 34:
+ debugN(5, ">");
+ break;
+
+ case 35:
+ debugN(5, ">=");
+ break;
+
+ case 36:
+ debugN(5, "==");
+ break;
+
+ case 37:
+ debugN(5, "!=");
+ break;
+
+ case 99:
+ debugN(5, "\n");
+ break;
+
+ case 12:
+ debugN(5, "}");
+ if (stopToken != 12) {
+ debugN(5, "Closing paren without opening?");
+ }
+ break;
+
+ default:
+ debugN(5, "<%d>", (int16)operation);
+ break;
+ }
+
+ if (operation == 9) {
+ num++;
+ continue;
+ }
+
+ if (operation == 11 || (operation >= 1 && operation <= 8))
+ continue;
+
+ if (operation >= 30 && operation <= 37)
+ continue;
+
+ if (operation == 10)
+ num--;
+
+ if (operation == stopToken) {
+ if (stopToken != 10 || num < 0) {
+
+ if (saved != 0) {
+ _vm->_global->_inter_execPtr = savedPos;
+ savedPos = 0;
+ }
+ return;
+ }
+ }
+ }
+}
+
+void Parse::printVarIndex() {
+ char *arrDesc;
+ int16 dim;
+ int16 dimCount;
+ int16 operation;
+ int16 temp;
+
+ char *pos = _vm->_global->_inter_execPtr;
+
+ operation = *_vm->_global->_inter_execPtr++;
+ switch (operation) {
+ case 23:
+ case 25:
+ temp = _vm->_inter->load16() * 4;
+ debugN(5, "&var_%d", temp);
+ if (operation == 25 && *_vm->_global->_inter_execPtr == 13) {
+ _vm->_global->_inter_execPtr++;
+ debugN(5, "+");
+ printExpr(12);
+ }
+ break;
+
+ case 26:
+ case 28:
+ debugN(5, "&var_%d[", _vm->_inter->load16());
+ dimCount = *_vm->_global->_inter_execPtr++;
+ arrDesc = _vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr += dimCount;
+ for (dim = 0; dim < dimCount; dim++) {
+ printExpr(12);
+ debugN(5, " of %d", (int16)arrDesc[dim]);
+ if (dim != dimCount - 1)
+ debugN(5, ",");
+ }
+ debugN(5, "]");
+
+ if (operation == 28 && *_vm->_global->_inter_execPtr == 13) {
+ _vm->_global->_inter_execPtr++;
+ debugN(5, "+");
+ printExpr(12);
+ }
+ break;
+
+ default:
+ debugN(5, "var_0");
+ break;
+ }
+ debugN(5, "\n");
+ _vm->_global->_inter_execPtr = pos;
+ return;
+}
+
+} // End of namespace Gob