| // Copyright 2013 The Flutter 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 "impeller/base/strings.h" | |
| #include <cstdarg> | |
| namespace impeller { | |
| IMPELLER_PRINTF_FORMAT(1, 2) | |
| std::string SPrintF(const char* format, ...) { | |
| std::string ret_val; | |
| va_list list; | |
| va_list list2; | |
| va_start(list, format); | |
| va_copy(list2, list); | |
| if (auto string_length = ::vsnprintf(nullptr, 0, format, list); | |
| string_length >= 0) { | |
| auto buffer = reinterpret_cast<char*>(::malloc(string_length + 1)); | |
| ::vsnprintf(buffer, string_length + 1, format, list2); | |
| ret_val = std::string{buffer, static_cast<size_t>(string_length)}; | |
| ::free(buffer); | |
| } | |
| va_end(list2); | |
| va_end(list); | |
| return ret_val; | |
| } | |
| bool HasPrefix(const std::string& string, const std::string& prefix) { | |
| return string.find(prefix) == 0u; | |
| } | |
| bool HasSuffix(const std::string& string, const std::string& suffix) { | |
| auto position = string.rfind(suffix); | |
| if (position == std::string::npos) { | |
| return false; | |
| } | |
| return position == string.size() - suffix.size(); | |
| } | |
| std::string StripPrefix(const std::string& string, | |
| const std::string& to_strip) { | |
| if (!HasPrefix(string, to_strip)) { | |
| return string; | |
| } | |
| return string.substr(to_strip.length()); | |
| } | |
| } // namespace impeller |