Provide default implementation of quiche_command_line_flags.h

PiperOrigin-RevId: 449066529
diff --git a/build/source_list.bzl b/build/source_list.bzl
index 855c33d..8b9a145 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -1391,11 +1391,13 @@
     "common/platform/default/quiche_platform_impl/quiche_url_utils_impl.cc",
 ]
 default_platform_impl_tool_support_hdrs = [
+    "common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h",
     "common/platform/default/quiche_platform_impl/quiche_file_utils_impl.h",
     "common/platform/default/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h",
     "common/platform/default/quiche_platform_impl/quiche_system_event_loop_impl.h",
 ]
 default_platform_impl_tool_support_srcs = [
+    "common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.cc",
     "common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc",
 ]
 default_platform_impl_test_support_hdrs = [
diff --git a/build/source_list.gni b/build/source_list.gni
index 37b047d..c09f3dd 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -1391,11 +1391,13 @@
     "src/quiche/common/platform/default/quiche_platform_impl/quiche_url_utils_impl.cc",
 ]
 default_platform_impl_tool_support_hdrs = [
+    "src/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h",
     "src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.h",
     "src/quiche/common/platform/default/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h",
     "src/quiche/common/platform/default/quiche_platform_impl/quiche_system_event_loop_impl.h",
 ]
 default_platform_impl_tool_support_srcs = [
+    "src/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.cc",
     "src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc",
 ]
 default_platform_impl_test_support_hdrs = [
diff --git a/build/source_list.json b/build/source_list.json
index ab942c5..abb7bd7 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -1390,11 +1390,13 @@
     "quiche/common/platform/default/quiche_platform_impl/quiche_url_utils_impl.cc"
   ],
   "default_platform_impl_tool_support_hdrs": [
+    "quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h",
     "quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.h",
     "quiche/common/platform/default/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h",
     "quiche/common/platform/default/quiche_platform_impl/quiche_system_event_loop_impl.h"
   ],
   "default_platform_impl_tool_support_srcs": [
+    "quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.cc",
     "quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc"
   ],
   "default_platform_impl_test_support_hdrs": [
diff --git a/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.cc b/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.cc
new file mode 100644
index 0000000..ae15376
--- /dev/null
+++ b/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.cc
@@ -0,0 +1,41 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "quiche_platform_impl/quiche_command_line_flags_impl.h"
+
+#include <iostream>
+
+#include "absl/flags/parse.h"
+#include "absl/flags/usage.h"
+
+namespace quiche {
+
+static void SetUsage(absl::string_view usage) {
+  static bool usage_set = false;
+  if (!usage_set) {
+    absl::SetProgramUsageMessage(usage);
+    usage_set = true;
+  }
+}
+
+std::vector<std::string> QuicheParseCommandLineFlagsImpl(
+    const char* usage, int argc, const char* const* argv, bool /*parse_only*/) {
+  SetUsage(usage);
+  std::vector<char*> parsed =
+      absl::ParseCommandLine(argc, const_cast<char**>(argv));
+  std::vector<std::string> result;
+  result.reserve(parsed.size());
+  // Remove the first argument, which is the name of the binary.
+  for (size_t i = 1; i < parsed.size(); i++) {
+    result.push_back(std::string(parsed[i]));
+  }
+  return result;
+}
+
+void QuichePrintCommandLineFlagHelpImpl(const char* usage) {
+  SetUsage(usage);
+  std::cerr << absl::ProgramUsageMessage() << std::endl;
+}
+
+}  // namespace quiche
diff --git a/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h b/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h
new file mode 100644
index 0000000..e0ccf17
--- /dev/null
+++ b/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h
@@ -0,0 +1,28 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_COMMAND_LINE_FLAGS_IMPL_H_
+#define QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_COMMAND_LINE_FLAGS_IMPL_H_
+
+#include "absl/flags/flag.h"
+
+#define DEFINE_QUICHE_COMMAND_LINE_FLAG_IMPL(type, name, default_value, help) \
+  ABSL_FLAG(type, name, default_value, help)
+
+namespace quiche {
+
+std::vector<std::string> QuicheParseCommandLineFlagsImpl(
+    const char* usage, int argc, const char* const* argv,
+    bool parse_only = false);
+
+void QuichePrintCommandLineFlagHelpImpl(const char* usage);
+
+}  // namespace quiche
+
+template <typename T>
+T GetQuicheFlagImpl(const absl::Flag<T>& flag) {
+  return absl::GetFlag(flag);
+}
+
+#endif  // QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_COMMAND_LINE_FLAGS_IMPL_H_