From 08cb70d816550c093646ce956934adf848e7d73c Mon Sep 17 00:00:00 2001 From: Alexander Gutkin Date: Thu, 21 May 2026 02:19:03 -0700 Subject: [PATCH] Roll out cheep and cheerful POSIX strndup replacement for MSVC compiler on Windows. PiperOrigin-RevId: 918923772 --- openfst/static/command_dispatcher.cc | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/openfst/static/command_dispatcher.cc b/openfst/static/command_dispatcher.cc index 28ef6dc5..f53e8a1b 100644 --- a/openfst/static/command_dispatcher.cc +++ b/openfst/static/command_dispatcher.cc @@ -33,6 +33,28 @@ #include "absl/strings/string_view.h" #include "absl/strings/strip.h" +#if defined(_MSC_VER) // Windows MSVC compiler. +#include // ::malloc and friends. +#include // For ::strnlen. + +namespace { + +char* strndup(const char* s, size_t n) { + if (!s) return nullptr; + + const size_t len = ::strnlen(s, n); + char* copy = (char*)::malloc(len + 1); + if (copy) { + ::memcpy(copy, s, len); + copy[len] = '\0'; + } + return copy; +} + +} // namespace + +#endif // _MSC_VER + namespace fst { CommandDispatcher::CommandDispatcher(const std::string& main_command_name, @@ -136,7 +158,7 @@ int CommandDispatcher::Main(int argc, char** argv) { // remove command and shift arguments after the command back by one std::copy(argv + command_index + 1, argv + argc, argv + command_index); --argc; - argv[0] = ::strndup(cmd.c_str(), cmd.size()); + argv[0] = strndup(cmd.c_str(), cmd.size()); // C++ standard requires argv[argc] is null. argv[argc] = nullptr; }