diff --git a/engines/private/code.cpp b/engines/private/code.cpp index 2a86be5bb4a..9357cf3800b 100644 --- a/engines/private/code.cpp +++ b/engines/private/code.cpp @@ -53,9 +53,6 @@ namespace Private { -Setting *setting; -SettingMap settingMap; - Datum *stack = NULL; /* the stack */ Datum *stackp = NULL; /* next free spot on stack */ @@ -89,8 +86,8 @@ void initInsts() { } } -/* initialize for code generation */ -void initSetting() { +/* initialize setting for code generation */ +void SettingMaps::init() { setting = (Setting *)malloc(sizeof(Setting)); memset((void *)setting, 0, sizeof(Setting)); @@ -101,14 +98,13 @@ void initSetting() { progp = prog; } -void saveSetting(char *name) { - //Common::String s(name); - settingMap.setVal(name, setting); +void SettingMaps::save(char *name) { + map.setVal(name, setting); } -void loadSetting(Common::String *name) { - assert(settingMap.contains(*name)); - setting = settingMap.getVal(*name); +void SettingMaps::load(Common::String *name) { + assert(map.contains(*name)); + setting = map.getVal(*name); debugC(1, kPrivateDebugCode, "loading setting %s", name->c_str()); @@ -155,7 +151,6 @@ int strpush() { /* push constant onto stack */ return 0; } - int varpush() { /* push variable onto stack */ Datum d; d.type = NAME; @@ -287,7 +282,6 @@ int lt() { d2.type = NUM; } - d1.u.val = (int)(d1.u.val < d2.u.val); push(d1); return 0; @@ -311,7 +305,6 @@ int ge() { d2.type = NUM; } - d1.u.val = (int)(d1.u.val >= d2.u.val); push(d1); return 0; @@ -335,7 +328,6 @@ int le() { d2.type = NUM; } - d1.u.val = (int)(d1.u.val <= d2.u.val); push(d1); return 0; @@ -359,7 +351,6 @@ int eq() { d2.type = NUM; } - d1.u.val = (int)(d1.u.val == d2.u.val); push(d1); return 0; @@ -379,7 +370,6 @@ int ne() { d2.type = NUM; } - d1.u.val = (int)(d1.u.val != d2.u.val); push(d1); return 0; diff --git a/engines/private/grammar.cpp b/engines/private/grammar.cpp index 67a0e49d49e..25ed01107de 100644 --- a/engines/private/grammar.cpp +++ b/engines/private/grammar.cpp @@ -68,7 +68,7 @@ /* Substitute the variable and function names. */ #define yyparse PRIVATE_parse #define yylex PRIVATE_lex -#define yyerror PRIVATE_xerror +#define yyerror PRIVATE_error #define yydebug PRIVATE_debug #define yynerrs PRIVATE_nerrs #define yylval PRIVATE_lval @@ -81,6 +81,9 @@ #include "private/private.h" #include "private/grammar.h" +#undef yyerror +#define yyerror PRIVATE_xerror + #define code1(c1) Private::code(c1); #define code2(c1,c2) Private::code(c1); Private::code(c2) #define code3(c1,c2,c3) Private::code(c1); Private::code(c2); Private::code(c3) @@ -99,7 +102,7 @@ int PRIVATE_wrap() { -#line 103 "engines/private/grammar.cpp" +#line 106 "engines/private/grammar.cpp" # ifndef YY_CAST # ifdef __cplusplus @@ -544,12 +547,12 @@ static const yytype_int8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 91, 91, 92, 95, 96, 97, 100, 101, 104, - 105, 108, 115, 116, 121, 129, 130, 133, 136, 139, - 142, 143, 148, 152, 153, 156, 164, 165, 173, 176, - 177, 178, 179, 180, 183, 184, 185, 186, 187, 188, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201 + 0, 94, 94, 95, 98, 99, 100, 104, 105, 108, + 109, 112, 119, 120, 125, 133, 134, 137, 140, 143, + 146, 147, 152, 156, 157, 160, 168, 169, 177, 180, + 181, 182, 183, 184, 187, 188, 189, 190, 191, 192, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205 }; #endif @@ -1196,31 +1199,32 @@ yyreduce: switch (yyn) { case 4: /* line: DEBUGTOK '{' debug '}' */ -#line 95 "engines/private/grammar.y" +#line 98 "engines/private/grammar.y" { /* Not used in the game */ } -#line 1202 "engines/private/grammar.cpp" +#line 1205 "engines/private/grammar.cpp" break; case 5: /* line: DEFINETOK NAME '{' define '}' */ -#line 96 "engines/private/grammar.y" +#line 99 "engines/private/grammar.y" { g_private->maps.installAll((yyvsp[-3].s)); } -#line 1208 "engines/private/grammar.cpp" +#line 1211 "engines/private/grammar.cpp" break; case 6: /* line: SETTINGTOK NAME '{' statements '}' */ -#line 97 "engines/private/grammar.y" - { saveSetting((yyvsp[-3].s)); initSetting(); } -#line 1214 "engines/private/grammar.cpp" +#line 100 "engines/private/grammar.y" + { g_private->settings.save((yyvsp[-3].s)); + g_private->settings.init(); } +#line 1218 "engines/private/grammar.cpp" break; case 9: /* statements: %empty */ -#line 104 "engines/private/grammar.y" +#line 108 "engines/private/grammar.y" { (yyval.inst) = progp; } -#line 1220 "engines/private/grammar.cpp" +#line 1224 "engines/private/grammar.cpp" break; case 11: /* statement: GOTOTOK NAME ';' */ -#line 108 "engines/private/grammar.y" +#line 112 "engines/private/grammar.y" { (yyval.inst) = progp; code2(strpush, (Private::Inst) g_private->maps.constant(STRING, 0, (yyvsp[-1].s))); @@ -1228,99 +1232,99 @@ yyreduce: code2(strpush, (Private::Inst) g_private->maps.constant(STRING, 0, "goto")); code1(funcpush); } -#line 1232 "engines/private/grammar.cpp" +#line 1236 "engines/private/grammar.cpp" break; case 12: /* statement: fcall ';' */ -#line 115 "engines/private/grammar.y" +#line 119 "engines/private/grammar.y" { (yyval.inst) = (yyvsp[-1].inst); } -#line 1238 "engines/private/grammar.cpp" +#line 1242 "engines/private/grammar.cpp" break; case 13: /* statement: if cond body end */ -#line 116 "engines/private/grammar.y" +#line 120 "engines/private/grammar.y" { /* else-less if */ ((yyvsp[-3].inst))[1] = (Inst)(yyvsp[-1].inst); /* thenpart */ ((yyvsp[-3].inst))[3] = (Inst)(yyvsp[0].inst); } -#line 1248 "engines/private/grammar.cpp" +#line 1252 "engines/private/grammar.cpp" break; case 14: /* statement: if cond body end ELSETOK body end */ -#line 121 "engines/private/grammar.y" +#line 125 "engines/private/grammar.y" { /* if with else */ ((yyvsp[-6].inst))[1] = (Inst)(yyvsp[-4].inst); /* thenpart */ ((yyvsp[-6].inst))[2] = (Inst)(yyvsp[-1].inst); /* elsepart */ ((yyvsp[-6].inst))[3] = (Inst)(yyvsp[0].inst); } -#line 1259 "engines/private/grammar.cpp" +#line 1263 "engines/private/grammar.cpp" break; case 15: /* body: statement */ -#line 129 "engines/private/grammar.y" +#line 133 "engines/private/grammar.y" { (yyval.inst) = (yyvsp[0].inst); } -#line 1265 "engines/private/grammar.cpp" +#line 1269 "engines/private/grammar.cpp" break; case 16: /* body: '{' statements '}' */ -#line 130 "engines/private/grammar.y" +#line 134 "engines/private/grammar.y" { (yyval.inst) = (yyvsp[-1].inst); } -#line 1271 "engines/private/grammar.cpp" +#line 1275 "engines/private/grammar.cpp" break; case 17: /* end: %empty */ -#line 133 "engines/private/grammar.y" +#line 137 "engines/private/grammar.y" { code(STOP); (yyval.inst) = progp; } -#line 1277 "engines/private/grammar.cpp" +#line 1281 "engines/private/grammar.cpp" break; case 18: /* if: IFTOK */ -#line 136 "engines/private/grammar.y" +#line 140 "engines/private/grammar.y" { (yyval.inst) = code(ifcode); code3(STOP, STOP, STOP); } -#line 1283 "engines/private/grammar.cpp" +#line 1287 "engines/private/grammar.cpp" break; case 19: /* cond: '(' expr ')' */ -#line 139 "engines/private/grammar.y" +#line 143 "engines/private/grammar.y" { code(STOP); (yyval.inst) = (yyvsp[-1].inst); } -#line 1289 "engines/private/grammar.cpp" +#line 1293 "engines/private/grammar.cpp" break; case 21: /* define: NAME ',' RECT '(' NUM ',' NUM ',' NUM ',' NUM ')' ',' define */ -#line 143 "engines/private/grammar.y" +#line 147 "engines/private/grammar.y" { Common::Rect *r = new Common::Rect((yyvsp[-9].sym)->u.val, (yyvsp[-7].sym)->u.val, (yyvsp[-5].sym)->u.val, (yyvsp[-3].sym)->u.val); assert(r->isValidRect()); g_private->maps.defineSymbol((yyvsp[-13].s), r); } -#line 1299 "engines/private/grammar.cpp" +#line 1303 "engines/private/grammar.cpp" break; case 22: /* define: NAME ',' RECT '(' NUM ',' NUM ',' NUM ',' NUM ')' */ -#line 148 "engines/private/grammar.y" +#line 152 "engines/private/grammar.y" { Common::Rect *r = new Common::Rect((yyvsp[-7].sym)->u.val, (yyvsp[-5].sym)->u.val, (yyvsp[-3].sym)->u.val, (yyvsp[-1].sym)->u.val); g_private->maps.defineSymbol((yyvsp[-11].s), r); } -#line 1308 "engines/private/grammar.cpp" +#line 1312 "engines/private/grammar.cpp" break; case 23: /* define: NAME ',' define */ -#line 152 "engines/private/grammar.y" +#line 156 "engines/private/grammar.y" { g_private->maps.defineSymbol((yyvsp[-2].s), NULL); } -#line 1314 "engines/private/grammar.cpp" +#line 1318 "engines/private/grammar.cpp" break; case 24: /* define: NAME */ -#line 153 "engines/private/grammar.y" +#line 157 "engines/private/grammar.y" { g_private->maps.defineSymbol((yyvsp[0].s), NULL); } -#line 1320 "engines/private/grammar.cpp" +#line 1324 "engines/private/grammar.cpp" break; case 25: /* fcall: GOTOTOK '(' NAME ')' */ -#line 156 "engines/private/grammar.y" +#line 160 "engines/private/grammar.y" { (yyval.inst) = progp; code2(strpush, (Private::Inst) g_private->maps.constant(STRING, 0, (yyvsp[-1].s))); @@ -1328,166 +1332,166 @@ yyreduce: code2(strpush, (Private::Inst) g_private->maps.constant(STRING, 0, "goto")); code1(funcpush); } -#line 1332 "engines/private/grammar.cpp" +#line 1336 "engines/private/grammar.cpp" break; case 26: /* fcall: RECT '(' NUM ',' NUM ',' NUM ',' NUM ')' */ -#line 164 "engines/private/grammar.y" +#line 168 "engines/private/grammar.y" { (yyval.inst) = progp; } -#line 1338 "engines/private/grammar.cpp" +#line 1342 "engines/private/grammar.cpp" break; case 27: /* fcall: NAME '(' startp params ')' */ -#line 165 "engines/private/grammar.y" +#line 169 "engines/private/grammar.y" { (yyval.inst) = (yyvsp[-2].inst); code2(constpush, (Private::Inst) g_private->maps.constant(NUM, (yyvsp[-1].narg), NULL)); code2(strpush, (Private::Inst) g_private->maps.constant(STRING, 0, (yyvsp[-4].s))); code1(funcpush); } -#line 1349 "engines/private/grammar.cpp" +#line 1353 "engines/private/grammar.cpp" break; case 28: /* startp: %empty */ -#line 173 "engines/private/grammar.y" +#line 177 "engines/private/grammar.y" { (yyval.inst) = progp; } -#line 1355 "engines/private/grammar.cpp" +#line 1359 "engines/private/grammar.cpp" break; case 29: /* params: %empty */ -#line 176 "engines/private/grammar.y" +#line 180 "engines/private/grammar.y" { (yyval.narg) = 0; } -#line 1361 "engines/private/grammar.cpp" +#line 1365 "engines/private/grammar.cpp" break; case 30: /* params: fcall ',' params */ -#line 177 "engines/private/grammar.y" +#line 181 "engines/private/grammar.y" { (yyval.narg) = (yyvsp[0].narg) + 1; } -#line 1367 "engines/private/grammar.cpp" +#line 1371 "engines/private/grammar.cpp" break; case 31: /* params: expr ',' params */ -#line 178 "engines/private/grammar.y" +#line 182 "engines/private/grammar.y" { (yyval.narg) = (yyvsp[0].narg) + 1; } -#line 1373 "engines/private/grammar.cpp" +#line 1377 "engines/private/grammar.cpp" break; case 32: /* params: expr */ -#line 179 "engines/private/grammar.y" +#line 183 "engines/private/grammar.y" { (yyval.narg) = 1; } -#line 1379 "engines/private/grammar.cpp" +#line 1383 "engines/private/grammar.cpp" break; case 33: /* params: fcall */ -#line 180 "engines/private/grammar.y" +#line 184 "engines/private/grammar.y" { (yyval.narg) = 1; } -#line 1385 "engines/private/grammar.cpp" +#line 1389 "engines/private/grammar.cpp" break; case 34: /* value: NULLTOK */ -#line 183 "engines/private/grammar.y" +#line 187 "engines/private/grammar.y" { code2(Private::constpush, (Private::Inst) g_private->maps.constant(NUM, 0, NULL)); } -#line 1391 "engines/private/grammar.cpp" +#line 1395 "engines/private/grammar.cpp" break; case 35: /* value: FALSETOK */ -#line 184 "engines/private/grammar.y" +#line 188 "engines/private/grammar.y" { code2(Private::constpush, (Private::Inst) g_private->maps.constant(NUM, 0, NULL)); } -#line 1397 "engines/private/grammar.cpp" +#line 1401 "engines/private/grammar.cpp" break; case 36: /* value: TRUETOK */ -#line 185 "engines/private/grammar.y" +#line 189 "engines/private/grammar.y" { code2(Private::constpush, (Private::Inst) g_private->maps.constant(NUM, 1, NULL)); } -#line 1403 "engines/private/grammar.cpp" +#line 1407 "engines/private/grammar.cpp" break; case 37: /* value: NUM */ -#line 186 "engines/private/grammar.y" +#line 190 "engines/private/grammar.y" { code2(Private::constpush, (Private::Inst)(yyvsp[0].sym)); } -#line 1409 "engines/private/grammar.cpp" +#line 1413 "engines/private/grammar.cpp" break; case 38: /* value: STRING */ -#line 187 "engines/private/grammar.y" +#line 191 "engines/private/grammar.y" { code2(Private::strpush, (Private::Inst)(yyvsp[0].sym)); } -#line 1415 "engines/private/grammar.cpp" +#line 1419 "engines/private/grammar.cpp" break; case 39: /* value: NAME */ -#line 188 "engines/private/grammar.y" +#line 192 "engines/private/grammar.y" { code1(Private::varpush); code1((Private::Inst) g_private->maps.lookupName((yyvsp[0].s))); code1(Private::eval); } -#line 1421 "engines/private/grammar.cpp" +#line 1425 "engines/private/grammar.cpp" break; case 40: /* expr: value */ -#line 191 "engines/private/grammar.y" +#line 195 "engines/private/grammar.y" { (yyval.inst) = (yyvsp[0].inst); } -#line 1427 "engines/private/grammar.cpp" +#line 1431 "engines/private/grammar.cpp" break; case 41: /* expr: '!' value */ -#line 192 "engines/private/grammar.y" +#line 196 "engines/private/grammar.y" { code1(Private::negate); (yyval.inst) = (yyvsp[0].inst); } -#line 1433 "engines/private/grammar.cpp" +#line 1437 "engines/private/grammar.cpp" break; case 42: /* expr: value EQ value */ -#line 193 "engines/private/grammar.y" +#line 197 "engines/private/grammar.y" { code1(Private::eq); } -#line 1439 "engines/private/grammar.cpp" +#line 1443 "engines/private/grammar.cpp" break; case 43: /* expr: value NEQ value */ -#line 194 "engines/private/grammar.y" +#line 198 "engines/private/grammar.y" { code1(Private::ne); } -#line 1445 "engines/private/grammar.cpp" +#line 1449 "engines/private/grammar.cpp" break; case 44: /* expr: value '+' value */ -#line 195 "engines/private/grammar.y" +#line 199 "engines/private/grammar.y" { code1(Private::add); } -#line 1451 "engines/private/grammar.cpp" +#line 1455 "engines/private/grammar.cpp" break; case 45: /* expr: value '<' value */ -#line 196 "engines/private/grammar.y" +#line 200 "engines/private/grammar.y" { code1(Private::lt); } -#line 1457 "engines/private/grammar.cpp" +#line 1461 "engines/private/grammar.cpp" break; case 46: /* expr: value '>' value */ -#line 197 "engines/private/grammar.y" +#line 201 "engines/private/grammar.y" { code1(Private::gt); } -#line 1463 "engines/private/grammar.cpp" +#line 1467 "engines/private/grammar.cpp" break; case 47: /* expr: value LTE value */ -#line 198 "engines/private/grammar.y" +#line 202 "engines/private/grammar.y" { code1(Private::le); } -#line 1469 "engines/private/grammar.cpp" +#line 1473 "engines/private/grammar.cpp" break; case 48: /* expr: value GTE value */ -#line 199 "engines/private/grammar.y" +#line 203 "engines/private/grammar.y" { code1(Private::ge); } -#line 1475 "engines/private/grammar.cpp" +#line 1479 "engines/private/grammar.cpp" break; case 49: /* expr: value '+' */ -#line 200 "engines/private/grammar.y" +#line 204 "engines/private/grammar.y" { (yyval.inst) = (yyvsp[-1].inst); } -#line 1481 "engines/private/grammar.cpp" +#line 1485 "engines/private/grammar.cpp" break; case 50: /* expr: RANDOMTOK '(' NUM '%' ')' */ -#line 201 "engines/private/grammar.y" +#line 205 "engines/private/grammar.y" { code3(Private::constpush, (Private::Inst)(yyvsp[-2].sym), randbool); } -#line 1487 "engines/private/grammar.cpp" +#line 1491 "engines/private/grammar.cpp" break; -#line 1491 "engines/private/grammar.cpp" +#line 1495 "engines/private/grammar.cpp" default: break; } diff --git a/engines/private/grammar.h b/engines/private/grammar.h index 8596a3b1af8..7dfeb0fc10e 100644 --- a/engines/private/grammar.h +++ b/engines/private/grammar.h @@ -75,10 +75,20 @@ typedef struct Setting { // Settings -extern Setting *psetting; typedef Common::HashMap SettingMap; +class SettingMaps { + public: + Setting *psetting; + Setting *setting; + SettingMap map; + + void init(); + void save(char *); + void load(Common::String *); +}; + // Funtions typedef Common::Array ArgArray; @@ -115,9 +125,6 @@ int randbool(); // Code Execution -void initSetting(); -void saveSetting(char *); -void loadSetting(Common::String *); void execute(Inst *); diff --git a/engines/private/grammar.y b/engines/private/grammar.y index 5881d9a4337..be1d1482990 100644 --- a/engines/private/grammar.y +++ b/engines/private/grammar.y @@ -53,6 +53,9 @@ #include "private/private.h" #include "private/grammar.h" +#undef yyerror +#define yyerror PRIVATE_xerror + #define code1(c1) Private::code(c1); #define code2(c1,c2) Private::code(c1); Private::code(c2) #define code3(c1,c2,c3) Private::code(c1); Private::code(c2); Private::code(c3) @@ -94,7 +97,8 @@ lines: line lines line: DEBUGTOK '{' debug '}' { /* Not used in the game */ } | DEFINETOK NAME '{' define '}' { g_private->maps.installAll($NAME); } - | SETTINGTOK NAME '{' statements '}' { saveSetting($NAME); initSetting(); } + | SETTINGTOK NAME '{' statements '}' { g_private->settings.save($NAME); + g_private->settings.init(); } ; debug: /* nothing */ diff --git a/engines/private/lexer.cpp b/engines/private/lexer.cpp index 07780b847a7..e2f8a740fc5 100644 --- a/engines/private/lexer.cpp +++ b/engines/private/lexer.cpp @@ -2184,7 +2184,7 @@ void yyfree (void * ptr ) namespace Private { int parse(char *code) { - initSetting(); + g_private->settings.init(); YY_BUFFER_STATE bp; yy_delete_buffer(YY_CURRENT_BUFFER); bp = yy_scan_string(code); diff --git a/engines/private/lexer.l b/engines/private/lexer.l index cf03181e9f3..ad448d49cc5 100644 --- a/engines/private/lexer.l +++ b/engines/private/lexer.l @@ -64,7 +64,7 @@ Random return RANDOMTOK; namespace Private { int parse(char *code) { - initSetting(); + g_private->settings.init(); YY_BUFFER_STATE bp; yy_delete_buffer(YY_CURRENT_BUFFER); bp = yy_scan_string(code); diff --git a/engines/private/private.cpp b/engines/private/private.cpp index ce2fc5f1f2b..beaad2c4849 100644 --- a/engines/private/private.cpp +++ b/engines/private/private.cpp @@ -277,7 +277,7 @@ Common::Error PrivateEngine::run() { debugC(1, kPrivateDebugFunction, "Executing %s", _nextSetting->c_str()); clearAreas(); _currentSetting = _nextSetting; - loadSetting(_nextSetting); + settings.load(_nextSetting); _nextSetting = NULL; execute(prog); changeCursor("default"); diff --git a/engines/private/private.h b/engines/private/private.h index ba358c8ee9b..6bb344913a9 100644 --- a/engines/private/private.h +++ b/engines/private/private.h @@ -134,6 +134,7 @@ public: bool isDemo() const; SymbolMaps maps; + SettingMaps settings; Audio::SoundHandle _fgSoundHandle; Audio::SoundHandle _bgSoundHandle; diff --git a/engines/private/tokens.h b/engines/private/tokens.h index 1e3e25462ea..bde0cf6a55e 100644 --- a/engines/private/tokens.h +++ b/engines/private/tokens.h @@ -88,7 +88,7 @@ extern int PRIVATE_debug; #if ! defined PRIVATE_STYPE && ! defined PRIVATE_STYPE_IS_DECLARED union PRIVATE_STYPE { -#line 75 "engines/private/grammar.y" +#line 78 "engines/private/grammar.y" Private::Symbol *sym; /* symbol table pointer */ int (**inst)(); /* machine instruction */