1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#include <ctime> 17e509ee18Sopenharmony_ci#include <climits> 18e509ee18Sopenharmony_ci#include <cerrno> 19e509ee18Sopenharmony_ci#include <string> 20e509ee18Sopenharmony_ci 21e509ee18Sopenharmony_ci#include "common/log_wrapper.h" 22e509ee18Sopenharmony_ci#include "tooling/utils/utils.h" 23e509ee18Sopenharmony_ci 24e509ee18Sopenharmony_cinamespace OHOS::ArkCompiler::Toolchain { 25e509ee18Sopenharmony_cibool Utils::GetCurrentTime(char *date, char *tim, size_t size) 26e509ee18Sopenharmony_ci{ 27e509ee18Sopenharmony_ci time_t timep = time(nullptr); 28e509ee18Sopenharmony_ci if (timep == -1) { 29e509ee18Sopenharmony_ci LOGE("get timep failed"); 30e509ee18Sopenharmony_ci return false; 31e509ee18Sopenharmony_ci } 32e509ee18Sopenharmony_ci 33e509ee18Sopenharmony_ci tm* currentDate = localtime(&timep); 34e509ee18Sopenharmony_ci if (currentDate == nullptr) { 35e509ee18Sopenharmony_ci LOGE("get currentDate failed"); 36e509ee18Sopenharmony_ci return false; 37e509ee18Sopenharmony_ci } 38e509ee18Sopenharmony_ci 39e509ee18Sopenharmony_ci size_t timeResult = 0; 40e509ee18Sopenharmony_ci timeResult = strftime(date, size, "%Y%m%d", currentDate); 41e509ee18Sopenharmony_ci if (timeResult == 0) { 42e509ee18Sopenharmony_ci LOGE("format date failed"); 43e509ee18Sopenharmony_ci return false; 44e509ee18Sopenharmony_ci } 45e509ee18Sopenharmony_ci 46e509ee18Sopenharmony_ci tm* currentTime = localtime(&timep); 47e509ee18Sopenharmony_ci if (currentTime == nullptr) { 48e509ee18Sopenharmony_ci LOGE("get currentTime failed"); 49e509ee18Sopenharmony_ci return false; 50e509ee18Sopenharmony_ci } 51e509ee18Sopenharmony_ci 52e509ee18Sopenharmony_ci timeResult = strftime(tim, size, "%H%M%S", currentTime); 53e509ee18Sopenharmony_ci if (timeResult == 0) { 54e509ee18Sopenharmony_ci LOGE("format time failed"); 55e509ee18Sopenharmony_ci return false; 56e509ee18Sopenharmony_ci } 57e509ee18Sopenharmony_ci return true; 58e509ee18Sopenharmony_ci} 59e509ee18Sopenharmony_ci 60e509ee18Sopenharmony_cibool Utils::StrToUInt(const char *content, uint32_t *result) 61e509ee18Sopenharmony_ci{ 62e509ee18Sopenharmony_ci const int dec = 10; 63e509ee18Sopenharmony_ci char *endPtr = nullptr; 64e509ee18Sopenharmony_ci *result = std::strtoul(content, &endPtr, dec); 65e509ee18Sopenharmony_ci if (endPtr == content || *endPtr != '\0') { 66e509ee18Sopenharmony_ci return false; 67e509ee18Sopenharmony_ci } 68e509ee18Sopenharmony_ci return true; 69e509ee18Sopenharmony_ci} 70e509ee18Sopenharmony_ci 71e509ee18Sopenharmony_cibool Utils::StrToInt32(const std::string &str, int32_t &result) 72e509ee18Sopenharmony_ci{ 73e509ee18Sopenharmony_ci const int dec = 10; 74e509ee18Sopenharmony_ci char *endPtr = nullptr; 75e509ee18Sopenharmony_ci long long num = std::strtoll(str.c_str(), &endPtr, dec); 76e509ee18Sopenharmony_ci if (endPtr == str.c_str() || *endPtr != '\0' || num > INT_MAX || num < INT_MIN) { 77e509ee18Sopenharmony_ci return false; 78e509ee18Sopenharmony_ci } 79e509ee18Sopenharmony_ci result = static_cast<int32_t>(num); 80e509ee18Sopenharmony_ci return true; 81e509ee18Sopenharmony_ci} 82e509ee18Sopenharmony_ci 83e509ee18Sopenharmony_cibool Utils::StrToInt32(const std::string &str, std::optional<int32_t> &result) 84e509ee18Sopenharmony_ci{ 85e509ee18Sopenharmony_ci const int dec = 10; 86e509ee18Sopenharmony_ci char *endPtr = nullptr; 87e509ee18Sopenharmony_ci long long num = std::strtoll(str.c_str(), &endPtr, dec); 88e509ee18Sopenharmony_ci if (endPtr == str.c_str() || *endPtr != '\0' || num > INT_MAX || num < INT_MIN) { 89e509ee18Sopenharmony_ci return false; 90e509ee18Sopenharmony_ci } 91e509ee18Sopenharmony_ci result = static_cast<int32_t>(num); 92e509ee18Sopenharmony_ci return true; 93e509ee18Sopenharmony_ci} 94e509ee18Sopenharmony_ci 95e509ee18Sopenharmony_cistd::vector<std::string> Utils::SplitString(const std::string &str, const std::string &delimiter) 96e509ee18Sopenharmony_ci{ 97e509ee18Sopenharmony_ci std::size_t strIndex = 0; 98e509ee18Sopenharmony_ci std::vector<std::string> value; 99e509ee18Sopenharmony_ci std::size_t pos = str.find_first_of(delimiter, strIndex); 100e509ee18Sopenharmony_ci while ((pos < str.size()) && (pos > strIndex)) { 101e509ee18Sopenharmony_ci std::string subStr = str.substr(strIndex, pos - strIndex); 102e509ee18Sopenharmony_ci value.push_back(std::move(subStr)); 103e509ee18Sopenharmony_ci strIndex = pos; 104e509ee18Sopenharmony_ci strIndex = str.find_first_not_of(delimiter, strIndex); 105e509ee18Sopenharmony_ci pos = str.find_first_of(delimiter, strIndex); 106e509ee18Sopenharmony_ci } 107e509ee18Sopenharmony_ci if (pos > strIndex) { 108e509ee18Sopenharmony_ci std::string subStr = str.substr(strIndex, pos - strIndex); 109e509ee18Sopenharmony_ci if (!subStr.empty()) { 110e509ee18Sopenharmony_ci value.push_back(std::move(subStr)); 111e509ee18Sopenharmony_ci } 112e509ee18Sopenharmony_ci } 113e509ee18Sopenharmony_ci return value; 114e509ee18Sopenharmony_ci} 115e509ee18Sopenharmony_ci 116e509ee18Sopenharmony_cibool Utils::RealPath(const std::string &path, std::string &realPath, [[maybe_unused]] bool readOnly) 117e509ee18Sopenharmony_ci{ 118e509ee18Sopenharmony_ci realPath = ""; 119e509ee18Sopenharmony_ci if (path.empty() || path.size() > PATH_MAX) { 120e509ee18Sopenharmony_ci LOGE("arkdb: File path is illeage"); 121e509ee18Sopenharmony_ci return false; 122e509ee18Sopenharmony_ci } 123e509ee18Sopenharmony_ci char buffer[PATH_MAX] = { '\0' }; 124e509ee18Sopenharmony_ci#if defined(PANDA_TARGET_WINDOWS) 125e509ee18Sopenharmony_ci if (!_fullpath(buffer, path.c_str(), sizeof(buffer) - 1)) { 126e509ee18Sopenharmony_ci LOGE("arkdb: full path failure"); 127e509ee18Sopenharmony_ci return false; 128e509ee18Sopenharmony_ci } 129e509ee18Sopenharmony_ci#endif 130e509ee18Sopenharmony_ci#if defined(PANDA_TARGET_UNIX) 131e509ee18Sopenharmony_ci if (!realpath(path.c_str(), buffer)) { 132e509ee18Sopenharmony_ci // Maybe file does not exist. 133e509ee18Sopenharmony_ci if (!readOnly && errno == ENOENT) { 134e509ee18Sopenharmony_ci realPath = path; 135e509ee18Sopenharmony_ci return true; 136e509ee18Sopenharmony_ci } 137e509ee18Sopenharmony_ci LOGE("arkdb: realpath failure"); 138e509ee18Sopenharmony_ci return false; 139e509ee18Sopenharmony_ci } 140e509ee18Sopenharmony_ci#endif 141e509ee18Sopenharmony_ci realPath = std::string(buffer); 142e509ee18Sopenharmony_ci return true; 143e509ee18Sopenharmony_ci} 144e509ee18Sopenharmony_ci 145e509ee18Sopenharmony_cibool Utils::IsNumber(const std::string &str) 146e509ee18Sopenharmony_ci{ 147e509ee18Sopenharmony_ci std::string tmpStr = str; 148e509ee18Sopenharmony_ci tmpStr.erase(0, tmpStr.find_first_not_of("0")); 149e509ee18Sopenharmony_ci if (tmpStr.size() > 9) { //9: size of int 150e509ee18Sopenharmony_ci return false; 151e509ee18Sopenharmony_ci } 152e509ee18Sopenharmony_ci 153e509ee18Sopenharmony_ci for (char c : tmpStr) { 154e509ee18Sopenharmony_ci if (!std::isdigit(c)) { 155e509ee18Sopenharmony_ci return false; 156e509ee18Sopenharmony_ci } 157e509ee18Sopenharmony_ci } 158e509ee18Sopenharmony_ci return true; 159e509ee18Sopenharmony_ci} 160e509ee18Sopenharmony_ci 161e509ee18Sopenharmony_ci} // OHOS::ArkCompiler::Toolchain