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