Replaced DATATYPE_* constants with enum class

This commit is contained in:
phobos2077
2017-03-06 00:50:15 +07:00
parent 31520d6f65
commit 8ed93e8cf7
9 changed files with 112 additions and 113 deletions
+42 -42
View File
@@ -30,14 +30,14 @@ DWORD stackArrayId;
static char get_all_arrays_special_key[] = "...all_arrays...";
sArrayElement::sArrayElement() : len(0), intVal(0), type(DATATYPE_NONE)
sArrayElement::sArrayElement() : len(0), intVal(0), type(DataType::NONE)
{
}
sArrayElement::sArrayElement( DWORD _val, DWORD _dataType ) : len(0), type(_dataType), intVal(_val)
sArrayElement::sArrayElement( DWORD _val, DataType _dataType ) : len(0), type(_dataType), intVal(_val)
{
if (DATATYPE_STR == _dataType)
if (DataType::STR == _dataType)
len = strlen((char*)_val);
}
@@ -48,20 +48,20 @@ sArrayElement::sArrayElement(const long& other)
void sArrayElement::clear()
{
if (type == DATATYPE_STR && strVal)
if (type == DataType::STR && strVal)
delete[] strVal;
}
void sArrayElement::setByType( DWORD val, DWORD dataType )
void sArrayElement::setByType( DWORD val, DataType dataType )
{
switch(dataType) {
case DATATYPE_STR:
case DataType::STR:
set((char*)val);
break;
case DATATYPE_INT:
case DataType::INT:
set(*(long*)&val);
break;
case DATATYPE_FLOAT:
case DataType::FLOAT:
set(*(float*)&val);
break;
}
@@ -70,21 +70,21 @@ void sArrayElement::setByType( DWORD val, DWORD dataType )
void sArrayElement::set( long val )
{
clear();
type = DATATYPE_INT;
type = DataType::INT;
intVal = val;
}
void sArrayElement::set( float val )
{
clear();
type = DATATYPE_FLOAT;
type = DataType::FLOAT;
floatVal = val;
}
void sArrayElement::set( const char* val, int _len /*= -1*/ )
{
clear();
type = DATATYPE_STR;
type = DataType::STR;
if (_len == -1)
_len = strlen(val);
if (_len > ARRAY_MAX_STRING-1) // memory safety
@@ -98,13 +98,13 @@ void sArrayElement::set( const char* val, int _len /*= -1*/ )
void sArrayElement::unset()
{
clear();
type = DATATYPE_NONE;
type = DataType::NONE;
len = intVal = 0;
}
DWORD sArrayElement::getHashStatic(DWORD value, DWORD type) {
DWORD sArrayElement::getHashStatic(DWORD value, DataType type) {
switch (type) {
case DATATYPE_STR:
case DataType::STR:
const char* str;
str = (const char*)value;
int i;
@@ -113,8 +113,8 @@ DWORD sArrayElement::getHashStatic(DWORD value, DWORD type) {
res = ((res << 5) + res) + str[i];
}
return res;
case DATATYPE_INT:
case DATATYPE_FLOAT:
case DataType::INT:
case DataType::FLOAT:
return value;
default:
return 0;
@@ -127,11 +127,11 @@ bool sArrayElement::operator<( const sArrayElement &el ) const
return true;
} else if (type == el.type) {
switch (type) {
case DATATYPE_STR:
case DataType::STR:
return strcmp(strVal, el.strVal) < 0;
case DATATYPE_FLOAT:
case DataType::FLOAT:
return floatVal < el.floatVal;
case DATATYPE_INT:
case DataType::INT:
default:
return intVal < el.intVal;
}
@@ -145,10 +145,10 @@ bool sArrayElement_EqualFunc::operator()( const sArrayElement &elA, const sArray
if (elA.type != elB.type)
return false;
switch (elA.type) {
case DATATYPE_STR:
case DataType::STR:
return strcmp(elA.strVal, elB.strVal) == 0;
case DATATYPE_INT:
case DATATYPE_FLOAT:
case DataType::INT:
case DataType::FLOAT:
return elA.intVal == elB.intVal;
default:
return true;
@@ -169,7 +169,7 @@ void SaveArrayElement(sArrayElement* el, HANDLE h)
{
DWORD unused;
WriteFile(h, &el->type, 4, &unused, 0);
if (el->type == DATATYPE_STR) {
if (el->type == DataType::STR) {
WriteFile(h, &el->len, 4, &unused, 0);
WriteFile(h, el->strVal, el->len, &unused, 0);
} else {
@@ -181,7 +181,7 @@ void LoadArrayElement(sArrayElement* el, HANDLE h)
{
DWORD unused;
ReadFile(h, &el->type, 4, &unused, 0);
if (el->type == DATATYPE_STR) {
if (el->type == DataType::STR) {
ReadFile(h, &el->len, 4, &unused, 0);
if (el->len > 0) {
el->strVal = new char[el->len];
@@ -211,20 +211,20 @@ void LoadArraysOld(HANDLE h) {
varN.val.resize(var.len);
for (j=0; j<var.len; j++) {
switch (var.types[j]) {
case DATATYPE_INT:
case DataType::INT:
varN.val[j].set(*(long*)(&var.data[var.datalen*j]));
break;
case DATATYPE_FLOAT:
case DataType::FLOAT:
varN.val[j].set(*(float*)(&var.data[var.datalen*j]));
break;
case DATATYPE_STR:
case DataType::STR:
varN.val[j].set(&var.data[var.datalen*j], var.datalen - 1);
break;
}
}
delete[] var.types;
delete[] var.data;
varN.key = sArrayElement(id, DATATYPE_INT);
varN.key = sArrayElement(id, DataType::INT);
arrays.insert(array_pair(id, varN));
savedArrays[varN.key] = id;
}
@@ -240,9 +240,9 @@ void LoadArrays(HANDLE h) {
nextarrayid = 1;
for (DWORD i=0; i<count; i++) {
LoadArrayElement(&arrayVar.key, h);
if (arrayVar.key.type > 4 || arrayVar.key.intVal == 0) { // partial compatibility with 3.4
arrayVar.key.intVal = arrayVar.key.type;
arrayVar.key.type = DATATYPE_INT;
if (static_cast<long>(arrayVar.key.type) > 4 || arrayVar.key.intVal == 0) { // partial compatibility with 3.4
arrayVar.key.intVal = static_cast<long>(arrayVar.key.type);
arrayVar.key.type = DataType::INT;
}
ReadFile(h, &arrayVar.flags, 4, &unused, 0);
ReadFile(h, &elCount, 4, &unused, 0); // actual number of elements: keys+values
@@ -335,7 +335,7 @@ DWORD _stdcall CreateArray(int len, DWORD nothing) {
while(arrays.find(nextarrayid)!=arrays.end()) nextarrayid++;
if (nextarrayid == 0) nextarrayid++;
if (arraysBehavior == 0) {
var.key = sArrayElement(nextarrayid, DATATYPE_INT);
var.key = sArrayElement(nextarrayid, DataType::INT);
savedArrays[var.key] = nextarrayid;
}
stackArrayId = nextarrayid;
@@ -369,13 +369,13 @@ ScriptValue _stdcall GetArrayKey(DWORD id, int index) {
index *= 2;
// for associative array - return key at the specified index
switch(arrays[id].val[index].type) {
case DATATYPE_INT:
case DataType::INT:
return ScriptValue(arrays[id].val[index].intVal);
case DATATYPE_FLOAT:
case DataType::FLOAT:
return ScriptValue(arrays[id].val[index].floatVal);
case DATATYPE_STR:
case DataType::STR:
return ScriptValue(arrays[id].val[index].strVal);
case DATATYPE_NONE:
case DataType::NONE:
default:
return ScriptValue(0);
}
@@ -405,12 +405,12 @@ ScriptValue _stdcall GetArray(DWORD id, const ScriptValue& key) {
}
}
switch (arr.val[el].type) {
case DATATYPE_NONE: return ScriptValue();
case DATATYPE_INT:
case DataType::NONE: return ScriptValue();
case DataType::INT:
return ScriptValue(arr.val[el].intVal);
case DATATYPE_FLOAT:
case DataType::FLOAT:
return ScriptValue(arr.val[el].floatVal);
case DATATYPE_STR:
case DataType::STR:
return ScriptValue(arr.val[el].strVal);
}
return ScriptValue(0);
@@ -526,7 +526,7 @@ ScriptValue _stdcall ScanArray(DWORD id, const ScriptValue& val) {
(val.isString() && strcmp(el.strVal, val.asString()) == 0)) {
if (arrays[id].isAssoc()) { // return key instead of index for associative arrays
return ScriptValue(
static_cast<SfallDataType>(arrays[id].val[i].type),
static_cast<DataType>(arrays[id].val[i].type),
static_cast<DWORD>(arrays[id].val[i].intVal)
);
} else {
@@ -541,7 +541,7 @@ ScriptValue _stdcall ScanArray(DWORD id, const ScriptValue& val) {
DWORD _stdcall LoadArray(const ScriptValue& key) {
if (!key.isInt() || key.asInt() != 0) { // returns arrayId by it's key (ignoring int(0) because it is used to "unsave" array)
sArrayElement keyEl = sArrayElement(key.rawValue(), key.type());
if (keyEl.type == DATATYPE_STR && strcmp(keyEl.strVal, get_all_arrays_special_key) == 0) { // this is a special case to get temp array containing all saved arrays
if (keyEl.type == DataType::STR && strcmp(keyEl.strVal, get_all_arrays_special_key) == 0) { // this is a special case to get temp array containing all saved arrays
DWORD tmpArrId = TempArray(savedArrays.size(), 0);
if (tmpArrId > 0) {
std::vector<sArrayElement>::iterator elIt;
+6 -6
View File
@@ -5,6 +5,8 @@
#include <set>
#include <Windows.h>
#include "ScriptValue.h"
namespace sfall
{
namespace script
@@ -22,13 +24,11 @@ namespace script
extern char get_all_arrays_special_key[];
class ScriptValue;
// TODO: rewrite (or replace with ScriptValue)
class sArrayElement
{
public:
DWORD type; // DATATYPE_*
DataType type;
DWORD len; // for strings
union {
long intVal;
@@ -37,12 +37,12 @@ public:
};
sArrayElement();
// this constructor does not copy strings (for performance), use set() for actual array elements
sArrayElement(DWORD _val, DWORD _dataType);
sArrayElement(DWORD _val, DataType _dataType);
sArrayElement(const long&);
// free string resource from memory, has to be called manually when deleting element
void clear();
// set* methods will actually COPY strings, use this when acquiring data from the scripting engine
void setByType(DWORD val, DWORD dataType);
void setByType(DWORD val, DataType dataType);
void sArrayElement::set( const sArrayElement &el )
{
setByType(el.intVal, el.type);
@@ -55,7 +55,7 @@ public:
{
return getHashStatic(*(DWORD*)&intVal, type);
}
DWORD static getHashStatic(DWORD value, DWORD type);
DWORD static getHashStatic(DWORD value, DataType type);
bool operator < (const sArrayElement &el) const;
};
+4 -4
View File
@@ -32,7 +32,7 @@ namespace script
void sf_create_array(OpcodeContext& ctx) {
auto arrayId = CreateArray(ctx.arg(0).asInt(), ctx.arg(1).asInt());
ctx.setReturn(
ScriptValue(DATATYPE_INT, arrayId)
ScriptValue(DataType::INT, arrayId)
);
}
@@ -83,7 +83,7 @@ void sf_resize_array(OpcodeContext& ctx) {
void sf_temp_array(OpcodeContext& ctx) {
auto arrayId = TempArray(ctx.arg(0).asInt(), ctx.arg(1).asInt());
ctx.setReturn(
ScriptValue(DATATYPE_INT, arrayId)
ScriptValue(DataType::INT, arrayId)
);
}
@@ -209,14 +209,14 @@ static void _stdcall ListEnd(sList* list) {
void sf_list_begin(OpcodeContext& ctx) {
auto list = ListBegin(ctx.arg(0).asInt());
ctx.setReturn(
ScriptValue(DATATYPE_INT, reinterpret_cast<DWORD>(list))
ScriptValue(DataType::INT, reinterpret_cast<DWORD>(list))
);
}
void sf_list_as_array(OpcodeContext& ctx) {
auto arrayId = ListAsArray(ctx.arg(0).asInt());
ctx.setReturn(
ScriptValue(DATATYPE_INT, arrayId)
ScriptValue(DataType::INT, arrayId)
);
}
@@ -71,13 +71,13 @@ void sf_test(OpcodeContext& ctx) {
const ScriptValue &arg = ctx.arg(i);
sstream << ", ";
switch (arg.type()) {
case DATATYPE_INT:
case DataType::INT:
sstream << arg.asInt();
break;
case DATATYPE_FLOAT:
case DataType::FLOAT:
sstream << arg.asFloat();
break;
case DATATYPE_STR:
case DataType::STR:
sstream << '"' << arg.asString() << '"';
break;
default:
@@ -99,7 +99,7 @@ void sf_get_metarule_table(OpcodeContext& ctx) {
arrays[arr].val[i].set(it->first.c_str());
i++;
}
ctx.setReturn(arr, DATATYPE_INT);
ctx.setReturn(arr, DataType::INT);
}
/*
+6 -6
View File
@@ -258,7 +258,7 @@ void sf_make_straight_path(OpcodeContext& ctx) {
resultObj, arg6;
arg6 = (type == BLOCKING_TYPE_SHOOT) ? 32 : 0;
make_straight_path_func_wrapper(objFrom, *(DWORD*)(objFrom + 4), 0, tileTo, &resultObj, arg6, getBlockingFunc(type));
ctx.setReturn(resultObj, DATATYPE_INT);
ctx.setReturn(resultObj, DataType::INT);
}
void sf_make_path(OpcodeContext& ctx) {
@@ -270,7 +270,7 @@ void sf_make_path(OpcodeContext& ctx) {
arr;
long pathLength, a5 = 1;
if (!objFrom) {
ctx.setReturn(0, DATATYPE_INT);
ctx.setReturn(0, DataType::INT);
return;
}
tileFrom = *(DWORD*)(objFrom + 4);
@@ -290,7 +290,7 @@ void sf_make_path(OpcodeContext& ctx) {
for (int i = 0; i < pathLength; i++) {
arrays[arr].val[i].set((long)pathData[i]);
}
ctx.setReturn(arr, DATATYPE_INT);
ctx.setReturn(arr, DataType::INT);
}
void sf_obj_blocking_at(OpcodeContext& ctx) {
@@ -303,7 +303,7 @@ void sf_obj_blocking_at(OpcodeContext& ctx) {
// this check was added because the engine always does exactly this when using shoot blocking checks
resultObj = 0;
}
ctx.setReturn(resultObj, DATATYPE_INT);
ctx.setReturn(resultObj, DataType::INT);
}
void sf_tile_get_objects(OpcodeContext& ctx) {
@@ -324,7 +324,7 @@ void sf_tile_get_objects(OpcodeContext& ctx) {
mov obj, eax;
}
}
ctx.setReturn(arrayId, DATATYPE_INT);
ctx.setReturn(arrayId, DataType::INT);
}
void sf_get_party_members(OpcodeContext& ctx) {
@@ -349,7 +349,7 @@ void sf_get_party_members(OpcodeContext& ctx) {
}
arrays[arrayId].push_back((long)obj);
}
ctx.setReturn(arrayId, DATATYPE_INT);
ctx.setReturn(arrayId, DataType::INT);
}
void sf_art_exists(OpcodeContext& ctx) {
+20 -20
View File
@@ -72,7 +72,7 @@ DWORD OpcodeContext::opcode() const {
return _opcode;
}
void OpcodeContext::setReturn(unsigned long value, SfallDataType type) {
void OpcodeContext::setReturn(unsigned long value, DataType type) {
_ret = ScriptValue(type, value);
}
@@ -99,13 +99,13 @@ bool OpcodeContext::validateArguments(const OpcodeArgumentType argTypes[], const
auto actualType = arg(i).type();
// display invalid type error if type is set and differs from actual type
// exception is when type set to
if ((argType == ARG_INT || argType == ARG_OBJECT) && !(actualType == DATATYPE_INT)) {
if ((argType == ARG_INT || argType == ARG_OBJECT) && !(actualType == DataType::INT)) {
printOpcodeError("%s() - argument #%d is not an integer.", opcodeName, i);
return false;
} else if (argType == ARG_NUMBER && !(actualType == DATATYPE_INT || actualType == DATATYPE_FLOAT)) {
} else if (argType == ARG_NUMBER && !(actualType == DataType::INT || actualType == DataType::FLOAT)) {
printOpcodeError("%s() - argument #%d is not a number.", opcodeName, i);
return false;
} else if (argType == ARG_STRING && !(actualType == DATATYPE_STR)) {
} else if (argType == ARG_STRING && !(actualType == DataType::STR)) {
printOpcodeError("%s() - argument #%d is not a string.", opcodeName, i);
return false;
} else if (argType == ARG_OBJECT && arg(i).rawValue() == 0) {
@@ -146,40 +146,40 @@ void __stdcall OpcodeContext::handleOpcodeStatic(TProgram* program, DWORD opcode
const char* OpcodeContext::getSfallTypeName(DWORD dataType) {
switch (dataType) {
case DATATYPE_NONE:
case DataType::NONE:
return "(none)";
case DATATYPE_STR:
case DataType::STR:
return "string";
case DATATYPE_FLOAT:
case DataType::FLOAT:
return "float";
case DATATYPE_INT:
case DataType::INT:
return "integer";
default:
return "(unknown)";
}
}
DWORD OpcodeContext::getSfallTypeByScriptType(DWORD varType) {
DataType OpcodeContext::getSfallTypeByScriptType(DWORD varType) {
varType &= 0xffff;
switch (varType) {
case VAR_TYPE_STR:
case VAR_TYPE_STR2:
return DATATYPE_STR;
return DataType::STR;
case VAR_TYPE_FLOAT:
return DATATYPE_FLOAT;
return DataType::FLOAT;
case VAR_TYPE_INT:
default:
return DATATYPE_INT;
return DataType::INT;
}
}
DWORD OpcodeContext::getScriptTypeBySfallType(DWORD dataType) {
DWORD OpcodeContext::getScriptTypeBySfallType(DataType dataType) {
switch (dataType) {
case DATATYPE_STR:
case DataType::STR:
return VAR_TYPE_STR;
case DATATYPE_FLOAT:
case DataType::FLOAT:
return VAR_TYPE_FLOAT;
case DATATYPE_INT:
case DataType::INT:
default:
return VAR_TYPE_INT;
}
@@ -191,10 +191,10 @@ void OpcodeContext::_popArguments() {
// get argument from stack
DWORD rawValueType = Wrapper::interpretPopShort(_program);
DWORD rawValue = Wrapper::interpretPopLong(_program);
SfallDataType type = static_cast<SfallDataType>(getSfallTypeByScriptType(rawValueType));
DataType type = static_cast<DataType>(getSfallTypeByScriptType(rawValueType));
// retrieve string argument
if (type == DATATYPE_STR) {
if (type == DataType::STR) {
_args.at(i) = Wrapper::interpretGetString(_program, rawValueType, rawValue);
} else {
_args.at(i) = ScriptValue(type, rawValue);
@@ -204,12 +204,12 @@ void OpcodeContext::_popArguments() {
void OpcodeContext::_pushReturnValue() {
if (_hasReturn) {
if (_ret.type() == DATATYPE_NONE) {
if (_ret.type() == DataType::NONE) {
// if no value was set in handler, force return 0 to avoid stack error
_ret = ScriptValue(0);
}
DWORD rawResult = _ret.rawValue();
if (_ret.type() == DATATYPE_STR) {
if (_ret.type() == DataType::STR) {
rawResult = Wrapper::interpretAddString(_program, _ret.asString());
}
Wrapper::interpretPushLong(_program, rawResult);
+3 -3
View File
@@ -100,7 +100,7 @@ public:
DWORD opcode() const;
// set return value for current opcode
void setReturn(unsigned long value, SfallDataType type);
void setReturn(unsigned long value, DataType type);
// set return value for current opcode
void setReturn(const ScriptValue& val);
@@ -127,9 +127,9 @@ public:
static const char* getSfallTypeName(DWORD dataType);
static DWORD getSfallTypeByScriptType(DWORD varType);
static DataType getSfallTypeByScriptType(DWORD varType);
static DWORD getScriptTypeBySfallType(DWORD dataType);
static DWORD getScriptTypeBySfallType(DataType dataType);
private:
// pops arguments from data stack
+19 -19
View File
@@ -23,7 +23,7 @@ namespace sfall
namespace script
{
ScriptValue::ScriptValue( SfallDataType type, unsigned long value )
ScriptValue::ScriptValue( DataType type, unsigned long value )
{
_val.dw = value;
_type = type;
@@ -31,45 +31,45 @@ ScriptValue::ScriptValue( SfallDataType type, unsigned long value )
ScriptValue::ScriptValue() {
_val.dw = 0;
_type = DATATYPE_NONE;
_type = DataType::NONE;
}
ScriptValue::ScriptValue(const char* strval) {
_val.str = strval;
_type = DATATYPE_STR;
_type = DataType::STR;
}
ScriptValue::ScriptValue(int val) {
_val.i = val;
_type = DATATYPE_INT;
_type = DataType::INT;
}
ScriptValue::ScriptValue(float val) {
_val.f = val;
_type = DATATYPE_FLOAT;
_type = DataType::FLOAT;
}
ScriptValue::ScriptValue(bool val) {
_val.i = val ? 1 : 0;
_type = DATATYPE_INT;
_type = DataType::INT;
}
ScriptValue::ScriptValue(TGameObj* obj) {
_val.gObj = obj;
_type = DATATYPE_INT;
_type = DataType::INT;
}
bool ScriptValue::isInt() const
{
return _type == DATATYPE_INT;
return _type == DataType::INT;
}
bool ScriptValue::isFloat() const {
return _type == DATATYPE_FLOAT;
return _type == DataType::FLOAT;
}
bool ScriptValue::isString() const {
return _type == DATATYPE_STR;
return _type == DataType::STR;
}
unsigned long ScriptValue::rawValue() const {
@@ -78,9 +78,9 @@ unsigned long ScriptValue::rawValue() const {
int ScriptValue::asInt() const {
switch (_type) {
case DATATYPE_FLOAT:
case DataType::FLOAT:
return static_cast<int>(_val.f);
case DATATYPE_INT:
case DataType::INT:
return _val.i;
default:
return 0;
@@ -89,9 +89,9 @@ int ScriptValue::asInt() const {
bool ScriptValue::asBool() const {
switch (_type) {
case DATATYPE_FLOAT:
case DataType::FLOAT:
return static_cast<int>(_val.f) != 0;
case DATATYPE_INT:
case DataType::INT:
return _val.i != 0;
default:
return true;
@@ -100,9 +100,9 @@ bool ScriptValue::asBool() const {
float ScriptValue::asFloat() const {
switch (_type) {
case DATATYPE_FLOAT:
case DataType::FLOAT:
return _val.f;
case DATATYPE_INT:
case DataType::INT:
return static_cast<float>(_val.i);
default:
return 0.0;
@@ -110,18 +110,18 @@ float ScriptValue::asFloat() const {
}
const char* ScriptValue::asString() const {
return (_type == DATATYPE_STR)
return (_type == DataType::STR)
? _val.str
: "";
}
TGameObj* ScriptValue::asObject() const {
return (_type == DATATYPE_INT)
return (_type == DataType::INT)
? _val.gObj
: nullptr;
}
SfallDataType ScriptValue::type() const {
DataType ScriptValue::type() const {
return _type;
}
+8 -9
View File
@@ -25,12 +25,11 @@ namespace sfall
namespace script
{
// TODO: replace with enum class
enum SfallDataType {
DATATYPE_NONE = 0,
DATATYPE_INT,
DATATYPE_FLOAT,
DATATYPE_STR
enum class DataType : unsigned long {
NONE = 0,
INT,
FLOAT,
STR
};
/*
@@ -38,7 +37,7 @@ enum SfallDataType {
*/
class ScriptValue {
public:
ScriptValue(SfallDataType type, unsigned long value);
ScriptValue(DataType type, unsigned long value);
ScriptValue();
@@ -75,7 +74,7 @@ public:
// returns value as object pointer or nullptr if value is not integer
TGameObj* asObject() const;
SfallDataType type() const;
DataType type() const;
private:
union Value {
@@ -86,7 +85,7 @@ private:
TGameObj* gObj;
} _val;
SfallDataType _type; // TODO: replace with enum class
DataType _type; // TODO: replace with enum class
};
}