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