14615e0d5aa416ab1a8596bde68f71f7ebe431b86Vitaly Buka// Copyright 2015 The Weave Authors. All rights reserved. 224d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka// Use of this source code is governed by a BSD-style license that can be 324d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka// found in the LICENSE file. 424d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 524d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka#include <string.h> 634668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka#include <algorithm> 724d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka#include <utility> 824d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 924d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka#include <base/strings/string_util.h> 1024d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 112d16dfa768282b29f3fd5a905b52e3393a083e0dStefan Sauer#include "src/string_utils.h" 1224d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 1324d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Bukanamespace weave { 1424d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 1524d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Bukanamespace { 1624d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 1724d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Bukabool SplitAtFirst(const std::string& str, 1824d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka const std::string& delimiter, 1924d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka std::string* left_part, 2024d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka std::string* right_part, 2124d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka bool trim_whitespaces) { 2224d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka bool delimiter_found = false; 2324d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka std::string::size_type pos = str.find(delimiter); 2424d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka if (pos != std::string::npos) { 2524d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka *left_part = str.substr(0, pos); 2624d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka *right_part = str.substr(pos + delimiter.size()); 2724d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka delimiter_found = true; 2824d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka } else { 2924d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka *left_part = str; 3024d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka right_part->clear(); 3124d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka } 3224d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 3324d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka if (trim_whitespaces) { 3424d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka base::TrimWhitespaceASCII(*left_part, base::TRIM_ALL, left_part); 3524d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka base::TrimWhitespaceASCII(*right_part, base::TRIM_ALL, right_part); 3624d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka } 3724d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 3824d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka return delimiter_found; 3924d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka} 4024d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 4124d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka} // namespace 4224d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 4324d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Bukastd::vector<std::string> Split(const std::string& str, 4424d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka const std::string& delimiter, 4524d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka bool trim_whitespaces, 4624d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka bool purge_empty_strings) { 4724d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka std::vector<std::string> tokens; 4824d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka for (std::string::size_type i = 0;;) { 4924d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka const std::string::size_type pos = 5024d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka delimiter.empty() ? (i + 1) : str.find(delimiter, i); 5124d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka std::string tmp_str{str.substr(i, pos - i)}; 5224d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka if (trim_whitespaces) 5324d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka base::TrimWhitespaceASCII(tmp_str, base::TRIM_ALL, &tmp_str); 5424d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka if (!tmp_str.empty() || !purge_empty_strings) 5524d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka tokens.emplace_back(std::move(tmp_str)); 5624d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka if (pos >= str.size()) 5724d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka break; 5824d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka i = pos + delimiter.size(); 5924d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka } 6024d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka return tokens; 6124d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka} 6224d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 6324d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Bukastd::pair<std::string, std::string> SplitAtFirst(const std::string& str, 6424d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka const std::string& delimiter, 6524d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka bool trim_whitespaces) { 6624d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka std::pair<std::string, std::string> pair; 6724d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka SplitAtFirst(str, delimiter, &pair.first, &pair.second, trim_whitespaces); 6824d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka return pair; 6924d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka} 7024d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka 7124d6fd54e9b10ae13e09ca91c726a994853def0dVitaly Buka} // namespace weave 72