[Scummvm-git-logs] scummvm master -> 7180bede717165ae09dc3441e5497eaa628df481

sev- sev at scummvm.org
Thu Jun 11 22:50:40 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
7180bede71 DIRECTOR: LINGO: Proper fix for 'the <builtin> of <expr>'


Commit: 7180bede717165ae09dc3441e5497eaa628df481
    https://github.com/scummvm/scummvm/commit/7180bede717165ae09dc3441e5497eaa628df481
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-06-12T00:50:26+02:00

Commit Message:
DIRECTOR: LINGO: Proper fix for 'the <builtin> of <expr>'

Changed paths:
    engines/director/lingo/lingo-lex.cpp
    engines/director/lingo/lingo-lex.l
    engines/director/lingo/tests/the.lingo


diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp
index 62f329ce14..a7cad39f3a 100644
--- a/engines/director/lingo/lingo-lex.cpp
+++ b/engines/director/lingo/lingo-lex.cpp
@@ -1440,8 +1440,21 @@ YY_RULE_SETUP
 				return THEENTITYWITHID;
 			else
 				return THEENTITY;
+		} else if (g_lingo->_builtins.contains(field)) {
+			if (g_lingo->_builtins[field].type == FBLTIN &&
+					g_lingo->_builtins[field].nargs == 1 && g_lingo->_builtins[field].maxArgs == 1) {
+				yylval.s = new Common::String(field);
+				Common::String rest(ptr);
+
+				for (int i = rest.size() - 1; i >= 0; i--)
+					unput(rest[i]);
+
+				unput(' '); unput('f'); unput('o');
+
+				return THEFBLTIN;
+			}
 		} else {
-			if (g_director->getVersion() >= 3) {
+			if (g_director->getVersion() >= 4) {
 				Common::String key = Common::String::format("%d%s", g_lingo->_objectEntityId, field.c_str());
 
 				if (!g_lingo->_theEntityFields.contains(key)) { // Okay, this must be an object reference
@@ -1463,7 +1476,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 313 "engines/director/lingo/lingo-lex.l"
+#line 326 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1501,7 +1514,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 347 "engines/director/lingo/lingo-lex.l"
+#line 360 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1532,72 +1545,72 @@ YY_RULE_SETUP
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 374 "engines/director/lingo/lingo-lex.l"
+#line 387 "engines/director/lingo/lingo-lex.l"
 { count(); return tTHEN; }
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 375 "engines/director/lingo/lingo-lex.l"
+#line 388 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tTO, "to"); }
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 376 "engines/director/lingo/lingo-lex.l"
+#line 389 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tSPRITE, "sprite"); }
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 377 "engines/director/lingo/lingo-lex.l"
+#line 390 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWITH, "with"); }
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 378 "engines/director/lingo/lingo-lex.l"
+#line 391 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWITHIN, "within"); }
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 379 "engines/director/lingo/lingo-lex.l"
+#line 392 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWHEN, "when"); }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 380 "engines/director/lingo/lingo-lex.l"
+#line 393 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWHILE, "while"); }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 381 "engines/director/lingo/lingo-lex.l"
+#line 394 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWORD, "word"); }
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 383 "engines/director/lingo/lingo-lex.l"
+#line 396 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEQ; }
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 384 "engines/director/lingo/lingo-lex.l"
+#line 397 "engines/director/lingo/lingo-lex.l"
 { count(); return tGE; }
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 385 "engines/director/lingo/lingo-lex.l"
+#line 398 "engines/director/lingo/lingo-lex.l"
 { count(); return tLE; }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 386 "engines/director/lingo/lingo-lex.l"
+#line 399 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONCAT; }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 387 "engines/director/lingo/lingo-lex.l"
+#line 400 "engines/director/lingo/lingo-lex.l"
 { count(); return tEQ; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 389 "engines/director/lingo/lingo-lex.l"
+#line 402 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 		yylval.s = new Common::String(yytext);
@@ -1637,41 +1650,41 @@ YY_RULE_SETUP
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 425 "engines/director/lingo/lingo-lex.l"
+#line 438 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.f = atof(yytext); return FLOAT; }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 426 "engines/director/lingo/lingo-lex.l"
+#line 439 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.i = strtol(yytext, NULL, 10); return INT; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 427 "engines/director/lingo/lingo-lex.l"
+#line 440 "engines/director/lingo/lingo-lex.l"
 { count(); return *yytext; }
 	YY_BREAK
 case 67:
 /* rule 67 can match eol */
 YY_RULE_SETUP
-#line 428 "engines/director/lingo/lingo-lex.l"
+#line 441 "engines/director/lingo/lingo-lex.l"
 { count(); return '\n'; }
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 429 "engines/director/lingo/lingo-lex.l"
+#line 442 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = cleanupString(&yytext[1]); yylval.s->deleteLastChar(); return STRING; }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 430 "engines/director/lingo/lingo-lex.l"
+#line 443 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 432 "engines/director/lingo/lingo-lex.l"
+#line 445 "engines/director/lingo/lingo-lex.l"
 ECHO;
 	YY_BREAK
-#line 1674 "engines/director/lingo/lingo-lex.cpp"
+#line 1687 "engines/director/lingo/lingo-lex.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2680,7 +2693,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 432 "engines/director/lingo/lingo-lex.l"
+#line 445 "engines/director/lingo/lingo-lex.l"
 
 
 extern int yydebug;
diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l
index e1c81eecd9..3b273aa7e2 100644
--- a/engines/director/lingo/lingo-lex.l
+++ b/engines/director/lingo/lingo-lex.l
@@ -290,8 +290,21 @@ the{spc}+[[:alpha:]]+{spc}+of{spc}+{identifier}	{
 				return THEENTITYWITHID;
 			else
 				return THEENTITY;
+		} else if (g_lingo->_builtins.contains(field)) {
+			if (g_lingo->_builtins[field].type == FBLTIN &&
+					g_lingo->_builtins[field].nargs == 1 && g_lingo->_builtins[field].maxArgs == 1) {
+				yylval.s = new Common::String(field);
+				Common::String rest(ptr);
+
+				for (int i = rest.size() - 1; i >= 0; i--)
+					unput(rest[i]);
+
+				unput(' '); unput('f'); unput('o');
+
+				return THEFBLTIN;
+			}
 		} else {
-			if (g_director->getVersion() >= 3) {
+			if (g_director->getVersion() >= 4) {
 				Common::String key = Common::String::format("%d%s", g_lingo->_objectEntityId, field.c_str());
 
 				if (!g_lingo->_theEntityFields.contains(key)) { // Okay, this must be an object reference
diff --git a/engines/director/lingo/tests/the.lingo b/engines/director/lingo/tests/the.lingo
index d68672909e..83a383bab8 100644
--- a/engines/director/lingo/tests/the.lingo
+++ b/engines/director/lingo/tests/the.lingo
@@ -53,3 +53,5 @@ put the sqrt of 9
 put 5 into field the number of cast "MasterList"
 
 set the text of field 1 = "Hello"
+
+set gMarkerName = the length of h + 2




More information about the Scummvm-git-logs mailing list