blob: e409a8f235bd99370f8263b215292f314869815b [file] [log] [blame]
// Copyright 2017 The Fuchsia 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 "src/modular/lib/string_escape/string_escape.h"
#include <lib/syslog/cpp/macros.h>
namespace modular {
std::string StringEscape(std::string_view input, std::string_view chars_to_escape,
char escape_char) {
std::string output;
output.reserve(input.size());
for (const auto& c : input) {
if (chars_to_escape.find(c) != std::string_view::npos || c == escape_char) {
output.push_back(escape_char);
}
output.push_back(c);
}
return output;
}
std::string StringUnescape(std::string_view input, char escape_char) {
std::string output;
for (size_t i = 0; i < input.size(); i++) {
if (input[i] == escape_char) {
FX_DCHECK(i != input.size() - 1) << "StringUnescape: unescapable string: " << input;
if (i != input.size() - 1) {
i++;
}
}
output.push_back(input[i]);
}
return output;
}
std::vector<std::string_view> SplitEscapedString(std::string_view input, char split_char,
char escape_char) {
std::vector<std::string_view> output;
size_t last_pos = 0;
for (size_t i = 0; i < input.size(); i++) {
if (input[i] == escape_char) {
i++;
// skips a 2nd time:
continue;
}
if (input[i] == split_char) {
output.push_back(input.substr(last_pos, i - last_pos));
last_pos = i + 1;
continue;
}
}
if (last_pos < input.size()) {
output.push_back(input.substr(last_pos, input.size() - last_pos));
}
return output;
}
} // namespace modular