137a09cd7Sopenharmony_ci/*
237a09cd7Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
337a09cd7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
437a09cd7Sopenharmony_ci * you may not use this file except in compliance with the License.
537a09cd7Sopenharmony_ci * You may obtain a copy of the License at
637a09cd7Sopenharmony_ci *
737a09cd7Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
837a09cd7Sopenharmony_ci *
937a09cd7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1037a09cd7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1137a09cd7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1237a09cd7Sopenharmony_ci * See the License for the specific language governing permissions and
1337a09cd7Sopenharmony_ci * limitations under the License.
1437a09cd7Sopenharmony_ci */
1537a09cd7Sopenharmony_ci
1637a09cd7Sopenharmony_ci#include "string_operation.h"
1737a09cd7Sopenharmony_ci
1837a09cd7Sopenharmony_ci#include <cmath>
1937a09cd7Sopenharmony_ci#include <cstdint>
2037a09cd7Sopenharmony_ci#include <limits.h>
2137a09cd7Sopenharmony_ci#include <string>
2237a09cd7Sopenharmony_ci
2337a09cd7Sopenharmony_cinamespace OHOS {
2437a09cd7Sopenharmony_cinamespace PowerMgr {
2537a09cd7Sopenharmony_cinamespace {
2637a09cd7Sopenharmony_ciconst uint32_t COMPARE_SUCCESS = 0;
2737a09cd7Sopenharmony_ci}
2837a09cd7Sopenharmony_civoid StringOperation::SplitString(const std::string& str, std::vector<std::string>& ret, const std::string& sep)
2937a09cd7Sopenharmony_ci{
3037a09cd7Sopenharmony_ci    ClearAllSpace(str);
3137a09cd7Sopenharmony_ci    if (str.empty()) {
3237a09cd7Sopenharmony_ci        return;
3337a09cd7Sopenharmony_ci    }
3437a09cd7Sopenharmony_ci
3537a09cd7Sopenharmony_ci    std::string temp;
3637a09cd7Sopenharmony_ci    std::string::size_type begin = str.find_first_not_of(sep);
3737a09cd7Sopenharmony_ci    while (begin != std::string::npos) {
3837a09cd7Sopenharmony_ci        std::string::size_type pos = str.find(sep, begin);
3937a09cd7Sopenharmony_ci        if (pos != std::string::npos) {
4037a09cd7Sopenharmony_ci            temp = str.substr(begin, pos - begin);
4137a09cd7Sopenharmony_ci            begin = pos + sep.length();
4237a09cd7Sopenharmony_ci        } else {
4337a09cd7Sopenharmony_ci            temp = str.substr(begin);
4437a09cd7Sopenharmony_ci            begin = pos;
4537a09cd7Sopenharmony_ci        }
4637a09cd7Sopenharmony_ci
4737a09cd7Sopenharmony_ci        if (!temp.empty()) {
4837a09cd7Sopenharmony_ci            ret.push_back(temp);
4937a09cd7Sopenharmony_ci            temp.clear();
5037a09cd7Sopenharmony_ci        }
5137a09cd7Sopenharmony_ci    }
5237a09cd7Sopenharmony_ci    return;
5337a09cd7Sopenharmony_ci}
5437a09cd7Sopenharmony_ci
5537a09cd7Sopenharmony_civoid StringOperation::ClearAllSpace(std::string s)
5637a09cd7Sopenharmony_ci{
5737a09cd7Sopenharmony_ci    std::string::size_type index = 0;
5837a09cd7Sopenharmony_ci    if (!s.empty()) {
5937a09cd7Sopenharmony_ci        index = s.find(' ', index);
6037a09cd7Sopenharmony_ci        while (index != std::string::npos) {
6137a09cd7Sopenharmony_ci            s.erase(index, 1);
6237a09cd7Sopenharmony_ci        }
6337a09cd7Sopenharmony_ci    }
6437a09cd7Sopenharmony_ci}
6537a09cd7Sopenharmony_ci
6637a09cd7Sopenharmony_cibool StringOperation::Compare(const std::string& origin, const std::string& target)
6737a09cd7Sopenharmony_ci{
6837a09cd7Sopenharmony_ci    if (origin.compare(target) == COMPARE_SUCCESS) {
6937a09cd7Sopenharmony_ci        return true;
7037a09cd7Sopenharmony_ci    }
7137a09cd7Sopenharmony_ci    return false;
7237a09cd7Sopenharmony_ci}
7337a09cd7Sopenharmony_ci
7437a09cd7Sopenharmony_cibool StringOperation::Find(const std::string& origin, const std::string& target)
7537a09cd7Sopenharmony_ci{
7637a09cd7Sopenharmony_ci    if (origin.find(target) != std::string::npos) {
7737a09cd7Sopenharmony_ci        return true;
7837a09cd7Sopenharmony_ci    }
7937a09cd7Sopenharmony_ci    return false;
8037a09cd7Sopenharmony_ci}
8137a09cd7Sopenharmony_ci
8237a09cd7Sopenharmony_cibool StringOperation::StrToUint(const std::string& str, uint32_t& value)
8337a09cd7Sopenharmony_ci{
8437a09cd7Sopenharmony_ci    if (str.empty() || (!isdigit(str.front()) && (str.front() != '-'))) {
8537a09cd7Sopenharmony_ci        return false;
8637a09cd7Sopenharmony_ci    }
8737a09cd7Sopenharmony_ci
8837a09cd7Sopenharmony_ci    char* end = nullptr;
8937a09cd7Sopenharmony_ci    errno = 0;
9037a09cd7Sopenharmony_ci    auto addr = str.c_str();
9137a09cd7Sopenharmony_ci    auto result = strtoul(addr, &end, 10); // 10 means decimal
9237a09cd7Sopenharmony_ci    if ((end == addr) || (end[0] != '\0') || (errno == ERANGE) || (result >= ULONG_MAX)) {
9337a09cd7Sopenharmony_ci        return false;
9437a09cd7Sopenharmony_ci    }
9537a09cd7Sopenharmony_ci    value = static_cast<uint32_t>(result);
9637a09cd7Sopenharmony_ci    return true;
9737a09cd7Sopenharmony_ci}
9837a09cd7Sopenharmony_ci
9937a09cd7Sopenharmony_cibool StringOperation::StrToDouble(const std::string& str, double& value)
10037a09cd7Sopenharmony_ci{
10137a09cd7Sopenharmony_ci    if (str.empty()) {
10237a09cd7Sopenharmony_ci        return false;
10337a09cd7Sopenharmony_ci    }
10437a09cd7Sopenharmony_ci
10537a09cd7Sopenharmony_ci    char* end = nullptr;
10637a09cd7Sopenharmony_ci    errno = 0;
10737a09cd7Sopenharmony_ci    auto addr = str.c_str();
10837a09cd7Sopenharmony_ci    auto result = strtod(addr, &end);
10937a09cd7Sopenharmony_ci    if ((end == addr) || (end[0] != '\0') || (errno == ERANGE) || (result == HUGE_VAL)) {
11037a09cd7Sopenharmony_ci        return false;
11137a09cd7Sopenharmony_ci    }
11237a09cd7Sopenharmony_ci    value = result;
11337a09cd7Sopenharmony_ci    return true;
11437a09cd7Sopenharmony_ci}
11537a09cd7Sopenharmony_ci} // namespace PowerMgr
11637a09cd7Sopenharmony_ci} // namespace OHOS
117