diff --git a/.vscode/settings.json b/.vscode/settings.json index 5383c6a..6783045 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "files.associations": { + "*.rml": "html", "stdexcept": "cpp", "chrono": "cpp", "forward_list": "cpp", @@ -67,6 +68,11 @@ "iostream": "cpp", "map": "cpp", "ostream": "cpp", - "xtree": "cpp" + "xtree": "cpp", + "condition_variable": "cpp", + "coroutine": "cpp", + "resumable": "cpp", + "future": "cpp", + "mutex": "cpp" } } \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/platform/android/.gitkeep b/Src/IACore/imp/inl/IACore/platform/android/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Src/IACore/imp/inl/IACore/platform/environment.inl b/Src/IACore/imp/inl/IACore/platform/environment.inl new file mode 100644 index 0000000..7ff6450 --- /dev/null +++ b/Src/IACore/imp/inl/IACore/platform/environment.inl @@ -0,0 +1,25 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include "platform.inl" + +#if (defined(IA_PLATFORM_WIN64) && (IA_PLATFORM_WIN64 > 0)) + #include "win/environment.inl" +#else + #error "IACore Unsupported Platform" +#endif \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/platform/interface/environment.interface.inl b/Src/IACore/imp/inl/IACore/platform/interface/environment.interface.inl new file mode 100644 index 0000000..9002742 --- /dev/null +++ b/Src/IACore/imp/inl/IACore/platform/interface/environment.interface.inl @@ -0,0 +1,29 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia +{ + class Environment + { + public: + INLINE STATIC String GetVar(IN CONST String& name); + INLINE STATIC BOOL SetVar(IN CONST String& name, IN CONST String& value); + }; +} \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/platform/interface/platform.interface.inl b/Src/IACore/imp/inl/IACore/platform/interface/platform.interface.inl index f335d11..1d8cea2 100644 --- a/Src/IACore/imp/inl/IACore/platform/interface/platform.interface.inl +++ b/Src/IACore/imp/inl/IACore/platform/interface/platform.interface.inl @@ -16,7 +16,7 @@ #pragma once -#include +#include namespace ia { diff --git a/Src/IACore/imp/inl/IACore/platform/interface/process.interface.inl b/Src/IACore/imp/inl/IACore/platform/interface/process.interface.inl new file mode 100644 index 0000000..82f551f --- /dev/null +++ b/Src/IACore/imp/inl/IACore/platform/interface/process.interface.inl @@ -0,0 +1,34 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia +{ + class SubProcess + { + public: + INLINE SubProcess(IN CONST String &path); + INLINE ~SubProcess(); + + INLINE INT32 Launch(IN CONST String &args, IN Function onOutputLineCallback); + + private: + CONST String m_path; + }; +} // namespace ia \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/platform/ios/.gitkeep b/Src/IACore/imp/inl/IACore/platform/ios/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Src/IACore/imp/inl/IACore/platform/linux/.gitkeep b/Src/IACore/imp/inl/IACore/platform/linux/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Src/IACore/imp/inl/IACore/platform/macos/.gitkeep b/Src/IACore/imp/inl/IACore/platform/macos/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Src/IACore/imp/inl/IACore/platform/process.inl b/Src/IACore/imp/inl/IACore/platform/process.inl new file mode 100644 index 0000000..886500e --- /dev/null +++ b/Src/IACore/imp/inl/IACore/platform/process.inl @@ -0,0 +1,25 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include "platform.inl" + +#if (defined(IA_PLATFORM_WIN64) && (IA_PLATFORM_WIN64 > 0)) + #include "win/process.inl" +#else + #error "IACore Unsupported Platform" +#endif \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/platform/win/common.inl b/Src/IACore/imp/inl/IACore/platform/win/common.inl new file mode 100644 index 0000000..0070b60 --- /dev/null +++ b/Src/IACore/imp/inl/IACore/platform/win/common.inl @@ -0,0 +1,25 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#define WIN32_LEAN_AND_MEAN +#include + +namespace ia +{ + +} \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/platform/win/environment.inl b/Src/IACore/imp/inl/IACore/platform/win/environment.inl new file mode 100644 index 0000000..65e61cc --- /dev/null +++ b/Src/IACore/imp/inl/IACore/platform/win/environment.inl @@ -0,0 +1,40 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include "../interface/environment.interface.inl" +#include "common.inl" + +namespace ia +{ + String Environment::GetVar(IN CONST String &name) + { + const auto l = GetEnvironmentVariableA(name.c_str(), nullptr, 0); + if (!l) + return ""; + String result; + result.resize(l); + GetEnvironmentVariableA(name.c_str(), result.data(), l); + result.back() = '\0'; + return result; + } + + BOOL Environment::SetVar(IN CONST String &name, IN CONST String &value) + { + return SetEnvironmentVariableA(name.c_str(), value.c_str()); + } +} // namespace ia \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/platform/win/process.inl b/Src/IACore/imp/inl/IACore/platform/win/process.inl new file mode 100644 index 0000000..1896ead --- /dev/null +++ b/Src/IACore/imp/inl/IACore/platform/win/process.inl @@ -0,0 +1,137 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include "../interface/process.interface.inl" +#include "common.inl" + +#include + +namespace ia +{ + SubProcess::SubProcess(IN CONST String &path) : m_path(path) + { + } + + SubProcess::~SubProcess() + { + } + + INT32 SubProcess::Launch(IN CONST String &args, IN Function onOutputLineCallback) + { + String szCmdline = BuildString(m_path, " ", args); + + PROCESS_INFORMATION piProcInfo; + STARTUPINFOA siStartInfo; + BOOL bSuccess = FALSE; + ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); + + HANDLE hRdStdIn{}; + HANDLE hWrStdIn{}; + HANDLE hRdStdOut{}; + HANDLE hWrStdOut{}; + + SECURITY_ATTRIBUTES saAttr; + saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); + saAttr.bInheritHandle = TRUE; + saAttr.lpSecurityDescriptor = NULL; + if (!CreatePipe(&hRdStdIn, &hWrStdIn, &saAttr, 0)) + THROW_UNKNOWN("Failed to create a win32 pipe"); + if (!SetHandleInformation(hWrStdIn, HANDLE_FLAG_INHERIT, 0)) + THROW_UNKNOWN("Failed to update a win32 pipe"); + if (!CreatePipe(&hRdStdOut, &hWrStdOut, &saAttr, 0)) + THROW_UNKNOWN("Failed to create a win32 pipe"); + if (!SetHandleInformation(hRdStdOut, HANDLE_FLAG_INHERIT, 0)) + THROW_UNKNOWN("Failed to update a win32 pipe"); + + ZeroMemory(&siStartInfo, sizeof(STARTUPINFOA)); + siStartInfo.cb = sizeof(STARTUPINFOA); + siStartInfo.hStdError = hWrStdOut; + siStartInfo.hStdOutput = hWrStdOut; + siStartInfo.hStdInput = hRdStdIn; + siStartInfo.dwFlags |= STARTF_USESTDHANDLES; + + bSuccess = CreateProcessA(NULL, + szCmdline.data(), // command line + NULL, // process security attributes + NULL, // primary thread security attributes + TRUE, // handles are inherited + 0, // creation flags + NULL, // use parent's environment + NULL, // use parent's current directory + &siStartInfo, // STARTUPINFO pointer + &piProcInfo); // receives PROCESS_INFORMATION + + if (!bSuccess) + THROW_UNKNOWN("Couldn't spawn the child process \"", m_path, "\""); + else + { + CloseHandle(piProcInfo.hProcess); + CloseHandle(piProcInfo.hThread); + + CloseHandle(hWrStdOut); + CloseHandle(hRdStdIn); + } + + CloseHandle(hWrStdIn); + + DWORD exitCode{}; + while (true) + { + GetExitCodeProcess(piProcInfo.hProcess, &exitCode); + if (exitCode != STILL_ACTIVE) + break; + } + + Vector currentLine; + CHAR readBuffer[1024]; + while (true) + { + DWORD readSize; + const auto success = ReadFile(hRdStdOut, readBuffer, sizeof(readBuffer), &readSize, NULL); + if ((!success) || (!readSize)) + break; + for (DWORD i = 0; i < readSize; i++) + { + if (readBuffer[i] == '\n') + { + String result; + result.resize(currentLine.size() + 1); + memcpy(result.data(), currentLine.data(), currentLine.size()); + result[currentLine.size()] = '\0'; + currentLine.reset(); + onOutputLineCallback(result); + } + else + { + currentLine.append(readBuffer[i]); + } + } + } + + if (currentLine.size()) + { + String result; + result.resize(currentLine.size() + 1); + memcpy(result.data(), currentLine.data(), currentLine.size()); + result[currentLine.size()] = '\0'; + onOutputLineCallback(result); + } + + return exitCode; + } +} // namespace ia \ No newline at end of file diff --git a/Src/IACore/inc/hpp/IACore/Environment.hpp b/Src/IACore/inc/hpp/IACore/Environment.hpp new file mode 100644 index 0000000..2d17bf8 --- /dev/null +++ b/Src/IACore/inc/hpp/IACore/Environment.hpp @@ -0,0 +1,23 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia +{ +} // namespace ia \ No newline at end of file diff --git a/Src/IACore/inc/hpp/IACore/Process.hpp b/Src/IACore/inc/hpp/IACore/Process.hpp new file mode 100644 index 0000000..05ee556 --- /dev/null +++ b/Src/IACore/inc/hpp/IACore/Process.hpp @@ -0,0 +1,23 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia +{ +} // namespace ia \ No newline at end of file diff --git a/Src/IACore/inc/hpp/IACore/Thread.hpp b/Src/IACore/inc/hpp/IACore/Thread.hpp new file mode 100644 index 0000000..7e1f6cd --- /dev/null +++ b/Src/IACore/inc/hpp/IACore/Thread.hpp @@ -0,0 +1,28 @@ +// IACore-OSS; The Core Library for All IA Open Source Projects +// Copyright (C) 2024 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +#include +#include + +namespace ia +{ + using Mutex = std::mutex; + using ScopeMutex = std::lock_guard; +} \ No newline at end of file diff --git a/Src/IACore/inc/hpp/IACore/Types.hpp b/Src/IACore/inc/hpp/IACore/Types.hpp index d6012df..9a9e050 100644 --- a/Src/IACore/inc/hpp/IACore/Types.hpp +++ b/Src/IACore/inc/hpp/IACore/Types.hpp @@ -98,6 +98,9 @@ namespace ia typedef CONST FLOAT32 PCFLOAT32; typedef CONST FLOAT64 PCFLOAT64; + template + using Function = std::function; + /* Uses the UEFI standard GUID structure definition */ typedef struct _IA_GUID { diff --git a/Src/IACoreTest/imp/cpp/Main.cpp b/Src/IACoreTest/imp/cpp/Main.cpp index db6b1bf..d0517e2 100644 --- a/Src/IACoreTest/imp/cpp/Main.cpp +++ b/Src/IACoreTest/imp/cpp/Main.cpp @@ -1,34 +1,36 @@ -#include #include +#include -#include #include +#include + +#include +#include using namespace ia; -template -VOID print(IN CONST Span<_value_type>& s) +template VOID print(IN CONST Span<_value_type> &s) { - for(const auto& v: s) + for (const auto &v : s) Logger::Info("IACore", v); } -int main(int argc, char* argv[]) +int main(int argc, char *argv[]) { - Vector v1{10, 20, 32}; - + /*ector v1{10, 20, 32}; print(v1); - List l1; - Map m1; m1["sdd"] = 2; m1["bx"] = 5; - - for(const auto& v: m1) - { + for (const auto &v : m1) printf("%s, %i\n", v->Key.c_str(), v->Value); - } + SubProcess p("clang++"); + p.Launch("a.cpp", [](IN CONST String &line) { printf("[\n%s\n]\n", line.c_str()); });*/ + + printf("[%s]\n", Environment::GetVar("IAEDK_ROOT").c_str()); + Environment::SetVar("IAEDK_ROOT", "C:\\IAEDK"); + printf("[%s]\n", Environment::GetVar("IAEDK_ROOT").c_str()); return 0; } \ No newline at end of file