string_utils.cc revision 9ed0cab99f18acb3570a35e9408f24355f6b8324
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