| // 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 |