| // 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/compiler/utilities.h" | |
| #include <algorithm> | |
| #include <cctype> | |
| #include <filesystem> | |
| #include <iostream> | |
| #include <sstream> | |
| namespace impeller { | |
| namespace compiler { | |
| bool SetPermissiveAccess(const std::filesystem::path& p) { | |
| auto permissions = | |
| std::filesystem::perms::owner_read | std::filesystem::perms::owner_write | | |
| std::filesystem::perms::group_read | std::filesystem::perms::others_read; | |
| std::error_code error; | |
| std::filesystem::permissions(p, permissions, error); | |
| if (error) { | |
| std::cerr << "Failed to set access on file '" << p | |
| << "': " << error.message() << std::endl; | |
| return false; | |
| } | |
| return true; | |
| } | |
| std::string Utf8FromPath(const std::filesystem::path& path) { | |
| return reinterpret_cast<const char*>(path.u8string().c_str()); | |
| } | |
| std::string InferShaderNameFromPath(std::string_view path) { | |
| auto p = std::filesystem::path{path}.stem(); | |
| return Utf8FromPath(p); | |
| } | |
| std::string ToCamelCase(std::string_view string) { | |
| if (string.empty()) { | |
| return ""; | |
| } | |
| std::stringstream stream; | |
| bool next_upper = true; | |
| for (size_t i = 0, count = string.length(); i < count; i++) { | |
| auto ch = string.data()[i]; | |
| if (next_upper) { | |
| next_upper = false; | |
| stream << static_cast<char>(std::toupper(ch)); | |
| continue; | |
| } | |
| if (ch == '_') { | |
| next_upper = true; | |
| continue; | |
| } | |
| stream << ch; | |
| } | |
| return stream.str(); | |
| } | |
| std::string ToLowerCase(std::string_view string) { | |
| std::string result = std::string(string); | |
| std::transform(result.begin(), result.end(), result.begin(), | |
| [](char x) { return std::tolower(x); }); | |
| return result; | |
| } | |
| std::string ConvertToEntrypointName(std::string_view string) { | |
| if (string.empty()) { | |
| return ""; | |
| } | |
| std::stringstream stream; | |
| // Append a prefix if the first character is not a letter. | |
| if (!std::isalpha(string.data()[0])) { | |
| stream << "i_"; | |
| } | |
| for (size_t i = 0, count = string.length(); i < count; i++) { | |
| auto ch = string.data()[i]; | |
| if (std::isalnum(ch) || ch == '_') { | |
| stream << ch; | |
| } | |
| } | |
| return stream.str(); | |
| } | |
| bool StringStartsWith(const std::string& target, const std::string& prefix) { | |
| if (prefix.length() > target.length()) { | |
| return false; | |
| } | |
| for (size_t i = 0; i < prefix.length(); i++) { | |
| if (target[i] != prefix[i]) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| } // namespace compiler | |
| } // namespace impeller |