-// Copyright (C) 2020-2022 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2023 Joel Rosdahl and other contributors
//
// See doc/AUTHORS.adoc for a complete list of contributors.
//
#include "Args.hpp"
-#include "Util.hpp"
-
#include <Logging.hpp>
#include <core/exceptions.hpp>
#include <util/file.hpp>
Args::from_string(std::string_view command)
{
Args args;
- for (const std::string& word : Util::split_into_strings(command, " \t\r\n")) {
+ for (const std::string& word : util::split_into_strings(command, " \t\r\n")) {
args.push_back(word);
}
return args;
#include <util/TimePoint.hpp>
#include <util/path.hpp>
#include <util/process.hpp>
+#include <util/string.hpp>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
Logging::init(config);
ignore_header_paths =
util::split_path_list(config.ignore_headers_in_manifest());
- set_ignore_options(Util::split_into_strings(config.ignore_options(), " "));
+ set_ignore_options(util::split_into_strings(config.ignore_options(), " "));
// Set default umask for all files created by ccache from now on (if
// configured to). This is intentionally done after calling Logging::init so
#include <util/Tokenizer.hpp>
#include <util/file.hpp>
#include <util/path.hpp>
+#include <util/string.hpp>
#include <algorithm>
"\n",
Tokenizer::Mode::include_empty,
Tokenizer::IncludeDelimiter::yes)) {
- const auto tokens = Util::split_into_views(line, " \t");
+ const auto tokens = util::split_into_views(line, " \t");
for (size_t i = 0; i < tokens.size(); ++i) {
DEBUG_ASSERT(!line.empty()); // line.empty() -> no tokens
DEBUG_ASSERT(!tokens[i].empty());
#include <core/exceptions.hpp>
#include <core/wincompat.hpp>
#include <fmtmacros.hpp>
-#include <util/TimePoint.hpp>
#include <util/file.hpp>
#include <util/filesystem.hpp>
#include <util/path.hpp>
}
}
-template<typename T>
-std::vector<T>
-split_into(std::string_view string,
- const char* separators,
- util::Tokenizer::Mode mode,
- IncludeDelimiter include_delimiter)
-
-{
- std::vector<T> result;
- for (const auto token :
- util::Tokenizer(string, separators, mode, include_delimiter)) {
- result.emplace_back(token);
- }
- return result;
-}
-
std::string
rewrite_stderr_to_absolute_paths(std::string_view text)
{
}
}
-std::vector<std::string_view>
-split_into_views(std::string_view string,
- const char* separators,
- util::Tokenizer::Mode mode,
- IncludeDelimiter include_delimiter)
-{
- return split_into<std::string_view>(
- string, separators, mode, include_delimiter);
-}
-
-std::vector<std::string>
-split_into_strings(std::string_view string,
- const char* separators,
- util::Tokenizer::Mode mode,
- IncludeDelimiter include_delimiter)
-{
- return split_into<std::string>(string, separators, mode, include_delimiter);
-}
-
std::string
strip_ansi_csi_seqs(std::string_view string)
{
#pragma once
#include <util/TimePoint.hpp>
-#include <util/Tokenizer.hpp>
#include <cstdint>
#include <filesystem>
// `core::Error` on error.
void send_to_fd(const Context& ctx, std::string_view text, int fd);
-// Split `string` into tokens at any of the characters in `separators`. These
-// tokens are views into `string`. `separators` must neither be the empty string
-// nor a nullptr.
-std::vector<std::string_view>
-split_into_views(std::string_view string,
- const char* separators,
- util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty,
- util::Tokenizer::IncludeDelimiter include_delimiter =
- util::Tokenizer::IncludeDelimiter::no);
-
-// Same as `split_into_views` but the tokens are copied from `string`.
-std::vector<std::string> split_into_strings(
- std::string_view string,
- const char* separators,
- util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty,
- util::Tokenizer::IncludeDelimiter include_delimiter =
- util::Tokenizer::IncludeDelimiter::no);
-
// Returns a copy of string with the specified ANSI CSI sequences removed.
[[nodiscard]] std::string strip_ansi_csi_seqs(std::string_view string);
++i;
// Argument is a comma-separated list of files.
- auto paths = Util::split_into_strings(args[i], ",");
+ auto paths = util::split_into_strings(args[i], ",");
for (auto it = paths.rbegin(); it != paths.rend(); ++it) {
auto file_args = Args::from_atfile(*it);
if (!file_args) {
}
Args prefix;
- for (const auto& word : Util::split_into_strings(prefix_command, " ")) {
+ for (const auto& word : util::split_into_strings(prefix_command, " ")) {
std::string path = find_executable(ctx, word, ctx.orig_args[0]);
if (path.empty()) {
throw core::Fatal(FMT("{}: {}", word, strerror(errno)));
-// Copyright (C) 2022 Joel Rosdahl and other contributors
+// Copyright (C) 2022-2023 Joel Rosdahl and other contributors
//
// See doc/AUTHORS.adoc for a complete list of contributors.
//
#include "MsvcShowIncludesOutput.hpp"
#include <Context.hpp>
-#include <Util.hpp>
#include <util/string.hpp>
namespace core::MsvcShowIncludesOutput {
std::vector<std::string_view> result;
// This will split at each \r or \n, but that simply means there will be empty
// "lines".
- for (std::string_view line : Util::split_into_views(file_content, "\r\n")) {
+ for (std::string_view line : util::split_into_views(file_content, "\r\n")) {
if (util::starts_with(line, prefix)) {
size_t pos = prefix.size();
while (pos < line.size() && isspace(line[pos])) {
const std::string& command,
const std::string& compiler)
{
- for (const std::string& cmd : Util::split_into_strings(command, ";")) {
+ for (const std::string& cmd : util::split_into_strings(command, ";")) {
if (!hash_command_output(hash, cmd, compiler)) {
return false;
}
parse_storage_config(const std::string_view entry)
{
const auto parts =
- Util::split_into_views(entry, "|", util::Tokenizer::Mode::include_empty);
+ util::split_into_views(entry, "|", util::Tokenizer::Mode::include_empty);
if (parts.empty() || parts.front().empty()) {
throw core::Error(
#include "fmtmacros.hpp"
#include <Stat.hpp>
+#include <assertions.hpp>
#include <core/exceptions.hpp>
#include <core/wincompat.hpp>
#include <util/file.hpp>
#include <Util.hpp>
#include <fmtmacros.hpp>
#include <util/filesystem.hpp>
+#include <util/string.hpp>
#ifdef _WIN32
const char k_dev_null_path[] = "nul:";
std::vector<std::string>
split_path_list(std::string_view path_list)
{
- return Util::split_into_strings(path_list, k_path_delimiter);
+ return util::split_into_strings(path_list, k_path_delimiter);
}
std::string
#include <cctype>
#include <iostream>
+namespace {
+
+template<typename T>
+std::vector<T>
+split_into(std::string_view string,
+ const char* separators,
+ util::Tokenizer::Mode mode,
+ util::Tokenizer::IncludeDelimiter include_delimiter)
+
+{
+ std::vector<T> result;
+ for (const auto token :
+ util::Tokenizer(string, separators, mode, include_delimiter)) {
+ result.emplace_back(token);
+ }
+ return result;
+}
+
+} // namespace
+
namespace util {
std::string
return result;
}
+std::vector<std::string>
+split_into_strings(std::string_view string,
+ const char* separators,
+ util::Tokenizer::Mode mode,
+ util::Tokenizer::IncludeDelimiter include_delimiter)
+{
+ return split_into<std::string>(string, separators, mode, include_delimiter);
+}
+
+std::vector<std::string_view>
+split_into_views(std::string_view string,
+ const char* separators,
+ util::Tokenizer::Mode mode,
+ util::Tokenizer::IncludeDelimiter include_delimiter)
+{
+ return split_into<std::string_view>(
+ string, separators, mode, include_delimiter);
+}
+
std::pair<std::string_view, std::optional<std::string_view>>
split_once(const char* string, const char split_char)
{
#pragma once
#include <util/Bytes.hpp>
+#include <util/Tokenizer.hpp>
#include <util/conversion.hpp>
#include <third_party/nonstd/expected.hpp>
#include <string>
#include <string_view>
#include <utility>
+#include <vector>
namespace util {
std::string_view from,
std::string_view to);
+// Split `string` into tokens at any of the characters in `separators`.
+// `separators` must neither be the empty string nor a nullptr.
+std::vector<std::string> split_into_strings(
+ std::string_view string,
+ const char* separators,
+ util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty,
+ util::Tokenizer::IncludeDelimiter include_delimiter =
+ util::Tokenizer::IncludeDelimiter::no);
+
+// Split `string` into tokens at any of the characters in `separators`. These
+// tokens are views into `string`. `separators` must neither be the empty string
+// nor a nullptr.
+std::vector<std::string_view>
+split_into_views(std::string_view string,
+ const char* separators,
+ util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty,
+ util::Tokenizer::IncludeDelimiter include_delimiter =
+ util::Tokenizer::IncludeDelimiter::no);
+
// Split `string` into two parts using `split_char` as the delimiter. The second
// part will be `nullopt` if there is no `split_char` in `string.`
std::pair<std::string_view, std::optional<std::string_view>>
CHECK(Util::remove_extension("/foo/bar/f.abc.txt") == "/foo/bar/f.abc");
}
-// Util::split_into_strings and Util::split_into_views are tested implicitly in
-// test_util_Tokenizer.cpp.
-
TEST_CASE("Util::to_lowercase")
{
CHECK(Util::to_lowercase("") == "");
#include "../src/Util.hpp"
+#include <util/string.hpp>
+
#include "third_party/doctest.h"
#include <ostream> // https://github.com/doctest/doctest/issues/618
const std::vector<std::string>& expected) const
{
const auto res =
- Util::split_into_views(input, separators, m_mode, m_include_delimiter);
+ util::split_into_views(input, separators, m_mode, m_include_delimiter);
REQUIRE(res.size() == expected.size());
for (int i = 0, total = expected.size(); i < total; ++i) {
CHECK(res[i] == expected[i]);
CHECK(util::replace_first("xabcyabcz", "abc", "defdef") == "xdefdefyabcz");
}
+TEST_CASE("util::split_into_strings")
+{
+ // Edge cases are tested in test_util_Tokenizer.cpp.
+ CHECK(util::split_into_strings("foo bar", " ")
+ == std::vector<std::string>{"foo", "bar"});
+}
+
+TEST_CASE("util::split_into_views")
+{
+ // Edge cases are tested in test_util_Tokenizer.cpp.
+ CHECK(util::split_into_views("foo bar", " ")
+ == std::vector<std::string_view>{"foo", "bar"});
+}
+
TEST_CASE("util::split_once")
{
using std::make_pair;