Allow strings in the ternary expression function

This commit is contained in:
Duncan Ogilvie 2023-11-13 01:30:36 +01:00
parent 923b894df2
commit 44c3d39165
3 changed files with 21 additions and 19 deletions

View File

@ -71,7 +71,7 @@ void ExpressionFunctions::Init()
RegisterEasy("mod.offset,mod.fileoffset", valvatofileoffset); RegisterEasy("mod.offset,mod.fileoffset", valvatofileoffset);
RegisterEasy("mod.headerva", modheaderva); RegisterEasy("mod.headerva", modheaderva);
RegisterEasy("mod.isexport", modisexport); RegisterEasy("mod.isexport", modisexport);
ExpressionFunctions::Register("mod.fromname", ValueTypeNumber, { ValueTypeString }, Exprfunc::modbasefromname, nullptr); ExpressionFunctions::Register("mod.fromname", ValueTypeNumber, { ValueTypeString }, Exprfunc::modbasefromname);
//Process information //Process information
RegisterEasy("peb,PEB", peb); RegisterEasy("peb,PEB", peb);
@ -81,7 +81,7 @@ void ExpressionFunctions::Init()
//General purpose //General purpose
RegisterEasy("bswap", bswap); RegisterEasy("bswap", bswap);
RegisterEasy("ternary,tern", ternary); ExpressionFunctions::Register("ternary,tern", ValueTypeAny, { ValueTypeNumber, ValueTypeAny, ValueTypeAny }, ternary);
RegisterEasy("GetTickCount,gettickcount", gettickcount); RegisterEasy("GetTickCount,gettickcount", gettickcount);
RegisterEasy("rdtsc", rdtsc); RegisterEasy("rdtsc", rdtsc);
@ -110,9 +110,9 @@ void ExpressionFunctions::Init()
RegisterEasy("dis.next", disnext); RegisterEasy("dis.next", disnext);
RegisterEasy("dis.prev", disprev); RegisterEasy("dis.prev", disprev);
RegisterEasy("dis.iscallsystem", disiscallsystem); RegisterEasy("dis.iscallsystem", disiscallsystem);
ExpressionFunctions::Register("dis.mnemonic", ValueTypeString, { ValueTypeNumber }, Exprfunc::dismnemonic, nullptr); ExpressionFunctions::Register("dis.mnemonic", ValueTypeString, { ValueTypeNumber }, dismnemonic);
ExpressionFunctions::Register("dis.text", ValueTypeString, { ValueTypeNumber }, Exprfunc::distext, nullptr); ExpressionFunctions::Register("dis.text", ValueTypeString, { ValueTypeNumber }, distext);
ExpressionFunctions::Register("dis.match", ValueTypeNumber, { ValueTypeNumber, ValueTypeString }, Exprfunc::dismatch, nullptr); ExpressionFunctions::Register("dis.match", ValueTypeNumber, { ValueTypeNumber, ValueTypeString }, dismatch);
//Trace record //Trace record
RegisterEasy("tr.enabled", trenabled); RegisterEasy("tr.enabled", trenabled);
@ -158,17 +158,17 @@ void ExpressionFunctions::Init()
RegisterEasy("isdebuggeefocused", isdebuggeefocused); RegisterEasy("isdebuggeefocused", isdebuggeefocused);
// Strings // Strings
ExpressionFunctions::Register("ansi", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::ansi, nullptr); ExpressionFunctions::Register("ansi", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::ansi);
ExpressionFunctions::Register("ansi.strict", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::ansi_strict, nullptr); ExpressionFunctions::Register("ansi.strict", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::ansi_strict);
ExpressionFunctions::Register("utf8", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf8, nullptr); ExpressionFunctions::Register("utf8", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf8);
ExpressionFunctions::Register("utf8.strict", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf8_strict, nullptr); ExpressionFunctions::Register("utf8.strict", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf8_strict);
ExpressionFunctions::Register("utf16", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf16, nullptr); ExpressionFunctions::Register("utf16", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf16);
ExpressionFunctions::Register("utf16.strict", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf16_strict, nullptr); ExpressionFunctions::Register("utf16.strict", ValueTypeString, { ValueTypeNumber, ValueTypeOptionalNumber }, Exprfunc::utf16_strict);
ExpressionFunctions::Register("strstr", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::strstr, nullptr); ExpressionFunctions::Register("strstr", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::strstr);
ExpressionFunctions::Register("stristr", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::stristr, nullptr); ExpressionFunctions::Register("stristr", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::stristr);
ExpressionFunctions::Register("streq", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::streq, nullptr); ExpressionFunctions::Register("streq", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::streq);
ExpressionFunctions::Register("strieq", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::strieq, nullptr); ExpressionFunctions::Register("strieq", ValueTypeNumber, { ValueTypeString, ValueTypeString }, Exprfunc::strieq);
ExpressionFunctions::Register("strlen", ValueTypeNumber, { ValueTypeString }, Exprfunc::strlen, nullptr); ExpressionFunctions::Register("strlen", ValueTypeNumber, { ValueTypeString }, Exprfunc::strlen);
} }
bool ExpressionFunctions::Register(const String & name, const ValueType & returnType, const std::vector<ValueType> & argTypes, const CBEXPRESSIONFUNCTION & cbFunction, void* userdata) bool ExpressionFunctions::Register(const String & name, const ValueType & returnType, const std::vector<ValueType> & argTypes, const CBEXPRESSIONFUNCTION & cbFunction, void* userdata)

View File

@ -189,9 +189,11 @@ namespace Exprfunc
return result; return result;
} }
duint ternary(duint condition, duint value1, duint value2) bool ternary(ExpressionValue* result, int argc, const ExpressionValue* argv, void* userdata)
{ {
return condition ? value1 : value2; *result = argv[0].number ? argv[1] : argv[2];
result->string.isOwner = false;
return true;
} }
duint memvalid(duint addr) duint memvalid(duint addr)

View File

@ -26,7 +26,7 @@ namespace Exprfunc
duint kusd(); duint kusd();
duint bswap(duint value); duint bswap(duint value);
duint ternary(duint condition, duint value1, duint value2); bool ternary(ExpressionValue* result, int argc, const ExpressionValue* argv, void* userdata);
duint memvalid(duint addr); duint memvalid(duint addr);
duint membase(duint addr); duint membase(duint addr);