[Scummvm-git-logs] scummvm master -> 35e68aece3663ade86baa47b344d6ae684e2b804

djsrv dservilla at gmail.com
Wed Jun 9 01:22:46 UTC 2021


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

Summary:
b073fe1fea DIRECTOR: LINGO: Fix char bound check
35e68aece3 DIRECTOR: LINGO: Fix chunk refs with start < 1


Commit: b073fe1fea3b0c7444abd4d6d6785360181ff313
    https://github.com/scummvm/scummvm/commit/b073fe1fea3b0c7444abd4d6d6785360181ff313
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-08T21:00:12-04:00

Commit Message:
DIRECTOR: LINGO: Fix char bound check

Changed paths:
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index a61470a93a..cfc6bc6055 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -904,7 +904,7 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 			chunkNum = str.size();
 			chunkStartIdx = str.size() - 1;
 			chunkEndIdx = str.size();
-		} else if (str.size() > 0) {
+		} else if (startChunk <= (int)str.size()) {
 			exprStartIdx = MIN(startChunk, (int)str.size()) - 1;
 			exprEndIdx = MIN(endChunk, (int)str.size());
 		}


Commit: 35e68aece3663ade86baa47b344d6ae684e2b804
    https://github.com/scummvm/scummvm/commit/35e68aece3663ade86baa47b344d6ae684e2b804
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-08T21:20:19-04:00

Commit Message:
DIRECTOR: LINGO: Fix chunk refs with start < 1

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-code.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index fea287eb07..a4808c6925 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2439,49 +2439,49 @@ void LB::b_window(int nargs) {
 
 void LB::b_numberofchars(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkChar, 0, 0, d); // get reference to last char
+	Datum chunkRef = LC::lastChunk(kChunkChar, d);
 	g_lingo->push(chunkRef.u.cref->startChunk);
 }
 
 void LB::b_numberofitems(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkItem, 0, 0, d); // get reference to last item
+	Datum chunkRef = LC::lastChunk(kChunkItem, d);
 	g_lingo->push(chunkRef.u.cref->startChunk);
 }
 
 void LB::b_numberoflines(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkLine, 0, 0, d); // get reference to last line
+	Datum chunkRef = LC::lastChunk(kChunkLine, d);
 	g_lingo->push(chunkRef.u.cref->startChunk);
 }
 
 void LB::b_numberofwords(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkWord, 0, 0, d); // get reference to last word
+	Datum chunkRef = LC::lastChunk(kChunkWord, d);
 	g_lingo->push(chunkRef.u.cref->startChunk);
 }
 
 void LB::b_lastcharof(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkChar, 0, 0, d); // get reference to last char
+	Datum chunkRef = LC::lastChunk(kChunkChar, d);
 	g_lingo->push(chunkRef.eval());
 }
 
 void LB::b_lastitemof(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkItem, 0, 0, d); // get reference to last item
+	Datum chunkRef = LC::lastChunk(kChunkItem, d);
 	g_lingo->push(chunkRef.eval());
 }
 
 void LB::b_lastlineof(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkLine, 0, 0, d); // get reference to last line
+	Datum chunkRef = LC::lastChunk(kChunkLine, d);
 	g_lingo->push(chunkRef.eval());
 }
 
 void LB::b_lastwordof(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum chunkRef = LC::chunkRef(kChunkWord, 0, 0, d); // get reference to last word
+	Datum chunkRef = LC::lastChunk(kChunkWord, d);
 	g_lingo->push(chunkRef.eval());
 }
 
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index d54f25aa03..db32e786e4 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -695,7 +695,7 @@ void LC::cb_v4theentitypush() {
 					chunkType = kChunkItem;
 					break;
 				}
-				Datum chunkRef = LC::chunkRef(chunkType, 0, 0, stringArg); // get reference to last of chunk type
+				Datum chunkRef = LC::lastChunk(chunkType, stringArg);
 				switch (field) {
 				case kTheLast:
 					result = chunkRef.eval();
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index cfc6bc6055..431cc19284 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -874,15 +874,19 @@ void LC::c_within() {
 	}
 }
 
-Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &src) {
+Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &src, bool returnLast) {
 	// A chunk expression is made up of 0 or more chunks within a source text.
 	// This function returns a reference to the source text, the start index of the first chunk,
 	// and the end index of the last chunk in the chunk expression.
-	// If startChunk < 1, return the last chunk.
 
 	if (0 > endChunk && endChunk < startChunk)
 		return src;
 
+	// If startChunk < 1 && returnLast, we'll return the last chunk.
+	// Otherwise, the default is to return the full string.
+	if (startChunk < 1 && !returnLast)
+		return src;
+
 	if (endChunk < 1)
 		endChunk = startChunk;
 
@@ -1002,6 +1006,10 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 	return res;
 }
 
+Datum LC::lastChunk(ChunkType type, const Datum &src) {
+	return chunkRef(type, 0, 0, src, true);
+}
+
 Datum LC::readChunkRef(const Datum &src) {
 	Datum lastLine = g_lingo->pop();
 	Datum firstLine = g_lingo->pop();
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index 8da24fea9b..3db90833b8 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -56,7 +56,8 @@ void c_starts();
 
 void c_intersects();
 void c_within();
-Datum chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &src);
+Datum chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &src, bool returnLast = false);
+Datum lastChunk(ChunkType type, const Datum &src);
 Datum readChunkRef(const Datum &src);
 void c_of();
 void c_charOf();




More information about the Scummvm-git-logs mailing list