aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/director/lingo/lingo-funcs.cpp41
-rw-r--r--engines/director/lingo/lingo-gr.cpp48
-rw-r--r--engines/director/lingo/lingo-gr.h2
-rw-r--r--engines/director/lingo/lingo-gr.y4
-rw-r--r--engines/director/lingo/lingo.cpp1
-rw-r--r--engines/director/lingo/lingo.h6
6 files changed, 71 insertions, 31 deletions
diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp
index 1fb4c19bee..4557ace065 100644
--- a/engines/director/lingo/lingo-funcs.cpp
+++ b/engines/director/lingo/lingo-funcs.cpp
@@ -165,7 +165,24 @@ void Lingo::exec_mciwait(Common::String *s) {
warning("MCI wait file: %s", s->c_str());
}
+void Lingo::push(Datum d) {
+ _stack.push_back(d);
+}
+
+Datum Lingo::pop(void) {
+ if (_stack.size() == 0)
+ error("stack underflow");
+
+ Datum ret = _stack.back();
+ _stack.pop_back();
+
+ return ret;
+}
+
void Lingo::func_constpush() {
+ Datum d;
+ d.val = ((Symbol *)*g_lingo->_pc++)->u.val;
+ g_lingo->push(d);
}
void Lingo::func_varpush() {
@@ -178,15 +195,39 @@ void Lingo::func_eval() {
}
void Lingo::func_add() {
+ Datum d1, d2;
+ d2 = g_lingo->pop();
+ d1 = g_lingo->pop();
+ d1.val += d2.val;
+ g_lingo->push(d1);
}
void Lingo::func_sub() {
+ Datum d1, d2;
+ d2 = g_lingo->pop();
+ d1 = g_lingo->pop();
+ d1.val -= d2.val;
+ g_lingo->push(d1);
}
void Lingo::func_mul() {
+ Datum d1, d2;
+ d2 = g_lingo->pop();
+ d1 = g_lingo->pop();
+ d1.val *= d2.val;
+ g_lingo->push(d1);
}
void Lingo::func_div() {
+ Datum d1, d2;
+ d2 = g_lingo->pop();
+
+ if (d2.val == 0)
+ error("division by zero");
+
+ d1 = g_lingo->pop();
+ d1.val /= d2.val;
+ g_lingo->push(d1);
}
void Lingo::func_negate() {
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 4950ee44b2..21164ed451 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -111,10 +111,6 @@ void yyerror(char *s) { warning("%s", s); }
using namespace Director;
-namespace Director {
-extern Lingo *g_lingo;
-}
-
/* Enabling traces. */
@@ -137,10 +133,10 @@ extern Lingo *g_lingo;
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
-#line 43 "engines/director/lingo/lingo-gr.y"
+#line 39 "engines/director/lingo/lingo-gr.y"
{ float f; int i; Common::String *s; }
/* Line 193 of yacc.c. */
-#line 144 "engines/director/lingo/lingo-gr.cpp"
+#line 140 "engines/director/lingo/lingo-gr.cpp"
YYSTYPE;
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
@@ -153,7 +149,7 @@ typedef union YYSTYPE
/* Line 216 of yacc.c. */
-#line 157 "engines/director/lingo/lingo-gr.cpp"
+#line 153 "engines/director/lingo/lingo-gr.cpp"
#ifdef short
# undef short
@@ -443,9 +439,9 @@ static const yytype_int8 yyrhs[] =
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint8 yyrline[] =
{
- 0, 67, 67, 68, 71, 72, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 87, 88, 89, 90,
- 91
+ 0, 63, 63, 64, 67, 68, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 83, 84, 85, 86,
+ 87
};
#endif
@@ -1369,78 +1365,78 @@ yyreduce:
switch (yyn)
{
case 6:
-#line 75 "engines/director/lingo/lingo-gr.y"
+#line 71 "engines/director/lingo/lingo-gr.y"
{ (yyval.i) = g_lingo->code2(g_lingo->func_constpush, (inst)(yyvsp[(1) - (1)].i)); ;}
break;
case 7:
-#line 76 "engines/director/lingo/lingo-gr.y"
+#line 72 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str()); (yyval.i) = g_lingo->code1(g_lingo->func_eval); delete (yyvsp[(1) - (1)].s); ;}
break;
case 8:
-#line 77 "engines/director/lingo/lingo-gr.y"
+#line 73 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_add); ;}
break;
case 9:
-#line 78 "engines/director/lingo/lingo-gr.y"
+#line 74 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_sub); ;}
break;
case 10:
-#line 79 "engines/director/lingo/lingo-gr.y"
+#line 75 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_mul); ;}
break;
case 11:
-#line 80 "engines/director/lingo/lingo-gr.y"
+#line 76 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_div); ;}
break;
case 12:
-#line 81 "engines/director/lingo/lingo-gr.y"
+#line 77 "engines/director/lingo/lingo-gr.y"
{ (yyval.i) = (yyvsp[(2) - (2)].i); ;}
break;
case 13:
-#line 82 "engines/director/lingo/lingo-gr.y"
+#line 78 "engines/director/lingo/lingo-gr.y"
{ (yyval.i) = (yyvsp[(2) - (2)].i); g_lingo->code1(g_lingo->func_negate); ;}
break;
case 14:
-#line 83 "engines/director/lingo/lingo-gr.y"
+#line 79 "engines/director/lingo/lingo-gr.y"
{ (yyval.i) = (yyvsp[(2) - (3)].i); ;}
break;
case 16:
-#line 87 "engines/director/lingo/lingo-gr.y"
+#line 83 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_mci); g_lingo->codeString((yyvsp[(2) - (2)].s)->c_str()); delete (yyvsp[(2) - (2)].s); ;}
break;
case 17:
-#line 88 "engines/director/lingo/lingo-gr.y"
+#line 84 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_mciwait); g_lingo->codeString((yyvsp[(2) - (2)].s)->c_str()); delete (yyvsp[(2) - (2)].s); ;}
break;
case 18:
-#line 89 "engines/director/lingo/lingo-gr.y"
+#line 85 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(4) - (4)].s)->c_str()); g_lingo->code1(g_lingo->func_assign); (yyval.i) = (yyvsp[(2) - (4)].i); delete (yyvsp[(4) - (4)].s); ;}
break;
case 19:
-#line 90 "engines/director/lingo/lingo-gr.y"
+#line 86 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(2) - (4)].s)->c_str()); g_lingo->code1(g_lingo->func_assign); (yyval.i) = (yyvsp[(4) - (4)].i); delete (yyvsp[(2) - (4)].s); ;}
break;
case 20:
-#line 91 "engines/director/lingo/lingo-gr.y"
+#line 87 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(2) - (4)].s)->c_str()); g_lingo->code1(g_lingo->func_assign); (yyval.i) = (yyvsp[(4) - (4)].i); delete (yyvsp[(2) - (4)].s); ;}
break;
/* Line 1267 of yacc.c. */
-#line 1444 "engines/director/lingo/lingo-gr.cpp"
+#line 1440 "engines/director/lingo/lingo-gr.cpp"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -1654,6 +1650,6 @@ yyreturn:
}
-#line 94 "engines/director/lingo/lingo-gr.y"
+#line 90 "engines/director/lingo/lingo-gr.y"
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index 90f23d642e..81753f7c9b 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -70,7 +70,7 @@
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
-#line 43 "engines/director/lingo/lingo-gr.y"
+#line 39 "engines/director/lingo/lingo-gr.y"
{ float f; int i; Common::String *s; }
/* Line 1529 of yacc.c. */
#line 77 "engines/director/lingo/lingo-gr.hpp"
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index aadcd3c11a..7d73f6707e 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -34,10 +34,6 @@ void yyerror(char *s) { warning("%s", s); }
using namespace Director;
-namespace Director {
-extern Lingo *g_lingo;
-}
-
%}
%union { float f; int i; Common::String *s; }
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 141f227af8..4ac9c12ed3 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -73,6 +73,7 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
_eventHandlerTypes[t->handler] = t->name;
_currentScript = 0;
+ _pc = 0;
warning("Lingo Inited");
}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 34bb6b0ad1..bfb5a765df 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -125,6 +125,8 @@ public:
private:
int parse(const char *code);
+ void push(Datum d);
+ Datum pop(void);
Common::HashMap<uint32, const char *> _eventHandlerTypes;
Common::HashMap<Common::String, Audio::AudioStream *> _audioAliases;
@@ -132,11 +134,15 @@ private:
ScriptHash _scripts[kMaxScriptType + 1];
ScriptData *_currentScript;
+ inst *_pc;
+
StackData _stack;
DirectorEngine *_vm;
};
+extern Lingo *g_lingo;
+
} // End of namespace Director
#endif