17 using std::shared_ptr;
28 void ApplicationMethods::registerConstants(
MinitScript* minitScript) {
32 #if defined(__FreeBSD__)
33 minitScript->
setConstant(
"$application::OS",
string(
"FreeBSD"));
34 #elif defined(__HAIKU__)
35 minitScript->
setConstant(
"$application::OS",
string(
"Haiku"));
36 #elif defined(__linux__)
37 minitScript->
setConstant(
"$application::OS",
string(
"Linux"));
38 #elif defined(__APPLE__)
39 minitScript->
setConstant(
"$application::OS",
string(
"MacOSX"));
40 #elif defined(__NetBSD__)
41 minitScript->
setConstant(
"$application::OS",
string(
"NetBSD"));
42 #elif defined(__OpenBSD__)
43 minitScript->
setConstant(
"$application::OS",
string(
"OpenBSD"));
44 #elif defined(_MSC_VER)
45 minitScript->
setConstant(
"$application::OS",
string(
"Windows-MSC"));
47 minitScript->
setConstant(
"$application::OS",
string(
"Windows-MINGW"));
49 minitScript->
setConstant(
"$application::OS",
string(
"Unknown"));
51 #if defined(__i386__) || defined(_M_IX86)
52 minitScript->
setConstant(
"$application::CPU",
string(
"X86"));
53 #elif defined(__amd64__) || defined(_M_X64)
54 minitScript->
setConstant(
"$application::CPU",
string(
"X64"));
55 #elif defined(__ia64__) || defined(_M_IA64)
56 minitScript->
setConstant(
"$application::CPU",
string(
"IA64"));
57 #elif defined(__aarch64__) || defined(_M_ARM64)
58 minitScript->
setConstant(
"$application::CPU",
string(
"ARM64"));
59 #elif defined(__arm__) || defined(_M_ARM)
60 minitScript->
setConstant(
"$application::CPU",
string(
"ARM"));
61 #elif defined(__riscv)
62 #if __riscv_xlen == 64
63 minitScript->
setConstant(
"$application::CPU",
string(
"RISCV64"));
65 minitScript->
setConstant(
"$application::CPU",
string(
"RISCV"));
67 #elif defined(__powerpc64__)
68 minitScript->
setConstant(
"$application::CPU",
string(
"PPC64"));
69 #elif defined(__powerpc__)
70 minitScript->
setConstant(
"$application::CPU",
string(
"PPC"));
72 minitScript->
setConstant(
"$application::CPU",
string(
"Unknown"));
76 const string ApplicationMethods::execute(
const string& command,
int* exitCode,
string* error) {
78 auto _command = command;
79 auto _exitCode = EXIT_FAILURE;
82 if (error !=
nullptr) {
83 errorFile = tmpnam(
nullptr);
84 _command+=
" 2>" + errorFile;
89 array<char, 128> buffer;
91 pipe = _popen(_command.c_str(),
"r");
93 pipe = popen(_command.c_str(),
"r");
95 if (pipe ==
nullptr)
throw std::runtime_error(
"popen() failed!");
96 while (feof(pipe) ==
false) {
97 if (fgets(buffer.data(), buffer.size(), pipe) !=
nullptr) result += buffer.data();
100 _Console::printLine(
"ApplicationMethods::execute(): An error occurred: " +
string(exception.what()));
103 if (pipe !=
nullptr) {
104 #if defined(_MSC_VER)
105 _exitCode = _pclose(pipe);
107 _exitCode = pclose(pipe);
111 if (exitCode !=
nullptr) *exitCode = _exitCode;
113 if (error !=
nullptr) {
115 *error = FileSystem::getContentAsString(
116 FileSystem::getPathName(errorFile),
117 FileSystem::getFileName(errorFile)
119 FileSystem::removeFile(
120 FileSystem::getPathName(errorFile),
121 FileSystem::getFileName(errorFile)
124 _Console::printLine(
"ApplicationMethods::execute(): An error occurred: " +
string(exception.what()));
131 void ApplicationMethods::registerMethods(
MinitScript* minitScript) {
139 MethodApplicationExecute(
MinitScript* minitScript):
142 { .type = MinitScript::TYPE_STRING, .name =
"command", .optional =
false, .reference =
false, .nullable =
false },
143 { .type = MinitScript::TYPE_INTEGER, .name =
"exitCode", .optional =
true, .reference =
true, .nullable =
true },
144 { .type = MinitScript::TYPE_STRING, .name =
"error", .optional =
true, .reference =
true, .nullable =
true },
146 MinitScript::TYPE_STRING
148 minitScript(minitScript) {}
149 const string getMethodName()
override {
150 return "application.execute";
154 if ((arguments.size() == 1 || arguments.size() == 2 || arguments.size() == 3) &&
155 MinitScript::getStringValue(arguments, 0, command) ==
true) {
158 int* exitCodePtr = arguments.size() >= 2?&exitCode:
nullptr;
159 string* errorPtr = arguments.size() >= 3?&error:
nullptr;
160 returnValue.
setValue(ApplicationMethods::execute(command, exitCodePtr, errorPtr));
161 if (exitCodePtr !=
nullptr) arguments[1].setValue(
static_cast<int64_t
>(exitCode));
162 if (errorPtr !=
nullptr) arguments[2].setValue(error);
168 minitScript->
registerMethod(
new MethodApplicationExecute(minitScript));
179 MethodApplicationGetArguments(
MinitScript* minitScript):
181 minitScript(minitScript) {}
182 const string getMethodName()
override {
183 return "application.getArguments";
186 if (arguments.size() == 0) {
187 returnValue.
setType(MinitScript::TYPE_ARRAY);
196 minitScript->
registerMethod(
new MethodApplicationGetArguments(minitScript));
207 { .type = MinitScript::TYPE_INTEGER, .name =
"exitCode", .optional =
true, .reference =
false, .nullable =
false },
210 minitScript(minitScript) {}
211 const string getMethodName()
override {
212 return "application.exit";
215 int64_t exitCode = 0ll;
216 if ((arguments.size() == 0 || arguments.size() == 1) &&
217 MinitScript::getIntegerValue(arguments, 0, exitCode,
true) ==
true) {
226 minitScript->
registerMethod(
new MethodApplicationExit(minitScript));
#define MINITSCRIPT_METHODUSAGE_COMPLAIN(methodName)
MinitScript script application methods.
const vector< string > & getArgumentValues()
void setExitCode(int exitCode)
Set exit code.
void pushArrayEntry(const Variable &value)
Push entry to array.
void setType(VariableType newType)
Set type.
void setValue(const Variable &variable)
Set value from given variable into variable.
void registerMethod(Method *method)
Register method.
void stopScriptExecution()
Stop script execution.
static void setConstant(Variable &variable)
Set variable recursively to be a constant.
void stopRunning()
Set running flag to false.
static void printLine()
Print newline to console.
std::exception Exception
Exception base class.