[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