mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-09 03:10:22 +00:00
DIRECTOR: LINGO: Fix POINT/RECT comparison op
This commit is contained in:
parent
85f9e5239e
commit
aff4813a59
@ -661,13 +661,6 @@ void LC::c_swap() {
|
||||
g_lingo->push(d1);
|
||||
}
|
||||
|
||||
static bool isArray(Datum &d1) {
|
||||
if (d1.type == ARRAY || d1.type == POINT || d1.type == RECT)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static DatumType getArrayAlignedType(Datum &d1, Datum &d2) {
|
||||
if (d1.type == POINT && d2.type == ARRAY && d2.u.farr->arr.size() < 2)
|
||||
return ARRAY;
|
||||
@ -681,7 +674,7 @@ static DatumType getArrayAlignedType(Datum &d1, Datum &d2) {
|
||||
if (d1.type == RECT)
|
||||
return RECT;
|
||||
|
||||
if (!isArray(d1))
|
||||
if (!d1.isArray())
|
||||
return d2.type;
|
||||
|
||||
return ARRAY;
|
||||
@ -690,9 +683,9 @@ static DatumType getArrayAlignedType(Datum &d1, Datum &d2) {
|
||||
Datum LC::mapBinaryOp(Datum (*mapFunc)(Datum &, Datum &), Datum &d1, Datum &d2) {
|
||||
// At least one of d1 and d2 must be an array
|
||||
uint arraySize;
|
||||
if (isArray(d1) && isArray(d2)) {
|
||||
if (d1.isArray() && d2.isArray()) {
|
||||
arraySize = MIN(d1.u.farr->arr.size(), d2.u.farr->arr.size());
|
||||
} else if (isArray(d1)) {
|
||||
} else if (d1.isArray()) {
|
||||
arraySize = d1.u.farr->arr.size();
|
||||
} else {
|
||||
arraySize = d2.u.farr->arr.size();
|
||||
@ -703,10 +696,10 @@ Datum LC::mapBinaryOp(Datum (*mapFunc)(Datum &, Datum &), Datum &d1, Datum &d2)
|
||||
Datum a = d1;
|
||||
Datum b = d2;
|
||||
for (uint i = 0; i < arraySize; i++) {
|
||||
if (isArray(d1)) {
|
||||
if (d1.isArray()) {
|
||||
a = d1.u.farr->arr[i];
|
||||
}
|
||||
if (isArray(d2)) {
|
||||
if (d2.isArray()) {
|
||||
b = d2.u.farr->arr[i];
|
||||
}
|
||||
res.u.farr->arr[i] = mapFunc(a, b);
|
||||
@ -715,7 +708,7 @@ Datum LC::mapBinaryOp(Datum (*mapFunc)(Datum &, Datum &), Datum &d1, Datum &d2)
|
||||
}
|
||||
|
||||
Datum LC::addData(Datum &d1, Datum &d2) {
|
||||
if (isArray(d1) || isArray(d2)) {
|
||||
if (d1.isArray() || d2.isArray()) {
|
||||
return LC::mapBinaryOp(LC::addData, d1, d2);
|
||||
}
|
||||
|
||||
@ -739,7 +732,7 @@ void LC::c_add() {
|
||||
}
|
||||
|
||||
Datum LC::subData(Datum &d1, Datum &d2) {
|
||||
if (isArray(d1) || isArray(d2)) {
|
||||
if (d1.isArray() || d2.isArray()) {
|
||||
return LC::mapBinaryOp(LC::subData, d1, d2);
|
||||
}
|
||||
|
||||
@ -763,7 +756,7 @@ void LC::c_sub() {
|
||||
}
|
||||
|
||||
Datum LC::mulData(Datum &d1, Datum &d2) {
|
||||
if (isArray(d1) || isArray(d2)) {
|
||||
if (d1.isArray() || d2.isArray()) {
|
||||
return LC::mapBinaryOp(LC::mulData, d1, d2);
|
||||
}
|
||||
|
||||
@ -787,7 +780,7 @@ void LC::c_mul() {
|
||||
}
|
||||
|
||||
Datum LC::divData(Datum &d1, Datum &d2) {
|
||||
if (isArray(d1) || isArray(d2)) {
|
||||
if (d1.isArray() || d2.isArray()) {
|
||||
return LC::mapBinaryOp(LC::divData, d1, d2);
|
||||
}
|
||||
|
||||
@ -821,7 +814,7 @@ void LC::c_div() {
|
||||
}
|
||||
|
||||
Datum LC::modData(Datum &d1, Datum &d2) {
|
||||
if (isArray(d1) || isArray(d2)) {
|
||||
if (d1.isArray() || d2.isArray()) {
|
||||
return LC::mapBinaryOp(LC::modData, d1, d2);
|
||||
}
|
||||
|
||||
@ -843,7 +836,7 @@ void LC::c_mod() {
|
||||
}
|
||||
|
||||
Datum LC::negateData(Datum &d) {
|
||||
if (isArray(d)) {
|
||||
if (d.isArray()) {
|
||||
uint arraySize = d.u.farr->arr.size();
|
||||
Datum res;
|
||||
res.type = d.type;
|
||||
@ -1245,15 +1238,15 @@ void LC::c_not() {
|
||||
Datum LC::compareArrays(Datum (*compareFunc)(Datum, Datum), Datum d1, Datum d2, bool location, bool value) {
|
||||
// At least one of d1 and d2 must be an array
|
||||
uint arraySize;
|
||||
if (d1.type == ARRAY && d2.type == ARRAY) {
|
||||
if (d1.isArray() && d2.isArray()) {
|
||||
arraySize = MIN(d1.u.farr->arr.size(), d2.u.farr->arr.size());
|
||||
} else if (d1.type == PARRAY && d2.type == PARRAY) {
|
||||
arraySize = MIN(d1.u.parr->arr.size(), d2.u.parr->arr.size());
|
||||
} else if (d1.type == ARRAY) {
|
||||
} else if (d1.isArray()) {
|
||||
arraySize = d1.u.farr->arr.size();
|
||||
} else if (d1.type == PARRAY) {
|
||||
arraySize = d1.u.parr->arr.size();
|
||||
} else if (d2.type == ARRAY) {
|
||||
} else if (d2.isArray()) {
|
||||
arraySize = d2.u.farr->arr.size();
|
||||
} else if (d2.type == PARRAY) {
|
||||
arraySize = d2.u.parr->arr.size();
|
||||
@ -1267,14 +1260,14 @@ Datum LC::compareArrays(Datum (*compareFunc)(Datum, Datum), Datum d1, Datum d2,
|
||||
Datum a = d1;
|
||||
Datum b = d2;
|
||||
for (uint i = 0; i < arraySize; i++) {
|
||||
if (d1.type == ARRAY) {
|
||||
if (d1.isArray()) {
|
||||
a = d1.u.farr->arr[i];
|
||||
} else if (d1.type == PARRAY) {
|
||||
PCell t = d1.u.parr->arr[i];
|
||||
a = value ? t.v : t.p;
|
||||
}
|
||||
|
||||
if (d2.type == ARRAY) {
|
||||
if (d2.isArray()) {
|
||||
b = d2.u.farr->arr[i];
|
||||
} else if (d2.type == PARRAY) {
|
||||
PCell t = d2.u.parr->arr[i];
|
||||
@ -1299,7 +1292,7 @@ Datum LC::compareArrays(Datum (*compareFunc)(Datum, Datum), Datum d1, Datum d2,
|
||||
|
||||
Datum LC::eqData(Datum d1, Datum d2) {
|
||||
// Lingo doesn't bother checking list equality if the left is longer
|
||||
if (d1.type == ARRAY && d2.type == ARRAY &&
|
||||
if (d1.isArray() && d2.isArray() &&
|
||||
d1.u.farr->arr.size() > d2.u.farr->arr.size()) {
|
||||
return Datum(0);
|
||||
}
|
||||
@ -1307,7 +1300,7 @@ Datum LC::eqData(Datum d1, Datum d2) {
|
||||
d1.u.parr->arr.size() > d2.u.parr->arr.size()) {
|
||||
return Datum(0);
|
||||
}
|
||||
if (d1.type == ARRAY || d2.type == ARRAY ||
|
||||
if (d1.isArray() || d2.isArray() ||
|
||||
d1.type == PARRAY || d2.type == PARRAY) {
|
||||
return LC::compareArrays(LC::eqData, d1, d2, false, true);
|
||||
}
|
||||
@ -1323,7 +1316,7 @@ void LC::c_eq() {
|
||||
}
|
||||
|
||||
Datum LC::neqData(Datum d1, Datum d2) {
|
||||
if (d1.type == ARRAY || d2.type == ARRAY ||
|
||||
if (d1.isArray() || d2.isArray() ||
|
||||
d1.type == PARRAY || d2.type == PARRAY) {
|
||||
return LC::compareArrays(LC::neqData, d1, d2, false, true);
|
||||
}
|
||||
@ -1339,7 +1332,7 @@ void LC::c_neq() {
|
||||
}
|
||||
|
||||
Datum LC::gtData(Datum d1, Datum d2) {
|
||||
if (d1.type == ARRAY || d2.type == ARRAY ||
|
||||
if (d1.isArray() || d2.isArray() ||
|
||||
d1.type == PARRAY || d2.type == PARRAY) {
|
||||
return LC::compareArrays(LC::gtData, d1, d2, false, true);
|
||||
}
|
||||
@ -1355,7 +1348,7 @@ void LC::c_gt() {
|
||||
}
|
||||
|
||||
Datum LC::ltData(Datum d1, Datum d2) {
|
||||
if (d1.type == ARRAY || d2.type == ARRAY ||
|
||||
if (d1.isArray() || d2.isArray() ||
|
||||
d1.type == PARRAY || d2.type == PARRAY) {
|
||||
return LC::compareArrays(LC::ltData, d1, d2, false, true);
|
||||
}
|
||||
@ -1371,7 +1364,7 @@ void LC::c_lt() {
|
||||
}
|
||||
|
||||
Datum LC::geData(Datum d1, Datum d2) {
|
||||
if (d1.type == ARRAY || d2.type == ARRAY ||
|
||||
if (d1.isArray() || d2.isArray() ||
|
||||
d1.type == PARRAY || d2.type == PARRAY) {
|
||||
return LC::compareArrays(LC::geData, d1, d2, false, true);
|
||||
}
|
||||
@ -1387,7 +1380,7 @@ void LC::c_ge() {
|
||||
}
|
||||
|
||||
Datum LC::leData(Datum d1, Datum d2) {
|
||||
if (d1.type == ARRAY || d2.type == ARRAY ||
|
||||
if (d1.isArray() || d2.isArray() ||
|
||||
d1.type == PARRAY || d2.type == PARRAY) {
|
||||
return LC::compareArrays(LC::leData, d1, d2, false, true);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user