| 3694 | |
| 3695 | #if WASMEDGE_OS_WINDOWS |
| 3696 | WASMEDGE_CAPI_EXPORT const char ** |
| 3697 | WasmEdge_Driver_ArgvCreate(int Argc, const wchar_t *Argv[]) noexcept { |
| 3698 | try { |
| 3699 | const Span<const wchar_t *> Args(Argv, static_cast<size_t>(Argc)); |
| 3700 | const size_t PointerArraySize = static_cast<size_t>(Argc) * sizeof(char *); |
| 3701 | size_t StringBufferSize = 0; |
| 3702 | for (auto Arg : Args) { |
| 3703 | const auto Res = std::max<size_t>( |
| 3704 | static_cast<size_t>(winapi::WideCharToMultiByte( |
| 3705 | winapi::CP_UTF8_, 0, Arg, -1, nullptr, 0, nullptr, nullptr)), |
| 3706 | 1u); |
| 3707 | StringBufferSize += Res; |
| 3708 | } |
| 3709 | auto Buffer = std::make_unique<char[]>(PointerArraySize + StringBufferSize); |
| 3710 | Span<char *> PointerArray(reinterpret_cast<char **>(Buffer.get()), |
| 3711 | static_cast<size_t>(Argc)); |
| 3712 | Span<char> StringBuffer(Buffer.get() + PointerArraySize, StringBufferSize); |
| 3713 | for (auto Arg : Args) { |
| 3714 | PointerArray[0] = StringBuffer.data(); |
| 3715 | PointerArray = PointerArray.subspan(1); |
| 3716 | const auto Res = std::max<size_t>( |
| 3717 | static_cast<size_t>(winapi::WideCharToMultiByte( |
| 3718 | winapi::CP_UTF8_, 0, Arg, -1, StringBuffer.data(), |
| 3719 | static_cast<int>(StringBuffer.size()), nullptr, nullptr)), |
| 3720 | 1); |
| 3721 | StringBuffer = StringBuffer.subspan(Res); |
| 3722 | } |
| 3723 | |
| 3724 | return reinterpret_cast<const char **>(Buffer.release()); |
| 3725 | } catch (...) { |
| 3726 | handleCAPIError(); |
| 3727 | return nullptr; |
| 3728 | } |
| 3729 | } |
| 3730 | |
| 3731 | WASMEDGE_CAPI_EXPORT void |
| 3732 | WasmEdge_Driver_ArgvDelete(const char *Argv[]) noexcept { |