diff --git a/ext/minitscript/src/minitscript/minitscript/ApplicationMethods.cpp b/ext/minitscript/src/minitscript/minitscript/ApplicationMethods.cpp index 84b7e66..91616e8 100644 --- a/ext/minitscript/src/minitscript/minitscript/ApplicationMethods.cpp +++ b/ext/minitscript/src/minitscript/minitscript/ApplicationMethods.cpp @@ -97,6 +97,9 @@ void ApplicationMethods::registerConstants(MinitScript* minitScript) { const string ApplicationMethods::execute(const string& command, int* exitCode, string* error) { string result; auto _command = command; + #if defined(_MSC_VER) + _command = "chcp 65001 > nul && " + _command + #endif auto _exitCode = EXIT_FAILURE; // error stream string errorFile; diff --git a/ext/minitscript/src/minitscript/minitscript/ArrayMethods.cpp b/ext/minitscript/src/minitscript/minitscript/ArrayMethods.cpp index 4ce89cf..ddf9d2a 100644 --- a/ext/minitscript/src/minitscript/minitscript/ArrayMethods.cpp +++ b/ext/minitscript/src/minitscript/minitscript/ArrayMethods.cpp @@ -742,4 +742,43 @@ void ArrayMethods::registerMethods(MinitScript* minitScript) { }; minitScript->registerMethod(new MethodArrayContains(minitScript)); } + { + // + class MethodArrayConcatenate: public MinitScript::Method { + private: + MinitScript* minitScript { nullptr }; + public: + MethodArrayConcatenate(MinitScript* minitScript): + MinitScript::Method( + { + { .type = MinitScript::TYPE_ARRAY, .name = "array", .optional = false, .reference = false, .nullable = false }, + { .type = MinitScript::TYPE_STRING, .name = "separator", .optional = false, .reference = false, .nullable = false }, + }, + MinitScript::TYPE_STRING + ), + minitScript(minitScript) {} + const string getMethodName() override { + return "Array::concatenate"; + } + void executeMethod(span& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override { + string separator; + if ((arguments.size() == 2) && + arguments[0].getType() == MinitScript::TYPE_ARRAY && + MinitScript::getStringValue(arguments, 1, separator) == true) { + // + string result; + const auto& array = arguments[0]; + for (auto i = 0; i < array.getArraySize(); i++) { + auto arrayValue = array.getArrayEntry(i); + if (result.empty() == false) result+= separator; + result+= arrayValue.getValueAsString(); + } + returnValue.setValue(result); + } else { + MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName()); + } + } + }; + minitScript->registerMethod(new MethodArrayConcatenate(minitScript)); + } } diff --git a/ext/minitscript/src/minitscript/minitscript/MapMethods.cpp b/ext/minitscript/src/minitscript/minitscript/MapMethods.cpp index 769d024..ec065d9 100644 --- a/ext/minitscript/src/minitscript/minitscript/MapMethods.cpp +++ b/ext/minitscript/src/minitscript/minitscript/MapMethods.cpp @@ -407,4 +407,47 @@ void MapMethods::registerMethods(MinitScript* minitScript) { }; minitScript->registerMethod(new MethodMapForEach(minitScript)); } + { + // + class MethodMapConcatenate: public MinitScript::Method { + private: + MinitScript* minitScript { nullptr }; + public: + MethodMapConcatenate(MinitScript* minitScript): + MinitScript::Method( + { + { .type = MinitScript::TYPE_MAP, .name = "map", .optional = false, .reference = false, .nullable = false }, + { .type = MinitScript::TYPE_STRING, .name = "assignmentSeparator", .optional = false, .reference = false, .nullable = false }, + { .type = MinitScript::TYPE_STRING, .name = "separator", .optional = false, .reference = false, .nullable = false }, + }, + MinitScript::TYPE_STRING + ), + minitScript(minitScript) {} + const string getMethodName() override { + return "Map::concatenate"; + } + void executeMethod(span& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override { + string assignmentSeparator; + string separator; + if ((arguments.size() == 3) && + arguments[0].getType() == MinitScript::TYPE_MAP && + MinitScript::getStringValue(arguments, 1, assignmentSeparator) == true && + MinitScript::getStringValue(arguments, 2, separator) == true) { + // + string result; + auto mapPtr = arguments[0].getMapPointer(); + if (mapPtr != nullptr) { + for (const auto& [mapKey, mapValue]: *mapPtr) { + if (result.empty() == false) result+= separator; + result+= mapKey + assignmentSeparator + mapValue->getValueAsString(); + } + } + returnValue.setValue(result); + } else { + MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName()); + } + } + }; + minitScript->registerMethod(new MethodMapConcatenate(minitScript)); + } } diff --git a/ext/minitscript/src/minitscript/minitscript/MathMethods.cpp b/ext/minitscript/src/minitscript/minitscript/MathMethods.cpp index a53142e..f1d3da5 100644 --- a/ext/minitscript/src/minitscript/minitscript/MathMethods.cpp +++ b/ext/minitscript/src/minitscript/minitscript/MathMethods.cpp @@ -1034,13 +1034,51 @@ void MathMethods::add(const span& arguments, MinitScript: if (arguments[0].getType() == MinitScript::TYPE_ARRAY && arguments[1].getType() == MinitScript::TYPE_ARRAY) { returnValue.setType(MinitScript::TYPE_ARRAY); - auto arrayPtr0 = arguments[0].getArrayPointer(); - if (arrayPtr0 != nullptr) { - for (auto arrayEntry: *arrayPtr0) returnValue.pushArrayEntry(MinitScript::Variable::createNonReferenceVariable(arrayEntry)); + { + auto arrayPtr = arguments[0].getArrayPointer(); + if (arrayPtr != nullptr) { + for (auto arrayEntry: *arrayPtr) returnValue.pushArrayEntry(MinitScript::Variable::createNonReferenceVariable(arrayEntry)); + } + } + { + auto arrayPtr = arguments[1].getArrayPointer(); + if (arrayPtr != nullptr) { + for (auto arrayEntry: *arrayPtr) returnValue.pushArrayEntry(MinitScript::Variable::createNonReferenceVariable(arrayEntry)); + } + } + } else + // map + if (arguments[0].getType() == MinitScript::TYPE_MAP && + arguments[1].getType() == MinitScript::TYPE_MAP) { + returnValue.setType(MinitScript::TYPE_MAP); + { + auto mapPtr = arguments[0].getMapPointer(); + if (mapPtr != nullptr) { + for (const auto& [mapKey, mapValue]: *mapPtr) returnValue.setMapEntry(mapKey, MinitScript::Variable::createNonReferenceVariable(mapValue)); + } } - auto arrayPtr1 = arguments[1].getArrayPointer(); - if (arrayPtr1 != nullptr) { - for (auto arrayEntry: *arrayPtr1) returnValue.pushArrayEntry(MinitScript::Variable::createNonReferenceVariable(arrayEntry)); + { + auto mapPtr = arguments[1].getMapPointer(); + if (mapPtr != nullptr) { + for (const auto& [mapKey, mapValue]: *mapPtr) returnValue.setMapEntry(mapKey, MinitScript::Variable::createNonReferenceVariable(mapValue)); + } + } + } else + // set + if (arguments[0].getType() == MinitScript::TYPE_SET && + arguments[1].getType() == MinitScript::TYPE_SET) { + returnValue.setType(MinitScript::TYPE_SET); + { + auto setPtr = arguments[0].getSetPointer(); + if (setPtr != nullptr) { + for (auto setKey: *setPtr) returnValue.insertSetKey(setKey); + } + } + { + auto setPtr = arguments[1].getSetPointer(); + if (setPtr != nullptr) { + for (auto setKey: *setPtr) returnValue.insertSetKey(setKey); + } } } else // float diff --git a/ext/minitscript/src/minitscript/minitscript/SetMethods.cpp b/ext/minitscript/src/minitscript/minitscript/SetMethods.cpp index db8b66e..5ece921 100644 --- a/ext/minitscript/src/minitscript/minitscript/SetMethods.cpp +++ b/ext/minitscript/src/minitscript/minitscript/SetMethods.cpp @@ -307,4 +307,44 @@ void SetMethods::registerMethods(MinitScript* minitScript) { }; minitScript->registerMethod(new MethodSetForEach(minitScript)); } + { + // + class MethodSetConcatenate: public MinitScript::Method { + private: + MinitScript* minitScript { nullptr }; + public: + MethodSetConcatenate(MinitScript* minitScript): + MinitScript::Method( + { + { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = false, .nullable = false }, + { .type = MinitScript::TYPE_STRING, .name = "separator", .optional = false, .reference = false, .nullable = false }, + }, + MinitScript::TYPE_STRING + ), + minitScript(minitScript) {} + const string getMethodName() override { + return "Set::concatenate"; + } + void executeMethod(span& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override { + string separator; + if ((arguments.size() == 2) && + arguments[0].getType() == MinitScript::TYPE_SET && + MinitScript::getStringValue(arguments, 1, separator) == true) { + // + string result; + auto setPtr = arguments[0].getSetPointer(); + if (setPtr != nullptr) { + for (auto setKey: *setPtr) { + if (result.empty() == false) result+= separator; + result+= setKey; + } + } + returnValue.setValue(result); + } else { + MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName()); + } + } + }; + minitScript->registerMethod(new MethodSetConcatenate(minitScript)); + } }