[Scummvm-git-logs] scummvm master -> 5188993440ce71ea346d5e56c31c67bbba246a2a
scemino
noreply at scummvm.org
Fri Apr 5 21:07:11 UTC 2024
This automated email contains information about 16 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
ddc7b27c1e TWP: Fix unreachable code detected in savegame. PVS-Studio V779
410b41d3f1 TWP: Fix consider inspecting the 'sqget' function. The return value is not always used. PVS-Studio V1071
19f7c579df TWP: Remove unused squirrel files
ca035348bf TWP: Fix out-of-bounds access in squirrel.
cd69641753 TWP: Fix uninitialized pointer field in squirrel.
ae007b1cc1 TWP: Fix uninitialized scalar field in squirrel.
77831edb7f TWP: Fix uninitialized pointer field in squirrel.
e6c90819fa TWP: Fix uninitialized pointer field in squirrel.
4e10c9c7e4 TWP: Fix uninitialized pointer field in squirrel.
dd9bc4b51c TWP: Fix uninitialized pointer field in squirrel.
a0cb61f022 TWP: Fix uninitialized pointer field in squirrel.
ad29f164d5 TWP: Fix structurally dead code field in squirrel.
f0046daa22 TWP: Fix structurally dead code field in squirrel.
4b9aad2271 TWP: Fix improper use of negative value in squirrel.
1054d03138 TWP: Fix structurally dead code field in squirrel.
5188993440 TWP: Fix invalid type in argument to printf format specifier in squirrel.
Commit: ddc7b27c1e9984de2d8ee845dac677bbe9381036
https://github.com/scummvm/scummvm/commit/ddc7b27c1e9984de2d8ee845dac677bbe9381036
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T20:12:33+02:00
Commit Message:
TWP: Fix unreachable code detected in savegame. PVS-Studio V779
Changed paths:
engines/twp/savegame.cpp
diff --git a/engines/twp/savegame.cpp b/engines/twp/savegame.cpp
index 26eaf40c849..fb4a7284a84 100644
--- a/engines/twp/savegame.cpp
+++ b/engines/twp/savegame.cpp
@@ -408,8 +408,8 @@ bool SaveGameManager::loadGame(Common::SeekableReadStream &stream) {
const Common::JSONObject &json = jSavegame->asObject();
long long int version = json["version"]->asIntegerNumber();
if (version != 2) {
- error("Cannot load savegame version %lld", version);
delete jSavegame;
+ error("Cannot load savegame version %lld", version);
return false;
}
uint32 gameTime = (uint32)json["gameTime"]->asNumber();
Commit: 410b41d3f1e0b2744eb2f31ceafde2dc030bc858
https://github.com/scummvm/scummvm/commit/410b41d3f1e0b2744eb2f31ceafde2dc030bc858
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T21:54:53+02:00
Commit Message:
TWP: Fix consider inspecting the 'sqget' function. The return value is not always used. PVS-Studio V1071
Changed paths:
engines/twp/actorlib.cpp
engines/twp/enginedialogtarget.cpp
engines/twp/genlib.cpp
engines/twp/motor.cpp
engines/twp/object.cpp
engines/twp/object.h
engines/twp/objlib.cpp
engines/twp/roomlib.cpp
engines/twp/savegame.cpp
engines/twp/savegame.h
engines/twp/squtil.cpp
engines/twp/squtil.h
engines/twp/twp.cpp
diff --git a/engines/twp/actorlib.cpp b/engines/twp/actorlib.cpp
index ca80ea3387b..8aba70591bd 100644
--- a/engines/twp/actorlib.cpp
+++ b/engines/twp/actorlib.cpp
@@ -66,10 +66,14 @@ static SQInteger actorAnimationNames(HSQUIRRELVM v) {
Common::String stand;
Common::String walk;
Common::String reach;
- sqgetf(table, "head", head);
- sqgetf(table, "stand", stand);
- sqgetf(table, "walk", walk);
- sqgetf(table, "reach", reach);
+ if (sqrawexists(table, "head") && SQ_FAILED(sqgetf(table, "head", head)))
+ return sq_throwerror(v, "failed to get head");
+ if (sqrawexists(table, "stand") && SQ_FAILED(sqgetf(table, "stand", stand)))
+ return sq_throwerror(v, "failed to get stand");
+ if (sqrawexists(table, "walk") && SQ_FAILED(sqgetf(table, "walk", walk)))
+ return sq_throwerror(v, "failed to get walk");
+ if (sqrawexists(table, "reach") && SQ_FAILED(sqgetf(table, "reach", reach)))
+ return sq_throwerror(v, "failed to get reach");
actor->setAnimationNames(head, stand, walk, reach);
return 0;
}
@@ -427,7 +431,8 @@ static SQInteger actorSlotSelectable(HSQUIRRELVM v) {
if (!actor)
return sq_throwerror(v, "failed to get actor");
Common::String key;
- sqgetf(actor->_table, "_key", key);
+ if (SQ_FAILED(sqgetf(actor->_table, "_key", key)))
+ return sq_throwerror(v, "failed to get actor key");
debugC(kDebugActScript, "actorSlotSelectable(%s, %s)", key.c_str(), selectable ? "yes" : "no");
ActorSlot *slot = g_twp->_hud->actorSlot(actor);
if (!slot)
@@ -467,11 +472,16 @@ static SQInteger actorLockFacing(HSQUIRRELVM v) {
SQInteger right = static_cast<SQInteger>(Facing::FACE_RIGHT);
SQInteger reset = 0;
sq_getstackobj(v, 3, &obj);
- sqgetf(v, obj, "back", back);
- sqgetf(v, obj, "front", front);
- sqgetf(v, obj, "left", left);
- sqgetf(v, obj, "right", right);
- sqgetf(v, obj, "reset", reset);
+ if (sqrawexists(obj, "back") && SQ_FAILED(sqgetf(v, obj, "back", back)))
+ return sq_throwerror(v, "failed to get verb back");
+ if (sqrawexists(obj, "front") && SQ_FAILED(sqgetf(v, obj, "front", front)))
+ return sq_throwerror(v, "failed to get verb front");
+ if (sqrawexists(obj, "left") && SQ_FAILED(sqgetf(v, obj, "left", left)))
+ return sq_throwerror(v, "failed to get verb left");
+ if (sqrawexists(obj, "right") && SQ_FAILED(sqgetf(v, obj, "right", right)))
+ return sq_throwerror(v, "failed to get verb right");
+ if (sqrawexists(obj, "reset") && SQ_FAILED(sqgetf(v, obj, "reset", reset)))
+ return sq_throwerror(v, "failed to get verb reset");
if (reset != 0)
actor->resetLockFacing();
else
@@ -800,7 +810,8 @@ static SQInteger createActor(HSQUIRRELVM v) {
g_twp->_resManager->_allObjects[id] = actor;
Common::String key;
- sqgetf(actor->_table, "_key", key);
+ if (SQ_FAILED(sqgetf(actor->_table, "_key", key)))
+ return sq_throwerror(v, "failed to get actor key");
actor->_key = key;
debugC(kDebugActScript, "Create actor %s %d", key.c_str(), actor->getId());
@@ -1039,23 +1050,34 @@ static SQInteger verbUIColors(HSQUIRRELVM v) {
verbHighlightTint = 0,
inventoryFrame = 0,
inventoryBackground = 0;
- sqgetf(table, "sentence", sentence);
- sqgetf(table, "verbNormal", verbNormal);
- sqgetf(table, "verbNormalTint", verbNormalTint);
- sqgetf(table, "verbHighlight", verbHighlight);
- sqgetf(table, "verbHighlightTint", verbHighlightTint);
- sqgetf(table, "inventoryFrame", inventoryFrame);
- sqgetf(table, "inventoryBackground", inventoryBackground);
+ if (sqrawexists(table, "sentence") && SQ_FAILED(sqgetf(table, "sentence", sentence)))
+ return sq_throwerror(v, "failed to get sentence");
+ if (sqrawexists(table, "verbNormal") && SQ_FAILED(sqgetf(table, "verbNormal", verbNormal)))
+ return sq_throwerror(v, "failed to get verbNormal");
+ if (sqrawexists(table, "verbNormalTint") && SQ_FAILED(sqgetf(table, "verbNormalTint", verbNormalTint)))
+ return sq_throwerror(v, "failed to get verbNormalTint");
+ if (sqrawexists(table, "verbHighlight") && SQ_FAILED(sqgetf(table, "verbHighlight", verbHighlight)))
+ return sq_throwerror(v, "failed to get verbHighlight");
+ if (sqrawexists(table, "verbHighlightTint") && SQ_FAILED(sqgetf(table, "verbHighlightTint", verbHighlightTint)))
+ return sq_throwerror(v, "failed to get verbHighlightTint");
+ if (sqrawexists(table, "inventoryFrame") && SQ_FAILED(sqgetf(table, "inventoryFrame", inventoryFrame)))
+ return sq_throwerror(v, "failed to get inventoryFrame");
+ if (sqrawexists(table, "inventoryBackground") && SQ_FAILED(sqgetf(table, "inventoryBackground", inventoryBackground)))
+ return sq_throwerror(v, "failed to get inventoryBackground");
// get optional colors
SQInteger retroNormal = verbNormal;
SQInteger retroHighlight = verbNormalTint;
SQInteger dialogNormal = verbNormal;
SQInteger dialogHighlight = verbHighlight;
- sqgetf(table, "retroNormal", retroNormal);
- sqgetf(table, "retroHighlight", retroHighlight);
- sqgetf(table, "dialogNormal", dialogNormal);
- sqgetf(table, "dialogHighlight", dialogHighlight);
+ if (sqrawexists(table, "retroNormal") && SQ_FAILED(sqgetf(table, "retroNormal", retroNormal)))
+ return sq_throwerror(v, "failed to get retroNormal");
+ if (sqrawexists(table, "retroHighlight") && SQ_FAILED(sqgetf(table, "retroHighlight", retroHighlight)))
+ return sq_throwerror(v, "failed to get retroHighlight");
+ if (sqrawexists(table, "dialogNormal") && SQ_FAILED(sqgetf(table, "dialogNormal", dialogNormal)))
+ return sq_throwerror(v, "failed to get dialogNormal");
+ if (sqrawexists(table, "dialogHighlight") && SQ_FAILED(sqgetf(table, "dialogHighlight", dialogHighlight)))
+ return sq_throwerror(v, "failed to get dialogHighlight");
g_twp->_hud->_actorSlots[actorSlot - 1].verbUiColors =
VerbUiColors(
diff --git a/engines/twp/enginedialogtarget.cpp b/engines/twp/enginedialogtarget.cpp
index 1258b9635d4..804594daaf7 100644
--- a/engines/twp/enginedialogtarget.cpp
+++ b/engines/twp/enginedialogtarget.cpp
@@ -58,7 +58,7 @@ private:
static Common::SharedPtr<Object> actor(const Common::String &name) {
HSQOBJECT obj;
sq_resetobject(&obj);
- sqgetf(name, obj);
+ (void)sqgetf(name, obj);
return sqobj(obj);
}
diff --git a/engines/twp/genlib.cpp b/engines/twp/genlib.cpp
index df5215b20bb..7eda4049120 100644
--- a/engines/twp/genlib.cpp
+++ b/engines/twp/genlib.cpp
@@ -698,16 +698,18 @@ static SQInteger setVerb(HSQUIRRELVM v) {
Common::String fun;
Common::String key;
SQInteger flags = 0;
- sqgetf(table, "verb", id);
- sqgetf(table, "text", text);
- if (sqrawexists(table, "image"))
- sqgetf(table, "image", image);
- if (sqrawexists(table, "func"))
- sqgetf(table, "func", fun);
- if (sqrawexists(table, "key"))
- sqgetf(table, "key", key);
- if (sqrawexists(table, "flags"))
- sqgetf(table, "flags", flags);
+ if (SQ_FAILED(sqgetf(table, "verb", id)))
+ return sq_throwerror(v, "failed to get verb");
+ if (SQ_FAILED(sqgetf(table, "text", text)))
+ return sq_throwerror(v, "failed to get verb text");
+ if (sqrawexists(table, "image") && SQ_FAILED(sqgetf(table, "image", image)))
+ return sq_throwerror(v, "failed to get verb image");
+ if (sqrawexists(table, "func") && SQ_FAILED(sqgetf(table, "func", fun)))
+ return sq_throwerror(v, "failed to get verb func");
+ if (sqrawexists(table, "key") && SQ_FAILED(sqgetf(table, "key", key)))
+ return sq_throwerror(v, "failed to get verb key");
+ if (sqrawexists(table, "flags") && SQ_FAILED(sqgetf(table, "flags", flags)))
+ return sq_throwerror(v, "failed to get verb flags");
debugC(kDebugGenScript, "setVerb %lld, %lld, %lld, %s", actorSlot, verbSlot, id, text.c_str());
VerbId verbId;
verbId.id = id;
diff --git a/engines/twp/motor.cpp b/engines/twp/motor.cpp
index da856ee50db..74617d3ae2d 100644
--- a/engines/twp/motor.cpp
+++ b/engines/twp/motor.cpp
@@ -540,10 +540,12 @@ void Talking::setDuration(const Common::String &text) {
Common::String Talking::talkieKey() {
Common::String result;
- if (sqrawexists(_obj->_table, "_talkieKey"))
- sqgetf(_obj->_table, "_talkieKey", result);
- else
- sqgetf(_obj->_table, "_key", result);
+ if (sqrawexists(_obj->_table, "_talkieKey") && SQ_FAILED(sqgetf(_obj->_table, "_talkieKey", result))) {
+ error("Failed to get talkie key");
+ }
+ if (sqrawexists(_obj->_table, "_key") && SQ_FAILED(sqgetf(_obj->_table, "_key", result))) {
+ error("Failed to get talkie key (2)");
+ }
return result;
}
diff --git a/engines/twp/object.cpp b/engines/twp/object.cpp
index f6867ee33eb..52903530321 100644
--- a/engines/twp/object.cpp
+++ b/engines/twp/object.cpp
@@ -127,14 +127,14 @@ Common::SharedPtr<Object> Object::createActor() {
int Object::getId() const {
SQInteger result = 0;
- sqgetf(_table, "_id", result);
+ (void)sqgetf(_table, "_id", result);
return (int)result;
}
Common::String Object::getName() const {
if ((_table._type == OT_TABLE) && (sqrawexists(_table, "name"))) {
Common::String result;
- sqgetf(_table, "name", result);
+ (void)sqgetf(_table, "name", result);
return result;
}
return _name;
@@ -253,7 +253,7 @@ void Object::trig(const Common::String &name) {
}
} else {
SQInteger id = 0;
- sqgetf(sqrootTbl(g_twp->getVm()), name.substr(1), id);
+ (void)sqgetf(sqrootTbl(g_twp->getVm()), name.substr(1), id);
Common::SharedPtr<SoundDefinition> sound = sqsounddef(id);
if (!sound)
warning("Cannot trig sound '%s', sound not found (id=%lld, %s)", name.c_str(), id, _key.c_str());
@@ -288,9 +288,9 @@ float Object::popScale() const {
int Object::defaultVerbId() {
SQInteger result = VERB_LOOKAT;
- if (sqrawexists(_table, "defaultVerb"))
- sqgetf(_table, "defaultVerb", result);
- else if (g_twp->_resManager->isActor(getId())) {
+ if (sqrawexists(_table, "defaultVerb") && SQ_FAILED(sqgetf(_table, "defaultVerb", result))) {
+ error("Failed to get defaultVerb");
+ } else if (g_twp->_resManager->isActor(getId())) {
result = sqrawexists(_table, "verbTalkTo") ? VERB_TALKTO : VERB_WALKTO;
}
return result;
@@ -308,11 +308,13 @@ bool Object::isTouchable() {
return false;
} else if (sqrawexists(_table, "_touchable")) {
bool result;
- sqgetf(_table, "_touchable", result);
+ if(SQ_FAILED(sqgetf(_table, "_touchable", result)))
+ error("Failed to get touchable");
return result;
} else if (sqrawexists(_table, "initTouchable")) {
bool result;
- sqgetf(_table, "initTouchable", result);
+ if(SQ_FAILED(sqgetf(_table, "initTouchable", result)))
+ error("Failed to get touchable");
return result;
} else {
return true;
@@ -376,7 +378,7 @@ ObjectIcons Object::getIcons() const {
ObjectIcons result;
HSQOBJECT iconTable;
sq_resetobject(&iconTable);
- sqgetf(_table, "icon", iconTable);
+ (void)sqgetf(_table, "icon", iconTable);
if (iconTable._type == OT_NULL) {
return result;
}
@@ -402,8 +404,8 @@ Common::String Object::getIcon() {
int Object::getFlags() {
SQInteger result = 0;
- if (sqrawexists(_table, "flags"))
- sqgetf(_table, "flags", result);
+ if (sqrawexists(_table, "flags") && SQ_FAILED(sqgetf(_table, "flags", result)))
+ error("Failed to get flags");
return result;
}
@@ -699,13 +701,6 @@ void Object::lockFacing(Facing left, Facing right, Facing front, Facing back) {
_facingMap.push_back({Facing::FACE_BACK, back});
}
-int Object::flags() {
- SQInteger result = 0;
- if (sqrawexists(_table, "flags"))
- sqgetf(_table, "flags", result);
- return result;
-}
-
UseFlag Object::useFlag() {
int flags = getFlags();
if (flags & USE_WITH)
diff --git a/engines/twp/object.h b/engines/twp/object.h
index e3f3d621f5e..b10633b1aa7 100644
--- a/engines/twp/object.h
+++ b/engines/twp/object.h
@@ -224,7 +224,6 @@ private:
Common::String suffix() const;
// Plays an animation specified by the state
bool playCore(const Common::String &state, bool loop = false, bool instant = false);
- int flags();
public:
HSQOBJECT _table;
diff --git a/engines/twp/objlib.cpp b/engines/twp/objlib.cpp
index 97ea25d1e82..7709b9243dc 100644
--- a/engines/twp/objlib.cpp
+++ b/engines/twp/objlib.cpp
@@ -922,7 +922,7 @@ static SQInteger pickupObject(HSQUIRRELVM v) {
HSQOBJECT o;
sq_getstackobj(v, 2, &o);
Common::String name;
- sqgetf(o, "name", name);
+ (void)sqgetf(o, "name", name);
return sq_throwerror(v, Common::String::format("failed to get object %x, %s", o._type, g_twp->_textDb->getText(name).c_str()).c_str());
}
Common::SharedPtr<Object> actor;
diff --git a/engines/twp/roomlib.cpp b/engines/twp/roomlib.cpp
index 365b25cb16b..267f27ab6d4 100644
--- a/engines/twp/roomlib.cpp
+++ b/engines/twp/roomlib.cpp
@@ -233,9 +233,9 @@ static SQInteger defineRoom(HSQUIRRELVM v) {
if (SQ_FAILED(sq_getstackobj(v, 2, &table)))
return sq_throwerror(v, "failed to get room table");
Common::String name;
- sqgetf(v, table, "name", name);
- if (name.size() == 0)
- sqgetf(v, table, "background", name);
+ if(SQ_FAILED(sqgetf(v, table, "background", name))) {
+ return sq_throwerror(v, "failed to get room name");
+ }
Common::SharedPtr<Room> room = g_twp->defineRoom(name, table);
debugC(kDebugRoomScript, "Define room: %s", name.c_str());
g_twp->_rooms.push_back(room);
diff --git a/engines/twp/savegame.cpp b/engines/twp/savegame.cpp
index fb4a7284a84..b542f11ddbc 100644
--- a/engines/twp/savegame.cpp
+++ b/engines/twp/savegame.cpp
@@ -138,33 +138,39 @@ static Common::SharedPtr<Object> object(const Common::String &key) {
return nullptr;
}
-static void toSquirrel(const Common::JSONValue *json, HSQOBJECT &obj) {
+static SQRESULT toSquirrel(const Common::JSONValue *json, HSQOBJECT &obj) {
HSQUIRRELVM v = g_twp->getVm();
SQInteger top = sq_gettop(v);
sq_resetobject(&obj);
if (json->isString()) {
sqpush(v, json->asString());
- sqget(v, -1, obj);
+ if (SQ_FAILED(sqget(v, -1, obj)))
+ return sq_throwerror(v, "failed to get string");
} else if (json->isIntegerNumber()) {
sqpush(v, static_cast<int>(json->asIntegerNumber()));
- sqget(v, -1, obj);
+ if (SQ_FAILED(sqget(v, -1, obj)))
+ return sq_throwerror(v, "failed to get int");
} else if (json->isBool()) {
sqpush(v, json->asBool());
- sqget(v, -1, obj);
+ if (SQ_FAILED(sqget(v, -1, obj)))
+ return sq_throwerror(v, "failed to get bool");
} else if (json->isNumber()) {
sqpush(v, json->asNumber());
- sqget(v, -1, obj);
+ if (SQ_FAILED(sqget(v, -1, obj)))
+ return sq_throwerror(v, "failed to get float");
} else if (json->isNull()) {
} else if (json->isArray()) {
sq_newarray(v, 0);
const Common::JSONArray &jArr = json->asArray();
for (size_t i = 0; i < jArr.size(); i++) {
HSQOBJECT tmp;
- toSquirrel(jArr[i], tmp);
+ if (SQ_FAILED(toSquirrel(jArr[i], tmp)))
+ return sq_throwerror(v, "failed to get array element");
sqpush(v, tmp);
sq_arrayappend(v, -2);
}
- sqget(v, -1, obj);
+ if (SQ_FAILED(sqget(v, -1, obj)))
+ return sq_throwerror(v, "failed to get array");
} else if (json->isObject()) {
const Common::JSONObject &jObject = json->asObject();
// check if it's a reference to an actor
@@ -205,15 +211,18 @@ static void toSquirrel(const Common::JSONValue *json, HSQOBJECT &obj) {
for (auto it = jObject.begin(); it != jObject.end(); it++) {
sqpush(v, it->_key);
HSQOBJECT tmp;
- toSquirrel(it->_value, tmp);
+ if (SQ_FAILED(toSquirrel(it->_value, tmp)))
+ return sq_throwerror(v, "failed to get table element");
sqpush(v, tmp);
sq_newslot(v, -3, SQFalse);
}
- sqget(v, -1, obj);
+ if (SQ_FAILED(sqget(v, -1, obj)))
+ return sq_throwerror(v, "failed to get table");
}
}
sq_addref(v, &obj);
sq_settop(v, top);
+ return SQ_OK;
}
static Common::String sub(const Common::String &s, size_t pos, size_t end) {
@@ -228,7 +237,8 @@ static void setAnimations(Common::SharedPtr<Object> actor, const Common::JSONArr
actor->setAnimationNames(headAnim, standAnim, walkAnim, reachAnim);
}
-static void loadActor(Common::SharedPtr<Object> actor, const Common::JSONObject &json) {
+static SQRESULT loadActor(Common::SharedPtr<Object> actor, const Common::JSONObject &json) {
+ HSQUIRRELVM v = g_twp->getVm();
actor->setTouchable(!json.contains("_untouchable") || json["_untouchable"]->asIntegerNumber() != 1);
actor->_node->setVisible(!json.contains("_hidden") || json["_hidden"]->asIntegerNumber() != 1);
actor->_volume = json.contains("_volume") ? json["_volume"]->asNumber() : 1.0f;
@@ -264,7 +274,8 @@ static void loadActor(Common::SharedPtr<Object> actor, const Common::JSONObject
} else {
if (!it->_key.hasPrefix("_")) {
HSQOBJECT tmp;
- toSquirrel(it->_value, tmp);
+ if (SQ_FAILED(toSquirrel(it->_value, tmp)))
+ return sq_throwerror(v, "failed to get table object");
if (sqrawexists(actor->_table, it->_key))
sqsetf(actor->_table, it->_key, tmp);
else
@@ -274,9 +285,11 @@ static void loadActor(Common::SharedPtr<Object> actor, const Common::JSONObject
}
}
}
+ return SQ_OK;
}
-static void loadObject(Common::SharedPtr<Object> obj, const Common::JSONObject &json) {
+static SQRESULT loadObject(Common::SharedPtr<Object> obj, const Common::JSONObject &json) {
+ HSQUIRRELVM v = g_twp->getVm();
int state = 0;
if (json.contains("_state"))
state = json["_state"]->asIntegerNumber();
@@ -314,7 +327,8 @@ static void loadObject(Common::SharedPtr<Object> obj, const Common::JSONObject &
Object::setRoom(obj, room(it->_value->asString()));
} else if (!it->_key.hasPrefix("_")) {
HSQOBJECT tmp;
- toSquirrel(it->_value, tmp);
+ if (SQ_FAILED(toSquirrel(it->_value, tmp)))
+ return sq_throwerror(v, "failed to get table object");
if (sqrawexists(obj->_table, it->_key))
sqsetf(obj->_table, it->_key, tmp);
else
@@ -326,6 +340,8 @@ static void loadObject(Common::SharedPtr<Object> obj, const Common::JSONObject &
if (sqrawexists(obj->_table, "postLoad"))
sqcall(obj->_table, "postLoad");
+
+ return SQ_OK;
}
static void loadPseudoObjects(Common::SharedPtr<Room> room, const Common::JSONObject &json) {
@@ -338,7 +354,8 @@ static void loadPseudoObjects(Common::SharedPtr<Room> room, const Common::JSONOb
}
}
-static void loadRoom(Common::SharedPtr<Room> room, const Common::JSONObject &json) {
+static SQRESULT loadRoom(Common::SharedPtr<Room> room, const Common::JSONObject &json) {
+ HSQUIRRELVM v = g_twp->getVm();
for (auto it = json.begin(); it != json.end(); it++) {
if (it->_key == "_pseudoObjects") {
loadPseudoObjects(room, it->_value->asObject());
@@ -347,7 +364,8 @@ static void loadRoom(Common::SharedPtr<Room> room, const Common::JSONObject &jso
Common::SharedPtr<Object> o(object(room, it->_key));
if (!o) {
HSQOBJECT tmp;
- toSquirrel(it->_value, tmp);
+ if (SQ_FAILED(toSquirrel(it->_value, tmp)))
+ return sq_throwerror(v, "failed to get table object");
if (sqrawexists(room->_table, it->_key))
sqsetf(room->_table, it->_key, tmp);
else {
@@ -364,6 +382,8 @@ static void loadRoom(Common::SharedPtr<Room> room, const Common::JSONObject &jso
if (sqrawexists(room->_table, "postLoad"))
sqcall(room->_table, "postLoad");
+
+ return SQ_OK;
}
static void setActor(const Common::String &key) {
@@ -417,15 +437,30 @@ bool SaveGameManager::loadGame(Common::SeekableReadStream &stream) {
sqcall("preLoad");
loadGameScene(json["gameScene"]->asObject());
loadDialog(json["dialog"]->asObject());
- loadCallbacks(json["callbacks"]->asObject());
- loadGlobals(json["globals"]->asObject());
- loadActors(json["actors"]->asObject());
+ if (SQ_FAILED(loadCallbacks(json["callbacks"]->asObject()))) {
+ delete jSavegame;
+ return false;
+ }
+ if (SQ_FAILED(loadGlobals(json["globals"]->asObject()))) {
+ delete jSavegame;
+ return false;
+ }
+ if (SQ_FAILED(loadActors(json["actors"]->asObject()))) {
+ delete jSavegame;
+ return false;
+ }
loadInventory(json["inventory"]);
- loadRooms(json["rooms"]->asObject());
+ if (SQ_FAILED(loadRooms(json["rooms"]->asObject()))) {
+ delete jSavegame;
+ return false;
+ }
g_twp->_time = (float)gameTime;
g_twp->setTotalPlayTime(gameTime * 1000);
g_twp->_inputState.setState((InputStateFlag)json["inputState"]->asIntegerNumber());
- loadObjects(json["objects"]->asObject());
+ if (SQ_FAILED(loadObjects(json["objects"]->asObject()))) {
+ delete jSavegame;
+ return false;
+ }
g_twp->setRoom(room(json["currentRoom"]->asString()), true);
setActor(json["selectedActor"]->asString());
if (g_twp->_actor)
@@ -520,7 +555,8 @@ private:
Common::Array<HSQOBJECT> &_objs;
};
-void SaveGameManager::loadCallbacks(const Common::JSONObject &json) {
+SQRESULT SaveGameManager::loadCallbacks(const Common::JSONObject &json) {
+ HSQUIRRELVM v = g_twp->getVm();
debugC(kDebugGame, "loadCallbacks");
g_twp->_callbacks.clear();
if (!json["callbacks"]->isNull()) {
@@ -533,35 +569,43 @@ void SaveGameManager::loadCallbacks(const Common::JSONObject &json) {
Common::Array<HSQOBJECT> args;
if (jCallBackHash.contains("param")) {
HSQOBJECT arg;
- toSquirrel(jCallBackHash["param"], arg);
+ if (SQ_FAILED(toSquirrel(jCallBackHash["param"], arg)))
+ return sq_throwerror(v, "failed to get callback arg");
sqgetitems(arg, GetHObjects(args));
}
g_twp->_callbacks.push_back(Common::SharedPtr<Callback>(new Callback(id, time, name, args)));
}
}
g_twp->_resManager->resetIds(json["nextGuid"]->asIntegerNumber());
+ return SQ_OK;
}
-void SaveGameManager::loadGlobals(const Common::JSONObject &json) {
+SQRESULT SaveGameManager::loadGlobals(const Common::JSONObject &json) {
debugC(kDebugGame, "loadGlobals");
HSQUIRRELVM v = g_twp->getVm();
HSQOBJECT g;
- sqgetf("g", g);
+ if(SQ_FAILED(sqgetf("g", g)))
+ return sq_throwerror(v, "Failed to get globals variable");
for (auto it = json.begin(); it != json.end(); it++) {
HSQOBJECT tmp;
- toSquirrel(it->_value, tmp);
+ if (SQ_FAILED(toSquirrel(it->_value, tmp)))
+ return sq_throwerror(v, "failed to get callback arg");
sq_addref(v, &tmp);
sqsetf(g, it->_key, tmp);
}
+ return SQ_OK;
}
-void SaveGameManager::loadActors(const Common::JSONObject &json) {
+SQRESULT SaveGameManager::loadActors(const Common::JSONObject &json) {
+ HSQUIRRELVM v = g_twp->getVm();
for (size_t i = 0; i < g_twp->_actors.size(); i++) {
Common::SharedPtr<Object> a = g_twp->_actors[i];
if (a->_key.size() > 0) {
- loadActor(a, json[a->_key]->asObject());
+ if (SQ_FAILED(loadActor(a, json[a->_key]->asObject())))
+ return sq_throwerror(v, "failed to load actor");
}
}
+ return SQ_OK;
}
void SaveGameManager::loadInventory(const Common::JSONValue *json) {
@@ -595,20 +639,27 @@ void SaveGameManager::loadInventory(const Common::JSONValue *json) {
}
}
-void SaveGameManager::loadRooms(const Common::JSONObject &json) {
+SQRESULT SaveGameManager::loadRooms(const Common::JSONObject &json) {
+ HSQUIRRELVM v = g_twp->getVm();
for (auto it = json.begin(); it != json.end(); it++) {
- loadRoom(room(it->_key), it->_value->asObject());
+ if (SQ_FAILED(loadRoom(room(it->_key), it->_value->asObject())))
+ return sq_throwerror(v, "failed to load room");
}
+ return SQ_OK;
}
-void SaveGameManager::loadObjects(const Common::JSONObject &json) {
+SQRESULT SaveGameManager::loadObjects(const Common::JSONObject &json) {
+ HSQUIRRELVM v = g_twp->getVm();
for (auto it = json.begin(); it != json.end(); it++) {
Common::SharedPtr<Object> o(object(it->_key));
- if (o)
- loadObject(o, it->_value->asObject());
- else
+ if (o) {
+ if (SQ_FAILED(loadObject(o, it->_value->asObject())))
+ return sq_throwerror(v, "failed to load object");
+ } else {
warning("object '%s' not found", it->_key.c_str());
+ }
}
+ return SQ_OK;
}
struct JsonCallback {
@@ -643,34 +694,35 @@ private:
Common::JSONArray &_arr;
};
-static void toObject(Common::JSONObject &jObj, const HSQOBJECT &obj, bool checkId, bool skipObj = false, bool pseudo = false) {
+static SQRESULT toObject(Common::JSONObject &jObj, const HSQOBJECT &obj, bool checkId, bool skipObj = false, bool pseudo = false) {
+ HSQUIRRELVM v = g_twp->getVm();
if (checkId) {
SQInteger id = 0;
- sqgetf(obj, "_id", id);
+ if(SQ_FAILED(sqgetf(obj, "_id", id)))
+ return sq_throwerror(v, "Failed to get id");
if (g_twp->_resManager->isActor(id)) {
Common::SharedPtr<Object> a(actor(id));
jObj["_actorKey"] = new Common::JSONValue(a->_key);
- return;
+ return SQ_OK;
}
if (g_twp->_resManager->isObject(id)) {
Common::SharedPtr<Object> o(sqobj(id));
if (!o)
- return;
+ return SQ_OK;
jObj["_objectKey"] = new Common::JSONValue(o->_key);
if (o->_room && o->_room->_pseudo)
jObj["_roomKey"] = new Common::JSONValue(o->_room->_name);
- return;
+ return SQ_OK;
}
if (g_twp->_resManager->isRoom(id)) {
Common::SharedPtr<Room> r(getRoom(id));
jObj["_roomKey"] = new Common::JSONValue(r->_name);
- return;
+ return SQ_OK;
}
}
- HSQUIRRELVM v = g_twp->getVm();
HSQOBJECT rootTbl = sqrootTbl(v);
JsonCallback params;
@@ -678,7 +730,7 @@ static void toObject(Common::JSONObject &jObj, const HSQOBJECT &obj, bool checkI
params.pseudo = pseudo;
params.rootTable = &rootTbl;
params.skipObj = skipObj;
- sqgetpairs(obj, fillMissingProperties, ¶ms);
+ return sqgetpairs(obj, fillMissingProperties, ¶ms);
}
static Common::JSONValue *tojson(const HSQOBJECT &obj, bool checkId, bool skipObj, bool pseudo) {
@@ -863,9 +915,11 @@ static Common::JSONValue *createJDialog() {
static Common::JSONValue *createJEasyMode() {
HSQOBJECT g;
- sqgetf("g", g);
+ if(SQ_FAILED(sqgetf("g", g)))
+ error("Failed to get globals variable");
SQInteger easyMode;
- sqgetf(g, "easy_mode", easyMode);
+ if(SQ_FAILED(sqgetf(g, "easy_mode", easyMode)))
+ error("Failed to get easy_mode variable");
return new Common::JSONValue((long long int)easyMode);
}
@@ -904,7 +958,8 @@ static Common::JSONValue *createJGameScene() {
static Common::JSONValue *createJGlobals() {
HSQOBJECT g;
- sqgetf("g", g);
+ if(SQ_FAILED(sqgetf("g", g)))
+ error("Failed to get globals variable");
// result.fields.sort(cmpKey);
return tojson(g, false);
}
@@ -965,9 +1020,8 @@ static Common::JSONValue *createJObject(HSQOBJECT &table, Common::SharedPtr<Obje
static Common::JSONValue *createJObjects() {
Common::JSONObject json;
- // sqgetpairs(sqrootTbl(g_twp->getVm()), fillObjects, &json);
- for (auto &room : g_twp->_rooms) {
- for (auto &layer : room->_layers) {
+ for (const auto &r : g_twp->_rooms) {
+ for (const auto &layer : r->_layers) {
for (auto &obj : layer->_objects) {
if (obj->_objType != ObjectType::otNone)
continue;
diff --git a/engines/twp/savegame.h b/engines/twp/savegame.h
index 4d0255cb23e..4dd8f8af64b 100644
--- a/engines/twp/savegame.h
+++ b/engines/twp/savegame.h
@@ -44,12 +44,12 @@ public:
private:
void loadGameScene(const Common::JSONObject &json);
void loadDialog(const Common::JSONObject &json);
- void loadCallbacks(const Common::JSONObject &json);
- void loadGlobals(const Common::JSONObject &json);
- void loadActors(const Common::JSONObject &json);
+ SQRESULT loadCallbacks(const Common::JSONObject &json);
+ SQRESULT loadGlobals(const Common::JSONObject &json);
+ SQRESULT loadActors(const Common::JSONObject &json);
void loadInventory(const Common::JSONValue *json);
- void loadRooms(const Common::JSONObject &json);
- void loadObjects(const Common::JSONObject &json);
+ SQRESULT loadRooms(const Common::JSONObject &json);
+ SQRESULT loadObjects(const Common::JSONObject &json);
public:
bool _allowSaveGame = true;
diff --git a/engines/twp/squtil.cpp b/engines/twp/squtil.cpp
index e959028d57a..a72b7ad9837 100644
--- a/engines/twp/squtil.cpp
+++ b/engines/twp/squtil.cpp
@@ -249,7 +249,7 @@ void sqcall(const char *name, const Common::Array<HSQOBJECT> &args) {
int getId(HSQOBJECT table) {
SQInteger result = 0;
- sqgetf(table, "_id", result);
+ (void)sqgetf(table, "_id", result);
return (int)result;
}
@@ -443,19 +443,22 @@ SQRESULT sqgetarray(HSQUIRRELVM v, int i, Common::Array<Common::SharedPtr<SoundD
return result;
}
-void sqgetpairs(HSQOBJECT obj, void func(const Common::String &k, HSQOBJECT &obj, void *data), void *data) {
+SQRESULT sqgetpairs(HSQOBJECT obj, void func(const Common::String &k, HSQOBJECT &obj, void *data), void *data) {
HSQUIRRELVM v = g_twp->getVm();
sq_pushobject(v, obj);
sq_pushnull(v);
while (SQ_SUCCEEDED(sq_next(v, -2))) {
Common::String key;
HSQOBJECT o;
- sqget(v, -1, o);
- sqget(v, -2, key);
+ if (SQ_FAILED(sqget(v, -1, o)))
+ return sq_throwerror(v, "failed to get object");
+ if (SQ_FAILED(sqget(v, -2, key)))
+ return sq_throwerror(v, "failed to get key");
func(key, o, data);
sq_pop(v, 2);
}
sq_pop(v, 2);
+ return SQ_OK;
}
} // namespace Twp
diff --git a/engines/twp/squtil.h b/engines/twp/squtil.h
index 858b7e5ff86..89c9d753f36 100644
--- a/engines/twp/squtil.h
+++ b/engines/twp/squtil.h
@@ -64,27 +64,31 @@ void sqsetf(HSQOBJECT o, const Common::String &key, T obj) {
}
template<typename T>
-void sqgetf(HSQUIRRELVM v, HSQOBJECT o, const Common::String &name, T &value) {
+SQRESULT sqgetf(HSQUIRRELVM v, HSQOBJECT o, const Common::String &name, T &value) {
sq_pushobject(v, o);
sq_pushstring(v, name.c_str(), -1);
- if (SQ_FAILED(sq_get(v, -2)))
+ if (SQ_FAILED(sq_get(v, -2))) {
sq_pop(v, 1);
- else {
- sqget(v, -1, value);
- sq_pop(v, 2);
+ return sq_throwerror(v, "Failed to get field");
}
+
+ if (SQ_FAILED(sqget(v, -1, value)))
+ return sq_throwerror(v, "Failed to get field");
+
+ sq_pop(v, 2);
+ return SQ_OK;
}
template<typename T>
-void sqgetf(HSQOBJECT o, const Common::String &name, T &value) {
+SQRESULT sqgetf(HSQOBJECT o, const Common::String &name, T &value) {
HSQUIRRELVM v = g_twp->getVm();
- sqgetf(v, o, name, value);
+ return sqgetf(v, o, name, value);
}
template<typename T>
-void sqgetf(const Common::String &name, T &value) {
+SQRESULT sqgetf(const Common::String &name, T &value) {
HSQUIRRELVM v = g_twp->getVm();
- sqgetf(v, sqrootTbl(v), name, value);
+ return sqgetf(v, sqrootTbl(v), name, value);
}
void setId(HSQOBJECT &o, int id);
@@ -100,29 +104,33 @@ void sqgetitems(HSQOBJECT o, TFunc func) {
sq_pushnull(v);
while (SQ_SUCCEEDED(sq_next(v, -2))) {
HSQOBJECT obj;
- sqget(v, -1, obj);
+ if (SQ_FAILED(sqget(v, -1, obj)))
+ error("Failed to get item");
func(obj);
sq_pop(v, 2);
}
sq_pop(v, 2);
}
-void sqgetpairs(HSQOBJECT obj, void func(const Common::String &key, HSQOBJECT &obj, void *data), void *data);
+SQRESULT sqgetpairs(HSQOBJECT obj, void func(const Common::String &key, HSQOBJECT &obj, void *data), void *data);
template<typename TFunc>
-void sqgetpairs(HSQOBJECT obj, TFunc func) {
+SQRESULT sqgetpairs(HSQOBJECT obj, TFunc func) {
HSQUIRRELVM v = g_twp->getVm();
sq_pushobject(v, obj);
sq_pushnull(v);
while (SQ_SUCCEEDED(sq_next(v, -2))) {
Common::String key;
HSQOBJECT o;
- sqget(v, -1, o);
- sqget(v, -2, key);
+ if (SQ_FAILED(sqget(v, -1, o)))
+ return sq_throwerror(v, "failed to get object");
+ if (SQ_FAILED(sqget(v, -2, key)))
+ return sq_throwerror(v, "failed to get key");
func(key, o);
sq_pop(v, 2);
}
sq_pop(v, 2);
+ return SQ_OK;
}
template<typename T>
@@ -244,7 +252,8 @@ void sqcallfunc(TResult &result, HSQOBJECT o, const char *name, T... args) {
error("function %s call failed", name);
return;
}
- sqget(v, -1, result);
+ if (SQ_FAILED(sqget(v, -1, result)))
+ error("function %s call failed to get result", name);
sq_settop(v, top);
}
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index c44dbc9abde..7ac02d19016 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -1146,7 +1146,8 @@ static void onGetPairs(const Common::String &k, HSQOBJECT &oTable, void *data) {
}
}
- sqgetf(params->room->_table, k, obj->_table);
+ if(SQ_FAILED(sqgetf(params->room->_table, k, obj->_table)))
+ error("Failed to get room object");
const int id = g_twp->_resManager->newObjId();
setId(obj->_table, id);
g_twp->_resManager->_allObjects[id] = obj;
@@ -1159,7 +1160,8 @@ static void onGetPairs(const Common::String &k, HSQOBJECT &oTable, void *data) {
if (sqrawexists(obj->_table, "initState")) {
// info fmt"initState {obj.key}"
SQInteger state;
- sqgetf(obj->_table, "initState", state);
+ if(SQ_FAILED(sqgetf(obj->_table, "initState", state)))
+ error("Failed to get initState");
obj->setState(state, true);
} else {
obj->setState(0, true);
@@ -1191,7 +1193,8 @@ Common::SharedPtr<Room> TwpEngine::defineRoom(const Common::String &name, HSQOBJ
} else {
result.reset(new Room(name, table));
Common::String background;
- sqgetf(table, "background", background);
+ if(SQ_FAILED(sqgetf(table, "background", background)))
+ error("Failed to get room background");
GGPackEntryReader entry;
entry.open(*_pack, background + ".wimpy");
Room::load(result, entry);
@@ -1231,7 +1234,8 @@ Common::SharedPtr<Room> TwpEngine::defineRoom(const Common::String &name, HSQOBJ
} else {
if (pseudo) {
// if it's a pseudo room we need to clone each object
- sqgetf(result->_table, obj->_key, obj->_table);
+ if(SQ_FAILED(sqgetf(result->_table, obj->_key, obj->_table)))
+ error("Failed to get room object");
sq_pushobject(v, obj->_table);
sq_clone(v, -1);
sq_getstackobj(v, -1, &obj->_table);
@@ -1269,7 +1273,8 @@ Common::SharedPtr<Room> TwpEngine::defineRoom(const Common::String &name, HSQOBJ
params.pseudo = pseudo;
params.v = v;
params.room = result;
- sqgetpairs(result->_table, onGetPairs, ¶ms);
+ if (SQ_FAILED(sqgetpairs(result->_table, onGetPairs, ¶ms)))
+ error("Falied to define objects");
// declare the room in the root table
setId(result->_table, g_twp->_resManager->newRoomId());
Commit: 19f7c579dfa7fed9b6d1c74729b9dbc48a1afbe8
https://github.com/scummvm/scummvm/commit/19f7c579dfa7fed9b6d1c74729b9dbc48a1afbe8
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:16:19+02:00
Commit Message:
TWP: Remove unused squirrel files
Changed paths:
R engines/twp/squirrel/sqstdblob.cpp
R engines/twp/squirrel/sqstdblob.h
R engines/twp/squirrel/sqstdblobimpl.h
R engines/twp/squirrel/sqstdio.cpp
R engines/twp/squirrel/sqstdio.h
R engines/twp/squirrel/sqstdstream.cpp
R engines/twp/squirrel/sqstdstream.h
R engines/twp/squirrel/sqstdsystem.h
R engines/twp/squirrel/squirrel.dsp
engines/twp/module.mk
engines/twp/vm.cpp
diff --git a/engines/twp/module.mk b/engines/twp/module.mk
index 068a5072cbe..60ae824b189 100644
--- a/engines/twp/module.mk
+++ b/engines/twp/module.mk
@@ -55,11 +55,8 @@ MODULE_OBJS = \
squirrel/sqmem.o \
squirrel/sqvm.o \
squirrel/sqclass.o \
- squirrel/sqstdio.o \
squirrel/sqstdmath.o \
squirrel/sqstdstring.o \
- squirrel/sqstdstream.o \
- squirrel/sqstdblob.o \
squirrel/sqstdrex.o \
squirrel/sqstdaux.o \
diff --git a/engines/twp/squirrel/sqstdblob.cpp b/engines/twp/squirrel/sqstdblob.cpp
deleted file mode 100755
index a9fe2ce567b..00000000000
--- a/engines/twp/squirrel/sqstdblob.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-/* see copyright notice in squirrel.h */
-#include <new>
-#include "squirrel.h"
-#include "sqstdio.h"
-#include <string.h>
-#include "sqstdblob.h"
-#include "sqstdstream.h"
-#include "sqstdblobimpl.h"
-
-#define SQSTD_BLOB_TYPE_TAG ((SQUnsignedInteger)(SQSTD_STREAM_TYPE_TAG | 0x00000002))
-
-//Blob
-
-
-#define SETUP_BLOB(v) \
- SQBlob *self = NULL; \
- { if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) \
- return sq_throwerror(v,_SC("invalid type tag")); } \
- if(!self || !self->IsValid()) \
- return sq_throwerror(v,_SC("the blob is invalid"));
-
-
-static SQInteger _blob_resize(HSQUIRRELVM v)
-{
- SETUP_BLOB(v);
- SQInteger size;
- sq_getinteger(v,2,&size);
- if(!self->Resize(size))
- return sq_throwerror(v,_SC("resize failed"));
- return 0;
-}
-
-static void __swap_dword(unsigned int *n)
-{
- *n=(unsigned int)(((*n&0xFF000000)>>24) |
- ((*n&0x00FF0000)>>8) |
- ((*n&0x0000FF00)<<8) |
- ((*n&0x000000FF)<<24));
-}
-
-static void __swap_word(unsigned short *n)
-{
- *n=(unsigned short)((*n>>8)&0x00FF)| ((*n<<8)&0xFF00);
-}
-
-static SQInteger _blob_swap4(HSQUIRRELVM v)
-{
- SETUP_BLOB(v);
- SQInteger num=(self->Len()-(self->Len()%4))>>2;
- unsigned int *t=(unsigned int *)self->GetBuf();
- for(SQInteger i = 0; i < num; i++) {
- __swap_dword(&t[i]);
- }
- return 0;
-}
-
-static SQInteger _blob_swap2(HSQUIRRELVM v)
-{
- SETUP_BLOB(v);
- SQInteger num=(self->Len()-(self->Len()%2))>>1;
- unsigned short *t = (unsigned short *)self->GetBuf();
- for(SQInteger i = 0; i < num; i++) {
- __swap_word(&t[i]);
- }
- return 0;
-}
-
-static SQInteger _blob__set(HSQUIRRELVM v)
-{
- SETUP_BLOB(v);
- SQInteger idx,val;
- sq_getinteger(v,2,&idx);
- sq_getinteger(v,3,&val);
- if(idx < 0 || idx >= self->Len())
- return sq_throwerror(v,_SC("index out of range"));
- ((unsigned char *)self->GetBuf())[idx] = (unsigned char) val;
- sq_push(v,3);
- return 1;
-}
-
-static SQInteger _blob__get(HSQUIRRELVM v)
-{
- SETUP_BLOB(v);
- SQInteger idx;
-
- if ((sq_gettype(v, 2) & SQOBJECT_NUMERIC) == 0)
- {
- sq_pushnull(v);
- return sq_throwobject(v);
- }
- sq_getinteger(v,2,&idx);
- if(idx < 0 || idx >= self->Len())
- return sq_throwerror(v,_SC("index out of range"));
- sq_pushinteger(v,((unsigned char *)self->GetBuf())[idx]);
- return 1;
-}
-
-static SQInteger _blob__nexti(HSQUIRRELVM v)
-{
- SETUP_BLOB(v);
- if(sq_gettype(v,2) == OT_NULL) {
- sq_pushinteger(v, 0);
- return 1;
- }
- SQInteger idx;
- if(SQ_SUCCEEDED(sq_getinteger(v, 2, &idx))) {
- if(idx+1 < self->Len()) {
- sq_pushinteger(v, idx+1);
- return 1;
- }
- sq_pushnull(v);
- return 1;
- }
- return sq_throwerror(v,_SC("internal error (_nexti) wrong argument type"));
-}
-
-static SQInteger _blob__typeof(HSQUIRRELVM v)
-{
- sq_pushstring(v,_SC("blob"),-1);
- return 1;
-}
-
-static SQInteger _blob_releasehook(SQUserPointer p, SQInteger SQ_UNUSED_ARG(size))
-{
- SQBlob *self = (SQBlob*)p;
- self->~SQBlob();
- sq_free(self,sizeof(SQBlob));
- return 1;
-}
-
-static SQInteger _blob_constructor(HSQUIRRELVM v)
-{
- SQInteger nparam = sq_gettop(v);
- SQInteger size = 0;
- if(nparam == 2) {
- sq_getinteger(v, 2, &size);
- }
- if(size < 0) return sq_throwerror(v, _SC("cannot create blob with negative size"));
- //SQBlob *b = new SQBlob(size);
-
- SQBlob *b = new (sq_malloc(sizeof(SQBlob)))SQBlob(size);
- if(SQ_FAILED(sq_setinstanceup(v,1,b))) {
- b->~SQBlob();
- sq_free(b,sizeof(SQBlob));
- return sq_throwerror(v, _SC("cannot create blob"));
- }
- sq_setreleasehook(v,1,_blob_releasehook);
- return 0;
-}
-
-static SQInteger _blob__cloned(HSQUIRRELVM v)
-{
- SQBlob *other = NULL;
- {
- if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&other,(SQUserPointer)SQSTD_BLOB_TYPE_TAG)))
- return SQ_ERROR;
- }
- //SQBlob *thisone = new SQBlob(other->Len());
- SQBlob *thisone = new (sq_malloc(sizeof(SQBlob)))SQBlob(other->Len());
- memcpy(thisone->GetBuf(),other->GetBuf(),thisone->Len());
- if(SQ_FAILED(sq_setinstanceup(v,1,thisone))) {
- thisone->~SQBlob();
- sq_free(thisone,sizeof(SQBlob));
- return sq_throwerror(v, _SC("cannot clone blob"));
- }
- sq_setreleasehook(v,1,_blob_releasehook);
- return 0;
-}
-
-#define _DECL_BLOB_FUNC(name,nparams,typecheck) {_SC(#name),_blob_##name,nparams,typecheck}
-static const SQRegFunction _blob_methods[] = {
- _DECL_BLOB_FUNC(constructor,-1,_SC("xn")),
- _DECL_BLOB_FUNC(resize,2,_SC("xn")),
- _DECL_BLOB_FUNC(swap2,1,_SC("x")),
- _DECL_BLOB_FUNC(swap4,1,_SC("x")),
- _DECL_BLOB_FUNC(_set,3,_SC("xnn")),
- _DECL_BLOB_FUNC(_get,2,_SC("x.")),
- _DECL_BLOB_FUNC(_typeof,1,_SC("x")),
- _DECL_BLOB_FUNC(_nexti,2,_SC("x")),
- _DECL_BLOB_FUNC(_cloned,2,_SC("xx")),
- {NULL,(SQFUNCTION)0,0,NULL}
-};
-
-
-
-//GLOBAL FUNCTIONS
-
-static SQInteger _g_blob_casti2f(HSQUIRRELVM v)
-{
- SQInteger i;
- sq_getinteger(v,2,&i);
- sq_pushfloat(v,*((const SQFloat *)&i));
- return 1;
-}
-
-static SQInteger _g_blob_castf2i(HSQUIRRELVM v)
-{
- SQFloat f;
- sq_getfloat(v,2,&f);
- sq_pushinteger(v,*((const SQInteger *)&f));
- return 1;
-}
-
-static SQInteger _g_blob_swap2(HSQUIRRELVM v)
-{
- SQInteger i;
- sq_getinteger(v,2,&i);
- short s=(short)i;
- sq_pushinteger(v,(s<<8)|((s>>8)&0x00FF));
- return 1;
-}
-
-static SQInteger _g_blob_swap4(HSQUIRRELVM v)
-{
- SQInteger i;
- sq_getinteger(v,2,&i);
- unsigned int t4 = (unsigned int)i;
- __swap_dword(&t4);
- sq_pushinteger(v,(SQInteger)t4);
- return 1;
-}
-
-static SQInteger _g_blob_swapfloat(HSQUIRRELVM v)
-{
- SQFloat f;
- sq_getfloat(v,2,&f);
- __swap_dword((unsigned int *)&f);
- sq_pushfloat(v,f);
- return 1;
-}
-
-#define _DECL_GLOBALBLOB_FUNC(name,nparams,typecheck) {_SC(#name),_g_blob_##name,nparams,typecheck}
-static const SQRegFunction bloblib_funcs[]={
- _DECL_GLOBALBLOB_FUNC(casti2f,2,_SC(".n")),
- _DECL_GLOBALBLOB_FUNC(castf2i,2,_SC(".n")),
- _DECL_GLOBALBLOB_FUNC(swap2,2,_SC(".n")),
- _DECL_GLOBALBLOB_FUNC(swap4,2,_SC(".n")),
- _DECL_GLOBALBLOB_FUNC(swapfloat,2,_SC(".n")),
- {NULL,(SQFUNCTION)0,0,NULL}
-};
-
-SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr)
-{
- SQBlob *blob;
- if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG)))
- return -1;
- *ptr = blob->GetBuf();
- return SQ_OK;
-}
-
-SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx)
-{
- SQBlob *blob;
- if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG)))
- return -1;
- return blob->Len();
-}
-
-SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size)
-{
- SQInteger top = sq_gettop(v);
- sq_pushregistrytable(v);
- sq_pushstring(v,_SC("std_blob"),-1);
- if(SQ_SUCCEEDED(sq_get(v,-2))) {
- sq_remove(v,-2); //removes the registry
- sq_push(v,1); // push the this
- sq_pushinteger(v,size); //size
- SQBlob *blob = NULL;
- if(SQ_SUCCEEDED(sq_call(v,2,SQTrue,SQFalse))
- && SQ_SUCCEEDED(sq_getinstanceup(v,-1,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) {
- sq_remove(v,-2);
- return blob->GetBuf();
- }
- }
- sq_settop(v,top);
- return NULL;
-}
-
-SQRESULT sqstd_register_bloblib(HSQUIRRELVM v)
-{
- return declare_stream(v,_SC("blob"),(SQUserPointer)SQSTD_BLOB_TYPE_TAG,_SC("std_blob"),_blob_methods,bloblib_funcs);
-}
-
diff --git a/engines/twp/squirrel/sqstdblob.h b/engines/twp/squirrel/sqstdblob.h
deleted file mode 100755
index cd7ce567ecd..00000000000
--- a/engines/twp/squirrel/sqstdblob.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* see copyright notice in squirrel.h */
-#ifndef _SQSTDBLOB_H_
-#define _SQSTDBLOB_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-SQUIRREL_API SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size);
-SQUIRREL_API SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr);
-SQUIRREL_API SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx);
-
-SQUIRREL_API SQRESULT sqstd_register_bloblib(HSQUIRRELVM v);
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
-
-#endif /*_SQSTDBLOB_H_*/
-
diff --git a/engines/twp/squirrel/sqstdblobimpl.h b/engines/twp/squirrel/sqstdblobimpl.h
deleted file mode 100755
index bfdaddc29e9..00000000000
--- a/engines/twp/squirrel/sqstdblobimpl.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* see copyright notice in squirrel.h */
-#ifndef _SQSTD_BLOBIMPL_H_
-#define _SQSTD_BLOBIMPL_H_
-
-struct SQBlob : public SQStream
-{
- SQBlob(SQInteger size) {
- _size = size;
- _allocated = size;
- _buf = (unsigned char *)sq_malloc(size);
- memset(_buf, 0, _size);
- _ptr = 0;
- _owns = true;
- }
- virtual ~SQBlob() {
- sq_free(_buf, _allocated);
- }
- SQInteger Write(void *buffer, SQInteger size) {
- if(!CanAdvance(size)) {
- GrowBufOf(_ptr + size - _size);
- }
- memcpy(&_buf[_ptr], buffer, size);
- _ptr += size;
- return size;
- }
- SQInteger Read(void *buffer,SQInteger size) {
- SQInteger n = size;
- if(!CanAdvance(size)) {
- if((_size - _ptr) > 0)
- n = _size - _ptr;
- else return 0;
- }
- memcpy(buffer, &_buf[_ptr], n);
- _ptr += n;
- return n;
- }
- bool Resize(SQInteger n) {
- if(!_owns) return false;
- if(n != _allocated) {
- unsigned char *newbuf = (unsigned char *)sq_malloc(n);
- memset(newbuf,0,n);
- if(_size > n)
- memcpy(newbuf,_buf,n);
- else
- memcpy(newbuf,_buf,_size);
- sq_free(_buf,_allocated);
- _buf=newbuf;
- _allocated = n;
- if(_size > _allocated)
- _size = _allocated;
- if(_ptr > _allocated)
- _ptr = _allocated;
- }
- return true;
- }
- bool GrowBufOf(SQInteger n)
- {
- bool ret = true;
- if(_size + n > _allocated) {
- if(_size + n > _size * 2)
- ret = Resize(_size + n);
- else
- ret = Resize(_size * 2);
- }
- _size = _size + n;
- return ret;
- }
- bool CanAdvance(SQInteger n) {
- if(_ptr+n>_size)return false;
- return true;
- }
- SQInteger Seek(SQInteger offset, SQInteger origin) {
- switch(origin) {
- case SQ_SEEK_SET:
- if(offset > _size || offset < 0) return -1;
- _ptr = offset;
- break;
- case SQ_SEEK_CUR:
- if(_ptr + offset > _size || _ptr + offset < 0) return -1;
- _ptr += offset;
- break;
- case SQ_SEEK_END:
- if(_size + offset > _size || _size + offset < 0) return -1;
- _ptr = _size + offset;
- break;
- default: return -1;
- }
- return 0;
- }
- bool IsValid() {
- return _size == 0 || _buf?true:false;
- }
- bool EOS() {
- return _ptr == _size;
- }
- SQInteger Flush() { return 0; }
- SQInteger Tell() { return _ptr; }
- SQInteger Len() { return _size; }
- SQUserPointer GetBuf(){ return _buf; }
-private:
- SQInteger _size;
- SQInteger _allocated;
- SQInteger _ptr;
- unsigned char *_buf;
- bool _owns;
-};
-
-#endif //_SQSTD_BLOBIMPL_H_
diff --git a/engines/twp/squirrel/sqstdio.cpp b/engines/twp/squirrel/sqstdio.cpp
deleted file mode 100755
index 4e9df69b496..00000000000
--- a/engines/twp/squirrel/sqstdio.cpp
+++ /dev/null
@@ -1,442 +0,0 @@
-/* see copyright notice in squirrel.h */
-#include <new>
-#include <stdio.h>
-#include "squirrel.h"
-#include "sqstdio.h"
-#include "sqstdstream.h"
-
-#define SQSTD_FILE_TYPE_TAG ((SQUnsignedInteger)(SQSTD_STREAM_TYPE_TAG | 0x00000001))
-//basic API
-SQFILE sqstd_fopen(const SQChar *filename ,const SQChar *mode)
-{
- return (SQFILE)fopen(filename,mode);
-}
-
-SQInteger sqstd_fread(void* buffer, SQInteger size, SQInteger count, SQFILE file)
-{
- SQInteger ret = (SQInteger)fread(buffer,size,count,(FILE *)file);
- return ret;
-}
-
-SQInteger sqstd_fwrite(const SQUserPointer buffer, SQInteger size, SQInteger count, SQFILE file)
-{
- return (SQInteger)fwrite(buffer,size,count,(FILE *)file);
-}
-
-SQInteger sqstd_fseek(SQFILE file, SQInteger offset, SQInteger origin)
-{
- SQInteger realorigin;
- switch(origin) {
- case SQ_SEEK_CUR: realorigin = SEEK_CUR; break;
- case SQ_SEEK_END: realorigin = SEEK_END; break;
- case SQ_SEEK_SET: realorigin = SEEK_SET; break;
- default: return -1; //failed
- }
- return fseek((FILE *)file,(long)offset,(int)realorigin);
-}
-
-SQInteger sqstd_ftell(SQFILE file)
-{
- return ftell((FILE *)file);
-}
-
-SQInteger sqstd_fflush(SQFILE file)
-{
- return fflush((FILE *)file);
-}
-
-SQInteger sqstd_fclose(SQFILE file)
-{
- return fclose((FILE *)file);
-}
-
-SQInteger sqstd_feof(SQFILE file)
-{
- return feof((FILE *)file);
-}
-
-//File
-struct SQFile : public SQStream {
- SQFile() { _handle = NULL; _owns = false;}
- SQFile(SQFILE file, bool owns) { _handle = file; _owns = owns;}
- virtual ~SQFile() { Close(); }
- bool Open(const SQChar *filename ,const SQChar *mode) {
- Close();
- if( (_handle = sqstd_fopen(filename,mode)) ) {
- _owns = true;
- return true;
- }
- return false;
- }
- void Close() {
- if(_handle && _owns) {
- sqstd_fclose(_handle);
- _handle = NULL;
- _owns = false;
- }
- }
- SQInteger Read(void *buffer,SQInteger size) {
- return sqstd_fread(buffer,1,size,_handle);
- }
- SQInteger Write(void *buffer,SQInteger size) {
- return sqstd_fwrite(buffer,1,size,_handle);
- }
- SQInteger Flush() {
- return sqstd_fflush(_handle);
- }
- SQInteger Tell() {
- return sqstd_ftell(_handle);
- }
- SQInteger Len() {
- SQInteger prevpos=Tell();
- Seek(0,SQ_SEEK_END);
- SQInteger size=Tell();
- Seek(prevpos,SQ_SEEK_SET);
- return size;
- }
- SQInteger Seek(SQInteger offset, SQInteger origin) {
- return sqstd_fseek(_handle,offset,origin);
- }
- bool IsValid() { return _handle?true:false; }
- bool EOS() { return Tell()==Len()?true:false;}
- SQFILE GetHandle() {return _handle;}
-private:
- SQFILE _handle;
- bool _owns;
-};
-
-static SQInteger _file__typeof(HSQUIRRELVM v)
-{
- sq_pushstring(v,_SC("file"),-1);
- return 1;
-}
-
-static SQInteger _file_releasehook(SQUserPointer p, SQInteger SQ_UNUSED_ARG(size))
-{
- SQFile *self = (SQFile*)p;
- self->~SQFile();
- sq_free(self,sizeof(SQFile));
- return 1;
-}
-
-static SQInteger _file_constructor(HSQUIRRELVM v)
-{
- const SQChar *filename,*mode;
- bool owns = true;
- SQFile *f;
- SQFILE newf;
- if(sq_gettype(v,2) == OT_STRING && sq_gettype(v,3) == OT_STRING) {
- sq_getstring(v, 2, &filename);
- sq_getstring(v, 3, &mode);
- newf = sqstd_fopen(filename, mode);
- if(!newf) return sq_throwerror(v, _SC("cannot open file"));
- } else if(sq_gettype(v,2) == OT_USERPOINTER) {
- owns = !(sq_gettype(v,3) == OT_NULL);
- sq_getuserpointer(v,2,&newf);
- } else {
- return sq_throwerror(v,_SC("wrong parameter"));
- }
-
- f = new (sq_malloc(sizeof(SQFile)))SQFile(newf,owns);
- if(SQ_FAILED(sq_setinstanceup(v,1,f))) {
- f->~SQFile();
- sq_free(f,sizeof(SQFile));
- return sq_throwerror(v, _SC("cannot create blob with negative size"));
- }
- sq_setreleasehook(v,1,_file_releasehook);
- return 0;
-}
-
-static SQInteger _file_close(HSQUIRRELVM v)
-{
- SQFile *self = NULL;
- if(SQ_SUCCEEDED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_FILE_TYPE_TAG))
- && self != NULL)
- {
- self->Close();
- }
- return 0;
-}
-
-//bindings
-#define _DECL_FILE_FUNC(name,nparams,typecheck) {_SC(#name),_file_##name,nparams,typecheck}
-static const SQRegFunction _file_methods[] = {
- _DECL_FILE_FUNC(constructor,3,_SC("x")),
- _DECL_FILE_FUNC(_typeof,1,_SC("x")),
- _DECL_FILE_FUNC(close,1,_SC("x")),
- {NULL,(SQFUNCTION)0,0,NULL}
-};
-
-
-
-SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own)
-{
- SQInteger top = sq_gettop(v);
- sq_pushregistrytable(v);
- sq_pushstring(v,_SC("std_file"),-1);
- if(SQ_SUCCEEDED(sq_get(v,-2))) {
- sq_remove(v,-2); //removes the registry
- sq_pushroottable(v); // push the this
- sq_pushuserpointer(v,file); //file
- if(own){
- sq_pushinteger(v,1); //true
- }
- else{
- sq_pushnull(v); //false
- }
- if(SQ_SUCCEEDED( sq_call(v,3,SQTrue,SQFalse) )) {
- sq_remove(v,-2);
- return SQ_OK;
- }
- }
- sq_settop(v,top);
- return SQ_ERROR;
-}
-
-SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file)
-{
- SQFile *fileobj = NULL;
- if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(SQUserPointer*)&fileobj,(SQUserPointer)SQSTD_FILE_TYPE_TAG))) {
- *file = fileobj->GetHandle();
- return SQ_OK;
- }
- return sq_throwerror(v,_SC("not a file"));
-}
-
-
-
-#define IO_BUFFER_SIZE 2048
-struct IOBuffer {
- unsigned char buffer[IO_BUFFER_SIZE];
- SQInteger size;
- SQInteger ptr;
- SQFILE file;
-};
-
-SQInteger _read_byte(IOBuffer *iobuffer)
-{
- if(iobuffer->ptr < iobuffer->size) {
-
- SQInteger ret = iobuffer->buffer[iobuffer->ptr];
- iobuffer->ptr++;
- return ret;
- }
- else {
- if( (iobuffer->size = sqstd_fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 )
- {
- SQInteger ret = iobuffer->buffer[0];
- iobuffer->ptr = 1;
- return ret;
- }
- }
-
- return 0;
-}
-
-SQInteger _read_two_bytes(IOBuffer *iobuffer)
-{
- if(iobuffer->ptr < iobuffer->size) {
- if(iobuffer->size < 2) return 0;
- SQInteger ret = *((const wchar_t*)&iobuffer->buffer[iobuffer->ptr]);
- iobuffer->ptr += 2;
- return ret;
- }
- else {
- if( (iobuffer->size = sqstd_fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 )
- {
- if(iobuffer->size < 2) return 0;
- SQInteger ret = *((const wchar_t*)&iobuffer->buffer[0]);
- iobuffer->ptr = 2;
- return ret;
- }
- }
-
- return 0;
-}
-
-static SQInteger _io_file_lexfeed_PLAIN(SQUserPointer iobuf)
-{
- IOBuffer *iobuffer = (IOBuffer *)iobuf;
- return _read_byte(iobuffer);
-
-}
-
-static SQInteger _io_file_lexfeed_UCS2_LE(SQUserPointer iobuf)
-{
- SQInteger ret;
- IOBuffer *iobuffer = (IOBuffer *)iobuf;
- if( (ret = _read_two_bytes(iobuffer)) > 0 )
- return ret;
- return 0;
-}
-
-static SQInteger _io_file_lexfeed_UCS2_BE(SQUserPointer iobuf)
-{
- SQInteger c;
- IOBuffer *iobuffer = (IOBuffer *)iobuf;
- if( (c = _read_two_bytes(iobuffer)) > 0 ) {
- c = ((c>>8)&0x00FF)| ((c<<8)&0xFF00);
- return c;
- }
- return 0;
-}
-
-SQInteger file_read(SQUserPointer file,SQUserPointer buf,SQInteger size)
-{
- SQInteger ret;
- if( ( ret = sqstd_fread(buf,1,size,(SQFILE)file ))!=0 )return ret;
- return -1;
-}
-
-SQInteger file_write(SQUserPointer file,SQUserPointer p,SQInteger size)
-{
- return sqstd_fwrite(p,1,size,(SQFILE)file);
-}
-
-SQRESULT sqstd_loadfile(HSQUIRRELVM v,const SQChar *filename,SQBool printerror)
-{
- SQFILE file = sqstd_fopen(filename,_SC("rb"));
-
- SQInteger ret;
- unsigned short us;
- unsigned char uc;
- SQLEXREADFUNC func = _io_file_lexfeed_PLAIN;
- if(file){
- ret = sqstd_fread(&us,1,2,file);
- if(ret != 2) {
- //probably an empty file
- us = 0;
- }
- if(us == SQ_BYTECODE_STREAM_TAG) { //BYTECODE
- sqstd_fseek(file,0,SQ_SEEK_SET);
- if(SQ_SUCCEEDED(sq_readclosure(v,file_read,file))) {
- sqstd_fclose(file);
- return SQ_OK;
- }
- }
- else { //SCRIPT
-
- switch(us)
- {
- //gotta swap the next 2 lines on BIG endian machines
- case 0xFFFE: func = _io_file_lexfeed_UCS2_BE; break;//UTF-16 little endian;
- case 0xFEFF: func = _io_file_lexfeed_UCS2_LE; break;//UTF-16 big endian;
- case 0xBBEF:
- if(sqstd_fread(&uc,1,sizeof(uc),file) == 0) {
- sqstd_fclose(file);
- return sq_throwerror(v,_SC("io error"));
- }
- if(uc != 0xBF) {
- sqstd_fclose(file);
- return sq_throwerror(v,_SC("Unrecognized encoding"));
- }
-
- func = _io_file_lexfeed_PLAIN;
- break;//UTF-8 ;
- default: sqstd_fseek(file,0,SQ_SEEK_SET); break; // ascii
- }
- IOBuffer buffer;
- buffer.ptr = 0;
- buffer.size = 0;
- buffer.file = file;
- if(SQ_SUCCEEDED(sq_compile(v,func,&buffer,filename,printerror))){
- sqstd_fclose(file);
- return SQ_OK;
- }
- }
- sqstd_fclose(file);
- return SQ_ERROR;
- }
- return sq_throwerror(v,_SC("cannot open the file"));
-}
-
-SQRESULT sqstd_dofile(HSQUIRRELVM v,const SQChar *filename,SQBool retval,SQBool printerror)
-{
- //at least one entry must exist in order for us to push it as the environment
- if(sq_gettop(v) == 0)
- return sq_throwerror(v,_SC("environment table expected"));
-
- if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,printerror))) {
- sq_push(v,-2);
- if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue))) {
- sq_remove(v,retval?-2:-1); //removes the closure
- return 1;
- }
- sq_pop(v,1); //removes the closure
- }
- return SQ_ERROR;
-}
-
-SQRESULT sqstd_writeclosuretofile(HSQUIRRELVM v,const SQChar *filename)
-{
- SQFILE file = sqstd_fopen(filename,_SC("wb+"));
- if(!file) return sq_throwerror(v,_SC("cannot open the file"));
- if(SQ_SUCCEEDED(sq_writeclosure(v,file_write,file))) {
- sqstd_fclose(file);
- return SQ_OK;
- }
- sqstd_fclose(file);
- return SQ_ERROR; //forward the error
-}
-
-SQInteger _g_io_loadfile(HSQUIRRELVM v)
-{
- const SQChar *filename;
- SQBool printerror = SQFalse;
- sq_getstring(v,2,&filename);
- if(sq_gettop(v) >= 3) {
- sq_getbool(v,3,&printerror);
- }
- if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,printerror)))
- return 1;
- return SQ_ERROR; //propagates the error
-}
-
-SQInteger _g_io_writeclosuretofile(HSQUIRRELVM v)
-{
- const SQChar *filename;
- sq_getstring(v,2,&filename);
- if(SQ_SUCCEEDED(sqstd_writeclosuretofile(v,filename)))
- return 1;
- return SQ_ERROR; //propagates the error
-}
-
-SQInteger _g_io_dofile(HSQUIRRELVM v)
-{
- const SQChar *filename;
- SQBool printerror = SQFalse;
- sq_getstring(v,2,&filename);
- if(sq_gettop(v) >= 3) {
- sq_getbool(v,3,&printerror);
- }
- sq_push(v,1); //repush the this
- if(SQ_SUCCEEDED(sqstd_dofile(v,filename,SQTrue,printerror)))
- return 1;
- return SQ_ERROR; //propagates the error
-}
-
-#define _DECL_GLOBALIO_FUNC(name,nparams,typecheck) {_SC(#name),_g_io_##name,nparams,typecheck}
-static const SQRegFunction iolib_funcs[]={
- _DECL_GLOBALIO_FUNC(loadfile,-2,_SC(".sb")),
- _DECL_GLOBALIO_FUNC(dofile,-2,_SC(".sb")),
- _DECL_GLOBALIO_FUNC(writeclosuretofile,3,_SC(".sc")),
- {NULL,(SQFUNCTION)0,0,NULL}
-};
-
-SQRESULT sqstd_register_iolib(HSQUIRRELVM v)
-{
- SQInteger top = sq_gettop(v);
- //create delegate
- declare_stream(v,_SC("file"),(SQUserPointer)SQSTD_FILE_TYPE_TAG,_SC("std_file"),_file_methods,iolib_funcs);
- sq_pushstring(v,_SC("stdout"),-1);
- sqstd_createfile(v,stdout,SQFalse);
- sq_newslot(v,-3,SQFalse);
- sq_pushstring(v,_SC("stdin"),-1);
- sqstd_createfile(v,stdin,SQFalse);
- sq_newslot(v,-3,SQFalse);
- sq_pushstring(v,_SC("stderr"),-1);
- sqstd_createfile(v,stderr,SQFalse);
- sq_newslot(v,-3,SQFalse);
- sq_settop(v,top);
- return SQ_OK;
-}
diff --git a/engines/twp/squirrel/sqstdio.h b/engines/twp/squirrel/sqstdio.h
deleted file mode 100755
index fbc745101b8..00000000000
--- a/engines/twp/squirrel/sqstdio.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* see copyright notice in squirrel.h */
-#ifndef _SQSTDIO_H_
-#define _SQSTDIO_H_
-
-#ifdef __cplusplus
-
-#define SQSTD_STREAM_TYPE_TAG 0x80000000
-
-struct SQStream {
- virtual ~SQStream() {}
- virtual SQInteger Read(void *buffer, SQInteger size) = 0;
- virtual SQInteger Write(void *buffer, SQInteger size) = 0;
- virtual SQInteger Flush() = 0;
- virtual SQInteger Tell() = 0;
- virtual SQInteger Len() = 0;
- virtual SQInteger Seek(SQInteger offset, SQInteger origin) = 0;
- virtual bool IsValid() = 0;
- virtual bool EOS() = 0;
-};
-
-extern "C" {
-#endif
-
-#define SQ_SEEK_CUR 0
-#define SQ_SEEK_END 1
-#define SQ_SEEK_SET 2
-
-typedef void* SQFILE;
-
-SQUIRREL_API SQFILE sqstd_fopen(const SQChar *,const SQChar *);
-SQUIRREL_API SQInteger sqstd_fread(SQUserPointer, SQInteger, SQInteger, SQFILE);
-SQUIRREL_API SQInteger sqstd_fwrite(const SQUserPointer, SQInteger, SQInteger, SQFILE);
-SQUIRREL_API SQInteger sqstd_fseek(SQFILE , SQInteger , SQInteger);
-SQUIRREL_API SQInteger sqstd_ftell(SQFILE);
-SQUIRREL_API SQInteger sqstd_fflush(SQFILE);
-SQUIRREL_API SQInteger sqstd_fclose(SQFILE);
-SQUIRREL_API SQInteger sqstd_feof(SQFILE);
-
-SQUIRREL_API SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own);
-SQUIRREL_API SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file);
-
-//compiler helpers
-SQUIRREL_API SQRESULT sqstd_loadfile(HSQUIRRELVM v,const SQChar *filename,SQBool printerror);
-SQUIRREL_API SQRESULT sqstd_dofile(HSQUIRRELVM v,const SQChar *filename,SQBool retval,SQBool printerror);
-SQUIRREL_API SQRESULT sqstd_writeclosuretofile(HSQUIRRELVM v,const SQChar *filename);
-
-SQUIRREL_API SQRESULT sqstd_register_iolib(HSQUIRRELVM v);
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
-
-#endif /*_SQSTDIO_H_*/
-
diff --git a/engines/twp/squirrel/sqstdstream.cpp b/engines/twp/squirrel/sqstdstream.cpp
deleted file mode 100755
index abdd8438cfb..00000000000
--- a/engines/twp/squirrel/sqstdstream.cpp
+++ /dev/null
@@ -1,336 +0,0 @@
-/* see copyright notice in squirrel.h */
-#include <new>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "squirrel.h"
-#include "sqstdio.h"
-#include "sqstdblob.h"
-#include "sqstdstream.h"
-#include "sqstdblobimpl.h"
-
-#define SETUP_STREAM(v) \
- SQStream *self = NULL; \
- if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)((SQUnsignedInteger)SQSTD_STREAM_TYPE_TAG)))) \
- return sq_throwerror(v,_SC("invalid type tag")); \
- if(!self || !self->IsValid()) \
- return sq_throwerror(v,_SC("the stream is invalid"));
-
-SQInteger _stream_readblob(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- SQUserPointer data,blobp;
- SQInteger size,res;
- sq_getinteger(v,2,&size);
- if(size > self->Len()) {
- size = self->Len();
- }
- data = sq_getscratchpad(v,size);
- res = self->Read(data,size);
- if(res <= 0)
- return sq_throwerror(v,_SC("no data left to read"));
- blobp = sqstd_createblob(v,res);
- memcpy(blobp,data,res);
- return 1;
-}
-
-#define SAFE_READN(ptr,len) { \
- if(self->Read(ptr,len) != len) return sq_throwerror(v,_SC("io error")); \
- }
-SQInteger _stream_readn(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- SQInteger format;
- sq_getinteger(v, 2, &format);
- switch(format) {
- case 'l': {
- SQInteger i;
- SAFE_READN(&i, sizeof(i));
- sq_pushinteger(v, i);
- }
- break;
- case 'i': {
- SQInt32 i;
- SAFE_READN(&i, sizeof(i));
- sq_pushinteger(v, i);
- }
- break;
- case 's': {
- short s;
- SAFE_READN(&s, sizeof(short));
- sq_pushinteger(v, s);
- }
- break;
- case 'w': {
- unsigned short w;
- SAFE_READN(&w, sizeof(unsigned short));
- sq_pushinteger(v, w);
- }
- break;
- case 'c': {
- char c;
- SAFE_READN(&c, sizeof(char));
- sq_pushinteger(v, c);
- }
- break;
- case 'b': {
- unsigned char c;
- SAFE_READN(&c, sizeof(unsigned char));
- sq_pushinteger(v, c);
- }
- break;
- case 'f': {
- float f;
- SAFE_READN(&f, sizeof(float));
- sq_pushfloat(v, f);
- }
- break;
- case 'd': {
- double d;
- SAFE_READN(&d, sizeof(double));
- sq_pushfloat(v, (SQFloat)d);
- }
- break;
- default:
- return sq_throwerror(v, _SC("invalid format"));
- }
- return 1;
-}
-
-SQInteger _stream_writeblob(HSQUIRRELVM v)
-{
- SQUserPointer data;
- SQInteger size;
- SETUP_STREAM(v);
- if(SQ_FAILED(sqstd_getblob(v,2,&data)))
- return sq_throwerror(v,_SC("invalid parameter"));
- size = sqstd_getblobsize(v,2);
- if(self->Write(data,size) != size)
- return sq_throwerror(v,_SC("io error"));
- sq_pushinteger(v,size);
- return 1;
-}
-
-SQInteger _stream_writen(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- SQInteger format, ti;
- SQFloat tf;
- sq_getinteger(v, 3, &format);
- switch(format) {
- case 'l': {
- SQInteger i;
- sq_getinteger(v, 2, &ti);
- i = ti;
- self->Write(&i, sizeof(SQInteger));
- }
- break;
- case 'i': {
- SQInt32 i;
- sq_getinteger(v, 2, &ti);
- i = (SQInt32)ti;
- self->Write(&i, sizeof(SQInt32));
- }
- break;
- case 's': {
- short s;
- sq_getinteger(v, 2, &ti);
- s = (short)ti;
- self->Write(&s, sizeof(short));
- }
- break;
- case 'w': {
- unsigned short w;
- sq_getinteger(v, 2, &ti);
- w = (unsigned short)ti;
- self->Write(&w, sizeof(unsigned short));
- }
- break;
- case 'c': {
- char c;
- sq_getinteger(v, 2, &ti);
- c = (char)ti;
- self->Write(&c, sizeof(char));
- }
- break;
- case 'b': {
- unsigned char b;
- sq_getinteger(v, 2, &ti);
- b = (unsigned char)ti;
- self->Write(&b, sizeof(unsigned char));
- }
- break;
- case 'f': {
- float f;
- sq_getfloat(v, 2, &tf);
- f = (float)tf;
- self->Write(&f, sizeof(float));
- }
- break;
- case 'd': {
- double d;
- sq_getfloat(v, 2, &tf);
- d = tf;
- self->Write(&d, sizeof(double));
- }
- break;
- default:
- return sq_throwerror(v, _SC("invalid format"));
- }
- return 0;
-}
-
-SQInteger _stream_seek(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- SQInteger offset, origin = SQ_SEEK_SET;
- sq_getinteger(v, 2, &offset);
- if(sq_gettop(v) > 2) {
- SQInteger t;
- sq_getinteger(v, 3, &t);
- switch(t) {
- case 'b': origin = SQ_SEEK_SET; break;
- case 'c': origin = SQ_SEEK_CUR; break;
- case 'e': origin = SQ_SEEK_END; break;
- default: return sq_throwerror(v,_SC("invalid origin"));
- }
- }
- sq_pushinteger(v, self->Seek(offset, origin));
- return 1;
-}
-
-SQInteger _stream_tell(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- sq_pushinteger(v, self->Tell());
- return 1;
-}
-
-SQInteger _stream_len(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- sq_pushinteger(v, self->Len());
- return 1;
-}
-
-SQInteger _stream_flush(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- if(!self->Flush())
- sq_pushinteger(v, 1);
- else
- sq_pushnull(v);
- return 1;
-}
-
-SQInteger _stream_eos(HSQUIRRELVM v)
-{
- SETUP_STREAM(v);
- if(self->EOS())
- sq_pushinteger(v, 1);
- else
- sq_pushnull(v);
- return 1;
-}
-
- SQInteger _stream__cloned(HSQUIRRELVM v)
- {
- return sq_throwerror(v,_SC("this object cannot be cloned"));
- }
-
-static const SQRegFunction _stream_methods[] = {
- _DECL_STREAM_FUNC(readblob,2,_SC("xn")),
- _DECL_STREAM_FUNC(readn,2,_SC("xn")),
- _DECL_STREAM_FUNC(writeblob,-2,_SC("xx")),
- _DECL_STREAM_FUNC(writen,3,_SC("xnn")),
- _DECL_STREAM_FUNC(seek,-2,_SC("xnn")),
- _DECL_STREAM_FUNC(tell,1,_SC("x")),
- _DECL_STREAM_FUNC(len,1,_SC("x")),
- _DECL_STREAM_FUNC(eos,1,_SC("x")),
- _DECL_STREAM_FUNC(flush,1,_SC("x")),
- _DECL_STREAM_FUNC(_cloned,0,NULL),
- {NULL,(SQFUNCTION)0,0,NULL}
-};
-
-void init_streamclass(HSQUIRRELVM v)
-{
- sq_pushregistrytable(v);
- sq_pushstring(v,_SC("std_stream"),-1);
- if(SQ_FAILED(sq_get(v,-2))) {
- sq_pushstring(v,_SC("std_stream"),-1);
- sq_newclass(v,SQFalse);
- sq_settypetag(v,-1,(SQUserPointer)((SQUnsignedInteger)SQSTD_STREAM_TYPE_TAG));
- SQInteger i = 0;
- while(_stream_methods[i].name != 0) {
- const SQRegFunction &f = _stream_methods[i];
- sq_pushstring(v,f.name,-1);
- sq_newclosure(v,f.f,0);
- sq_setparamscheck(v,f.nparamscheck,f.typemask);
- sq_newslot(v,-3,SQFalse);
- i++;
- }
- sq_newslot(v,-3,SQFalse);
- sq_pushroottable(v);
- sq_pushstring(v,_SC("stream"),-1);
- sq_pushstring(v,_SC("std_stream"),-1);
- sq_get(v,-4);
- sq_newslot(v,-3,SQFalse);
- sq_pop(v,1);
- }
- else {
- sq_pop(v,1); //result
- }
- sq_pop(v,1);
-}
-
-SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,const SQRegFunction *methods,const SQRegFunction *globals)
-{
- if(sq_gettype(v,-1) != OT_TABLE)
- return sq_throwerror(v,_SC("table expected"));
- SQInteger top = sq_gettop(v);
- //create delegate
- init_streamclass(v);
- sq_pushregistrytable(v);
- sq_pushstring(v,reg_name,-1);
- sq_pushstring(v,_SC("std_stream"),-1);
- if(SQ_SUCCEEDED(sq_get(v,-3))) {
- sq_newclass(v,SQTrue);
- sq_settypetag(v,-1,typetag);
- SQInteger i = 0;
- while(methods[i].name != 0) {
- const SQRegFunction &f = methods[i];
- sq_pushstring(v,f.name,-1);
- sq_newclosure(v,f.f,0);
- sq_setparamscheck(v,f.nparamscheck,f.typemask);
- sq_setnativeclosurename(v,-1,f.name);
- sq_newslot(v,-3,SQFalse);
- i++;
- }
- sq_newslot(v,-3,SQFalse);
- sq_pop(v,1);
-
- i = 0;
- while(globals[i].name!=0)
- {
- const SQRegFunction &f = globals[i];
- sq_pushstring(v,f.name,-1);
- sq_newclosure(v,f.f,0);
- sq_setparamscheck(v,f.nparamscheck,f.typemask);
- sq_setnativeclosurename(v,-1,f.name);
- sq_newslot(v,-3,SQFalse);
- i++;
- }
- //register the class in the target table
- sq_pushstring(v,name,-1);
- sq_pushregistrytable(v);
- sq_pushstring(v,reg_name,-1);
- sq_get(v,-2);
- sq_remove(v,-2);
- sq_newslot(v,-3,SQFalse);
-
- sq_settop(v,top);
- return SQ_OK;
- }
- sq_settop(v,top);
- return SQ_ERROR;
-}
diff --git a/engines/twp/squirrel/sqstdstream.h b/engines/twp/squirrel/sqstdstream.h
deleted file mode 100755
index 867c135fdee..00000000000
--- a/engines/twp/squirrel/sqstdstream.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* see copyright notice in squirrel.h */
-#ifndef _SQSTD_STREAM_H_
-#define _SQSTD_STREAM_H_
-
-SQInteger _stream_readblob(HSQUIRRELVM v);
-SQInteger _stream_readline(HSQUIRRELVM v);
-SQInteger _stream_readn(HSQUIRRELVM v);
-SQInteger _stream_writeblob(HSQUIRRELVM v);
-SQInteger _stream_writen(HSQUIRRELVM v);
-SQInteger _stream_seek(HSQUIRRELVM v);
-SQInteger _stream_tell(HSQUIRRELVM v);
-SQInteger _stream_len(HSQUIRRELVM v);
-SQInteger _stream_eos(HSQUIRRELVM v);
-SQInteger _stream_flush(HSQUIRRELVM v);
-
-#define _DECL_STREAM_FUNC(name,nparams,typecheck) {_SC(#name),_stream_##name,nparams,typecheck}
-SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,const SQRegFunction *methods,const SQRegFunction *globals);
-#endif /*_SQSTD_STREAM_H_*/
diff --git a/engines/twp/squirrel/sqstdsystem.h b/engines/twp/squirrel/sqstdsystem.h
deleted file mode 100755
index 8c823283329..00000000000
--- a/engines/twp/squirrel/sqstdsystem.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/* see copyright notice in squirrel.h */
-#ifndef _SQSTD_SYSTEMLIB_H_
-#define _SQSTD_SYSTEMLIB_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-SQUIRREL_API SQInteger sqstd_register_systemlib(HSQUIRRELVM v);
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
-
-#endif /* _SQSTD_SYSTEMLIB_H_ */
diff --git a/engines/twp/squirrel/squirrel.dsp b/engines/twp/squirrel/squirrel.dsp
deleted file mode 100755
index 66a84f7dd74..00000000000
--- a/engines/twp/squirrel/squirrel.dsp
+++ /dev/null
@@ -1,302 +0,0 @@
-# Microsoft Developer Studio Project File - Name="squirrel" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=squirrel - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "squirrel.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "squirrel.mak" CFG="squirrel - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "squirrel - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "squirrel - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "GARBAGE_COLLECTOR" /YX /FD /c
-# ADD BASE RSC /l 0x410 /d "NDEBUG"
-# ADD RSC /l 0x410 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\lib\squirrel.lib"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x410 /d "_DEBUG"
-# ADD RSC /l 0x410 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\lib\squirrel.lib"
-
-!ENDIF
-
-# Begin Target
-
-# Name "squirrel - Win32 Release"
-# Name "squirrel - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\sqapi.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqbaselib.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqcompiler.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqdebug.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqfuncstate.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqlexer.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqmem.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqobject.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqstate.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqtable.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqclass.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqvm.cpp
-
-!IF "$(CFG)" == "squirrel - Win32 Release"
-
-!ELSEIF "$(CFG)" == "squirrel - Win32 Debug"
-
-# ADD CPP /YX"stdafx.h"
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\sqarray.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqclosure.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqcompiler.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqfuncproto.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqfuncstate.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqlexer.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqobject.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqopcodes.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqpcheader.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqstate.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqstring.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqtable.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\squserdata.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\squtils.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqclass.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\sqvm.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/engines/twp/vm.cpp b/engines/twp/vm.cpp
index 5617b35148b..67d8aa8beff 100644
--- a/engines/twp/vm.cpp
+++ b/engines/twp/vm.cpp
@@ -29,7 +29,6 @@
#include "twp/squirrel/sqtable.h"
#include "twp/squirrel/sqstdstring.h"
#include "twp/squirrel/sqstdmath.h"
-#include "twp/squirrel/sqstdio.h"
#include "twp/squirrel/sqstdaux.h"
#include "twp/squirrel/sqfuncproto.h"
#include "twp/squirrel/sqclosure.h"
@@ -81,7 +80,6 @@ Vm::Vm() {
sq_pushroottable(v);
sqstd_register_stringlib(v);
sqstd_register_mathlib(v);
- sqstd_register_iolib(v);
sq_pop(v, 1);
sqgame_register_constants(v);
Commit: ca035348bf778b10b904e629f64fbb699d72d3f2
https://github.com/scummvm/scummvm/commit/ca035348bf778b10b904e629f64fbb699d72d3f2
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:17:27+02:00
Commit Message:
TWP: Fix out-of-bounds access in squirrel.
Coverity CID 1540534
Changed paths:
engines/twp/squirrel/sqstdstring.cpp
diff --git a/engines/twp/squirrel/sqstdstring.cpp b/engines/twp/squirrel/sqstdstring.cpp
index 7b7bd4c0d45..a516bf4633d 100755
--- a/engines/twp/squirrel/sqstdstring.cpp
+++ b/engines/twp/squirrel/sqstdstring.cpp
@@ -332,7 +332,7 @@ static SQInteger _string_startswith(HSQUIRRELVM v)
SQInteger len = sq_getsize(v,2);
SQInteger cmplen = sq_getsize(v,3);
SQBool ret = SQFalse;
- if(cmplen <= len) {
+ if((len >=0) && (cmplen >=0) && (cmplen <= len)) {
ret = memcmp(str,cmp,sq_rsl(cmplen)) == 0 ? SQTrue : SQFalse;
}
sq_pushbool(v,ret);
Commit: cd69641753687731109d8455ef63ffc7acd54a85
https://github.com/scummvm/scummvm/commit/cd69641753687731109d8455ef63ffc7acd54a85
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:22:37+02:00
Commit Message:
TWP: Fix uninitialized pointer field in squirrel.
Coverity CID 1215800
Changed paths:
engines/twp/squirrel/sqclosure.h
diff --git a/engines/twp/squirrel/sqclosure.h b/engines/twp/squirrel/sqclosure.h
index 66495b94101..4787e83ee14 100755
--- a/engines/twp/squirrel/sqclosure.h
+++ b/engines/twp/squirrel/sqclosure.h
@@ -187,10 +187,10 @@ public:
void Finalize() { _NULL_SQOBJECT_VECTOR(_outervalues,_noutervalues); }
SQObjectType GetType() {return OT_NATIVECLOSURE;}
#endif
- SQInteger _nparamscheck;
+ SQInteger _nparamscheck = 0;
SQIntVec _typecheck;
- SQObjectPtr *_outervalues;
- SQUnsignedInteger _noutervalues;
+ SQObjectPtr *_outervalues = nullptr;
+ SQUnsignedInteger _noutervalues = 0;
SQWeakRef *_env;
SQFUNCTION _function;
SQObjectPtr _name;
Commit: ae007b1cc1c3664f1a4b6c20d1f0a5b9bf5ce350
https://github.com/scummvm/scummvm/commit/ae007b1cc1c3664f1a4b6c20d1f0a5b9bf5ce350
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:26:09+02:00
Commit Message:
TWP: Fix uninitialized scalar field in squirrel.
Coverity CID 968231
Changed paths:
engines/twp/squirrel/sqclosure.h
diff --git a/engines/twp/squirrel/sqclosure.h b/engines/twp/squirrel/sqclosure.h
index 4787e83ee14..aededee61ae 100755
--- a/engines/twp/squirrel/sqclosure.h
+++ b/engines/twp/squirrel/sqclosure.h
@@ -99,7 +99,7 @@ public:
#endif
SQObjectPtr *_valptr; /* pointer to value on stack, or _value below */
- SQInteger _idx; /* idx in stack array, for relocation */
+ SQInteger _idx = 0; /* idx in stack array, for relocation */
SQObjectPtr _value; /* value of outer after stack frame is closed */
SQOuter *_next; /* pointer to next outer when frame is open */
};
Commit: 77831edb7f8d87ab2ebe3274174209c1565649ea
https://github.com/scummvm/scummvm/commit/77831edb7f8d87ab2ebe3274174209c1565649ea
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:28:14+02:00
Commit Message:
TWP: Fix uninitialized pointer field in squirrel.
Coverity CID 968232
Changed paths:
engines/twp/squirrel/sqclosure.h
diff --git a/engines/twp/squirrel/sqclosure.h b/engines/twp/squirrel/sqclosure.h
index aededee61ae..ee319b3e659 100755
--- a/engines/twp/squirrel/sqclosure.h
+++ b/engines/twp/squirrel/sqclosure.h
@@ -66,8 +66,8 @@ public:
SQWeakRef *_root;
SQClass *_base;
SQFunctionProto *_function;
- SQObjectPtr *_outervalues;
- SQObjectPtr *_defaultparams;
+ SQObjectPtr *_outervalues = nullptr;
+ SQObjectPtr *_defaultparams = nullptr;
};
//////////////////////////////////////////////
Commit: e6c90819fafa0da78bbd011b6b71b1d053f6ccdc
https://github.com/scummvm/scummvm/commit/e6c90819fafa0da78bbd011b6b71b1d053f6ccdc
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:32:30+02:00
Commit Message:
TWP: Fix uninitialized pointer field in squirrel.
Coverity CID 968234
Changed paths:
engines/twp/squirrel/sqlexer.h
diff --git a/engines/twp/squirrel/sqlexer.h b/engines/twp/squirrel/sqlexer.h
index 55949d44f63..d1efa0ec25c 100755
--- a/engines/twp/squirrel/sqlexer.h
+++ b/engines/twp/squirrel/sqlexer.h
@@ -23,24 +23,24 @@ private:
SQInteger AddUTF8(SQUnsignedInteger ch);
SQInteger ProcessStringHexEscape(SQChar *dest, SQInteger maxdigits);
- SQInteger _curtoken;
- SQTable *_keywords;
- SQBool _reached_eof;
+ SQInteger _curtoken = 0;
+ SQTable *_keywords = nullptr;
+ SQBool _reached_eof = SQFalse;
public:
- SQInteger _prevtoken;
- SQInteger _currentline;
- SQInteger _lasttokenline;
- SQInteger _currentcolumn;
- const SQChar *_svalue;
- SQInteger _nvalue;
- SQFloat _fvalue;
- SQLEXREADFUNC _readf;
- SQUserPointer _up;
- LexChar _currdata;
- SQSharedState *_sharedstate;
+ SQInteger _prevtoken = 0;
+ SQInteger _currentline = 0;
+ SQInteger _lasttokenline = 0;
+ SQInteger _currentcolumn = 0;
+ const SQChar *_svalue = nullptr;
+ SQInteger _nvalue = 0;
+ SQFloat _fvalue = 0.f;
+ SQLEXREADFUNC _readf = nullptr;
+ SQUserPointer _up = nullptr;
+ LexChar _currdata = 0;
+ SQSharedState *_sharedstate = nullptr;
sqvector<SQChar> _longstr;
- CompilerErrorFunc _errfunc;
- void *_errtarget;
+ CompilerErrorFunc _errfunc = nullptr;
+ void *_errtarget = nullptr;
};
#endif
Commit: 4e10c9c7e49a65b5004fbfca7b2633829a635a7e
https://github.com/scummvm/scummvm/commit/4e10c9c7e49a65b5004fbfca7b2633829a635a7e
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:35:44+02:00
Commit Message:
TWP: Fix uninitialized pointer field in squirrel.
Coverity CID 968235
Changed paths:
engines/twp/squirrel/sqfuncproto.h
diff --git a/engines/twp/squirrel/sqfuncproto.h b/engines/twp/squirrel/sqfuncproto.h
index 052a365c95c..f9a50919da9 100755
--- a/engines/twp/squirrel/sqfuncproto.h
+++ b/engines/twp/squirrel/sqfuncproto.h
@@ -111,30 +111,30 @@ public:
SQObjectPtr _name;
SQInteger _stacksize;
bool _bgenerator;
- SQInteger _varparams;
+ SQInteger _varparams = 0;
- SQInteger _nlocalvarinfos;
- SQLocalVarInfo *_localvarinfos;
+ SQInteger _nlocalvarinfos = 0;
+ SQLocalVarInfo *_localvarinfos = nullptr;
- SQInteger _nlineinfos;
- SQLineInfo *_lineinfos;
+ SQInteger _nlineinfos = 0;
+ SQLineInfo *_lineinfos = nullptr;
- SQInteger _nliterals;
- SQObjectPtr *_literals;
+ SQInteger _nliterals = 0;
+ SQObjectPtr *_literals = nullptr;
- SQInteger _nparameters;
- SQObjectPtr *_parameters;
+ SQInteger _nparameters = 0;
+ SQObjectPtr *_parameters = nullptr;
- SQInteger _nfunctions;
- SQObjectPtr *_functions;
+ SQInteger _nfunctions = 0;
+ SQObjectPtr *_functions = nullptr;
- SQInteger _noutervalues;
- SQOuterVar *_outervalues;
+ SQInteger _noutervalues = 0;
+ SQOuterVar *_outervalues = nullptr;
- SQInteger _ndefaultparams;
- SQInteger *_defaultparams;
+ SQInteger _ndefaultparams = 0;
+ SQInteger *_defaultparams = nullptr;
- SQInteger _ninstructions;
+ SQInteger _ninstructions = 0;
SQInstruction _instructions[1];
};
Commit: dd9bc4b51cfc2d48ac663af8adca8cdb262c9640
https://github.com/scummvm/scummvm/commit/dd9bc4b51cfc2d48ac663af8adca8cdb262c9640
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:37:14+02:00
Commit Message:
TWP: Fix uninitialized pointer field in squirrel.
Coverity CID 968239
Changed paths:
engines/twp/squirrel/squserdata.h
diff --git a/engines/twp/squirrel/squserdata.h b/engines/twp/squirrel/squserdata.h
index ec217313be0..67a4ad17942 100755
--- a/engines/twp/squirrel/squserdata.h
+++ b/engines/twp/squirrel/squserdata.h
@@ -31,9 +31,9 @@ struct SQUserData : SQDelegable
}
- SQInteger _size;
+ SQInteger _size = 0;
SQRELEASEHOOK _hook;
- SQUserPointer _typetag;
+ SQUserPointer _typetag = nullptr;
//SQChar _val[1];
};
Commit: a0cb61f022c65e43cda7034d1438c81f565623b4
https://github.com/scummvm/scummvm/commit/a0cb61f022c65e43cda7034d1438c81f565623b4
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:38:48+02:00
Commit Message:
TWP: Fix uninitialized pointer field in squirrel.
Coverity CID 968240
Changed paths:
engines/twp/squirrel/sqvm.h
diff --git a/engines/twp/squirrel/sqvm.h b/engines/twp/squirrel/sqvm.h
index 7bf80ab9ea3..6ce48002c4b 100755
--- a/engines/twp/squirrel/sqvm.h
+++ b/engines/twp/squirrel/sqvm.h
@@ -146,8 +146,8 @@ public:
SQObjectPtrVec _stack;
- SQInteger _top;
- SQInteger _stackbase;
+ SQInteger _top = 0;
+ SQInteger _stackbase = 0;
SQOuter *_openouters;
SQObjectPtr _roottable;
SQObjectPtr _lasterror;
@@ -160,9 +160,9 @@ public:
SQObjectPtr temp_reg;
- CallInfo* _callsstack;
- SQInteger _callsstacksize;
- SQInteger _alloccallsstacksize;
+ CallInfo* _callsstack = nullptr;
+ SQInteger _callsstacksize = 0;
+ SQInteger _alloccallsstacksize = 0;
sqvector<CallInfo> _callstackdata;
ExceptionsTraps _etraps;
Commit: ad29f164d512e9db24e7100a63e56cfe79d1efe6
https://github.com/scummvm/scummvm/commit/ad29f164d512e9db24e7100a63e56cfe79d1efe6
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:42:32+02:00
Commit Message:
TWP: Fix structurally dead code field in squirrel.
Coverity CID 968242
Changed paths:
engines/twp/squirrel/sqcompiler.cpp
diff --git a/engines/twp/squirrel/sqcompiler.cpp b/engines/twp/squirrel/sqcompiler.cpp
index e3e673df2a0..b09e61f3c95 100755
--- a/engines/twp/squirrel/sqcompiler.cpp
+++ b/engines/twp/squirrel/sqcompiler.cpp
@@ -470,7 +470,7 @@ public:
void LogicalOrExp()
{
LogicalAndExp();
- for(;;) if(_token == TK_OR) {
+ if(_token == TK_OR) {
SQInteger first_exp = _fs->PopTarget();
SQInteger trg = _fs->PushTarget();
_fs->AddInstruction(_OP_OR, trg, 0, first_exp, 0);
@@ -483,8 +483,7 @@ public:
_fs->SnoozeOpt();
_fs->SetInstructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos));
_es.etype = EXPR;
- break;
- }else return;
+ }
}
void LogicalAndExp()
{
Commit: f0046daa22f71c7dda67b3f008bb37ccebfbb164
https://github.com/scummvm/scummvm/commit/f0046daa22f71c7dda67b3f008bb37ccebfbb164
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T22:48:57+02:00
Commit Message:
TWP: Fix structurally dead code field in squirrel.
Coverity CID 968243
Changed paths:
engines/twp/squirrel/sqlexer.cpp
diff --git a/engines/twp/squirrel/sqlexer.cpp b/engines/twp/squirrel/sqlexer.cpp
index 8a2bbf0a579..90236ef037c 100755
--- a/engines/twp/squirrel/sqlexer.cpp
+++ b/engines/twp/squirrel/sqlexer.cpp
@@ -158,7 +158,6 @@ SQInteger SQLexer::Lex()
case _SC('>'):
NEXT();
RETURN_TOKEN(TK_ATTR_CLOSE);
- continue;
default:
RETURN_TOKEN('/');
}
Commit: 4b9aad2271745b44b4ad04b3b1721072e3ef03c3
https://github.com/scummvm/scummvm/commit/4b9aad2271745b44b4ad04b3b1721072e3ef03c3
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T23:00:19+02:00
Commit Message:
TWP: Fix improper use of negative value in squirrel.
Coverity CID 1540520
Changed paths:
engines/twp/squirrel/sqstdstring.cpp
diff --git a/engines/twp/squirrel/sqstdstring.cpp b/engines/twp/squirrel/sqstdstring.cpp
index a516bf4633d..0cec000fd4d 100755
--- a/engines/twp/squirrel/sqstdstring.cpp
+++ b/engines/twp/squirrel/sqstdstring.cpp
@@ -221,6 +221,8 @@ static SQInteger _string_rstrip(HSQUIRRELVM v)
const SQChar *str,*end;
sq_getstring(v,2,&str);
SQInteger len = sq_getsize(v,2);
+ if(len < 0)
+ len = 0;
__strip_r(str,len,&end);
sq_pushstring(v,str,end - str);
return 1;
Commit: 1054d031387257035ee7bb3021e7d0eb8d0a5162
https://github.com/scummvm/scummvm/commit/1054d031387257035ee7bb3021e7d0eb8d0a5162
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T23:02:12+02:00
Commit Message:
TWP: Fix structurally dead code field in squirrel.
Coverity CID 1540517
Changed paths:
engines/twp/squirrel/sqvm.cpp
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index 86b3f379afc..c60b8a64176 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -1045,7 +1045,7 @@ exception_restore:
}
}
continue;
- case _OP_THROW: Raise_Error(TARGET); SQ_THROW(); continue;
+ case _OP_THROW: Raise_Error(TARGET); SQ_THROW();
case _OP_NEWSLOTA:
_GUARD(NewSlotA(STK(arg1),STK(arg2),STK(arg3),(arg0&NEW_SLOT_ATTRIBUTES_FLAG) ? STK(arg2-1) : SQObjectPtr(),(arg0&NEW_SLOT_STATIC_FLAG)?true:false,false));
continue;
Commit: 5188993440ce71ea346d5e56c31c67bbba246a2a
https://github.com/scummvm/scummvm/commit/5188993440ce71ea346d5e56c31c67bbba246a2a
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-05T23:05:04+02:00
Commit Message:
TWP: Fix invalid type in argument to printf format specifier in squirrel.
Coverity CID 1540564
Changed paths:
engines/twp/squirrel/sqvm.cpp
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index c60b8a64176..6a9aa25a1a4 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -177,7 +177,7 @@ bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr
return CallMetaMethod(closure,mm,2,dest);
}
}
- Raise_Error(_SC("arith op %c on between '%s' and '%s'"),op,GetTypeName(o1),GetTypeName(o2));
+ Raise_Error(_SC("arith op %c on between '%s' and '%s'"),(char)op,GetTypeName(o1),GetTypeName(o2));
return false;
}
More information about the Scummvm-git-logs
mailing list