chore: introduce Windows-specific argument parsing to v2 namespace.

This commit is contained in:
2026-03-16 16:50:42 +04:00
parent 3552d34dac
commit 8befc60016
2 changed files with 38 additions and 11 deletions

View File

@@ -3,6 +3,7 @@
#include "windows_parser.hpp"
#include <Windows.h>
#include <memory>
#include <shellapi.h>
#include <string>
@@ -23,20 +24,38 @@ std::string utf8_from_wstring(const std::wstring &w) {
return out;
}
struct local_free_deleter {
void operator()(void *ptr) const {
if (ptr == nullptr) {
return;
}
LocalFree(static_cast<HLOCAL>(ptr));
}
};
void parse_windows_arguments(std::vector<std::string> &parsed_arguments) {
int argc_w;
std::unique_ptr<LPWSTR[], local_free_deleter> argv_w(CommandLineToArgvW(GetCommandLineW(), &argc_w));
if (argv_w == nullptr) {
throw std::runtime_error("CommandLineToArgvW failed");
}
for (int i = 0; i < argc_w; i++) {
std::string arg = utf8_from_wstring(argv_w[i]);
parsed_arguments.emplace_back(arg);
}
}
namespace argument_parser {
windows_parser::windows_parser() {
LPWSTR *argv_w;
int argc_w;
argv_w = CommandLineToArgvW(GetCommandLineW(), &argc_w);
if (argv_w == nullptr) {
throw std::runtime_error("CommandLineToArgvW failed");
}
for (int i = 0; i < argc_w; i++) {
std::string arg = utf8_from_wstring(argv_w[i]);
parsed_arguments.emplace_back(arg);
}
LocalFree(argv_w);
parse_windows_arguments(parsed_arguments);
}
} // namespace argument_parser
namespace argument_parser::v2 {
windows_parser::windows_parser() {
parse_windows_arguments(ref_parsed_args());
}
} // namespace argument_parser::v2
#endif