blob: 3c6f85bff85bd1d5283b7c9991bebcae65e42068 [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 "peridot/lib/util/string_escape.h"
using fxl::StringView;
namespace modular {
std::string StringEscape(StringView input, StringView chars_to_escape,
char escape_char) {
std::string output;
output.reserve(input.size());
for (const auto& c : input) {
if (chars_to_escape.find(c) != StringView::npos || c == escape_char) {
output.push_back(escape_char);
}
output.push_back(c);
}
return output;
}
std::string StringUnescape(StringView input, char escape_char) {
std::string output;
for (size_t i = 0; i < input.size(); i++) {
if (input[i] == escape_char) {
FXL_DCHECK(i != input.size() - 1)
<< "StringUnescape: unescapable string: " << input;
if (i != input.size() - 1) {
i++;
}
}
output.push_back(input[i]);
}
return output;
}
std::vector<StringView> SplitEscapedString(StringView input, char split_char,
char escape_char) {
std::vector<StringView> 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