From 8befc60016f574d3cfac3afd718aceca6f60ac6a Mon Sep 17 00:00:00 2001 From: killua Date: Mon, 16 Mar 2026 16:50:42 +0400 Subject: [PATCH] chore: introduce Windows-specific argument parsing to v2 namespace. --- .../platform_headers/windows_parser.hpp | 8 ++++ .../platform_parsers/windows_parser.cpp | 41 ++++++++++++++----- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/headers/parser/platform_headers/windows_parser.hpp b/src/headers/parser/platform_headers/windows_parser.hpp index ad32c66..17ad798 100644 --- a/src/headers/parser/platform_headers/windows_parser.hpp +++ b/src/headers/parser/platform_headers/windows_parser.hpp @@ -1,11 +1,19 @@ #pragma once #ifdef _WIN32 #include +#include namespace argument_parser { class windows_parser : public base_parser { public: windows_parser(); }; + + namespace v2 { + class windows_parser : public v2::base_parser { + public: + windows_parser(); + }; + } // namespace v2 } // namespace argument_parser #endif \ No newline at end of file diff --git a/src/source/parser/platform_parsers/windows_parser.cpp b/src/source/parser/platform_parsers/windows_parser.cpp index ea891b6..2ea087c 100644 --- a/src/source/parser/platform_parsers/windows_parser.cpp +++ b/src/source/parser/platform_parsers/windows_parser.cpp @@ -3,6 +3,7 @@ #include "windows_parser.hpp" #include +#include #include #include @@ -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(ptr)); + } +}; + +void parse_windows_arguments(std::vector &parsed_arguments) { + int argc_w; + std::unique_ptr 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 \ No newline at end of file