16c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko// Copyright 2014 The Chromium OS Authors. All rights reserved.
26c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko// Use of this source code is governed by a BSD-style license that can be
36c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko// found in the LICENSE file.
46c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
59ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/strings/string_utils.h>
66c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
76c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko#include <algorithm>
86c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko#include <string.h>
96c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko#include <utility>
106c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
116c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko#include <base/strings/string_util.h>
126c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko#include <base/strings/stringprintf.h>
136c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
149ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo {
156c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenkonamespace string_utils {
166c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
176c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenkostd::vector<std::string> Split(const std::string& str,
18852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka                               const std::string& delimiter,
196c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko                               bool trim_whitespaces,
206c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko                               bool purge_empty_strings) {
216c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  std::vector<std::string> tokens;
22852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka  if (str.empty())
236c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko    return tokens;
246c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
25852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka  for (std::string::size_type i = 0;;) {
26852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    const std::string::size_type pos =
27852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka        delimiter.empty() ? (i + 1) : str.find(delimiter, i);
28852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    std::string tmp_str{str.substr(i, pos - i)};
29852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    if (trim_whitespaces)
30852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka      base::TrimWhitespaceASCII(tmp_str, base::TRIM_ALL, &tmp_str);
31852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    if (!tmp_str.empty() || !purge_empty_strings)
32852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka      tokens.emplace_back(std::move(tmp_str));
33852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    if (pos >= str.size())
34852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka      break;
35852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    i = pos + delimiter.size();
366c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  }
376c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  return tokens;
386c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko}
396c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
40097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenkobool SplitAtFirst(const std::string& str,
41852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka                  const std::string& delimiter,
42097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko                  std::string* left_part,
43097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko                  std::string* right_part,
44097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko                  bool trim_whitespaces) {
45097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko  bool delimiter_found = false;
46852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka  std::string::size_type pos = str.find(delimiter);
47852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka  if (pos != std::string::npos) {
48852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    *left_part = str.substr(0, pos);
49852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    *right_part = str.substr(pos + delimiter.size());
50097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko    delimiter_found = true;
516c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  } else {
52097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko    *left_part = str;
53852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka    right_part->clear();
546c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  }
556c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
566c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  if (trim_whitespaces) {
57097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko    base::TrimWhitespaceASCII(*left_part, base::TRIM_ALL, left_part);
58097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko    base::TrimWhitespaceASCII(*right_part, base::TRIM_ALL, right_part);
596c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  }
606c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
61097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko  return delimiter_found;
62097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko}
63097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko
64097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenkostd::pair<std::string, std::string> SplitAtFirst(const std::string& str,
65852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka                                                 const std::string& delimiter,
66097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko                                                 bool trim_whitespaces) {
67097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko  std::pair<std::string, std::string> pair;
68097cab674d53867b4f3ac13cfa747e3d641e50afAlex Vakulenko  SplitAtFirst(str, delimiter, &pair.first, &pair.second, trim_whitespaces);
696c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  return pair;
706c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko}
716c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
726c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenkostd::string ToString(double value) {
736c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  return base::StringPrintf("%g", value);
746c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko}
756c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
766c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenkostd::string ToString(bool value) {
776c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko  return value ? "true" : "false";
786c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko}
796c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko
80c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenkostd::string GetBytesAsString(const std::vector<uint8_t>& buffer) {
813b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka  return std::string(buffer.begin(), buffer.end());
82c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko}
83c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko
84c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenkostd::vector<uint8_t> GetStringAsBytes(const std::string& str) {
853b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka  return std::vector<uint8_t>(str.begin(), str.end());
86c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko}
87c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko
886c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko}  // namespace string_utils
899ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko}  // namespace brillo
90