// 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 #include #include #include #include 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(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(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