15490a39dSopenharmony_ci/*
25490a39dSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
35490a39dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
45490a39dSopenharmony_ci * you may not use this file except in compliance with the License.
55490a39dSopenharmony_ci * You may obtain a copy of the License at
65490a39dSopenharmony_ci *
75490a39dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
85490a39dSopenharmony_ci *
95490a39dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
105490a39dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
115490a39dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125490a39dSopenharmony_ci * See the License for the specific language governing permissions and
135490a39dSopenharmony_ci * limitations under the License.
145490a39dSopenharmony_ci */
155490a39dSopenharmony_ci#include "string_util.h"
165490a39dSopenharmony_ci#include <fstream>
175490a39dSopenharmony_ci#include <iterator>
185490a39dSopenharmony_ci#include <ctime>
195490a39dSopenharmony_ci#include <sys/time.h>
205490a39dSopenharmony_ci#include <climits>
215490a39dSopenharmony_ci
225490a39dSopenharmony_ci#include "intell_voice_log.h"
235490a39dSopenharmony_ci
245490a39dSopenharmony_ci#undef LOG_TAG
255490a39dSopenharmony_ci#define LOG_TAG "StringUtil"
265490a39dSopenharmony_ci
275490a39dSopenharmony_ciusing namespace std;
285490a39dSopenharmony_ci
295490a39dSopenharmony_cinamespace OHOS {
305490a39dSopenharmony_cinamespace IntellVoiceUtils {
315490a39dSopenharmony_cistatic const char16_t DELIMITER_EQUAL_SIGN = '=';
325490a39dSopenharmony_ci
335490a39dSopenharmony_ci// #ABC#WWW##XYZ#---->vector[0]: ABC, vector[1]: WWW, vector[2]: XYZ
345490a39dSopenharmony_civoid StringUtil::Split(const string &str, const string &sep, vector<string> &res)
355490a39dSopenharmony_ci{
365490a39dSopenharmony_ci    res.clear();
375490a39dSopenharmony_ci    string tmpStr = str;
385490a39dSopenharmony_ci    unsigned int startPos = 0;
395490a39dSopenharmony_ci    size_t findPos = tmpStr.find(sep, startPos);
405490a39dSopenharmony_ci    while (findPos != string::npos) {
415490a39dSopenharmony_ci        if (findPos > startPos) {
425490a39dSopenharmony_ci            res.push_back(tmpStr.substr(static_cast<uint32_t>(startPos), static_cast<uint32_t>((findPos - startPos))));
435490a39dSopenharmony_ci        }
445490a39dSopenharmony_ci        startPos = findPos + sep.length();
455490a39dSopenharmony_ci        findPos = tmpStr.find(sep, startPos);
465490a39dSopenharmony_ci    }
475490a39dSopenharmony_ci
485490a39dSopenharmony_ci    if (startPos < tmpStr.length()) {
495490a39dSopenharmony_ci        res.push_back(tmpStr.substr(startPos));
505490a39dSopenharmony_ci    }
515490a39dSopenharmony_ci}
525490a39dSopenharmony_ci
535490a39dSopenharmony_ci// the func is called for AcousticPruner and AcousticPrunerExtra file
545490a39dSopenharmony_cistd::vector<string> StringUtil::StringSplit(string &str, const string &pattern)
555490a39dSopenharmony_ci{
565490a39dSopenharmony_ci    string::size_type pos;
575490a39dSopenharmony_ci    vector<string> result;
585490a39dSopenharmony_ci    str += pattern;
595490a39dSopenharmony_ci    unsigned int size = str.size();
605490a39dSopenharmony_ci
615490a39dSopenharmony_ci    for (unsigned int i = 0; i < size; i++) {
625490a39dSopenharmony_ci        pos = str.find(pattern, i);
635490a39dSopenharmony_ci        if (pos < size) {
645490a39dSopenharmony_ci            string s = str.substr(i, pos - i);
655490a39dSopenharmony_ci            result.push_back(s);
665490a39dSopenharmony_ci            i = pos + pattern.size() - 1;
675490a39dSopenharmony_ci        }
685490a39dSopenharmony_ci    }
695490a39dSopenharmony_ci
705490a39dSopenharmony_ci    return result;
715490a39dSopenharmony_ci}
725490a39dSopenharmony_ci
735490a39dSopenharmony_citemplate <typename T> string StringUtil::PrintVector(vector<T> &array, string &delimiter)
745490a39dSopenharmony_ci{
755490a39dSopenharmony_ci    if (array.empty()) {
765490a39dSopenharmony_ci        return "";
775490a39dSopenharmony_ci    }
785490a39dSopenharmony_ci
795490a39dSopenharmony_ci    ostringstream oss;
805490a39dSopenharmony_ci    copy(array.begin(), array.end() - 1, ostream_iterator<T>(oss, delimiter.c_str()));
815490a39dSopenharmony_ci    oss << array.back();
825490a39dSopenharmony_ci
835490a39dSopenharmony_ci    return oss.str();
845490a39dSopenharmony_ci}
855490a39dSopenharmony_ci
865490a39dSopenharmony_civoid StringUtil::TrimSpecialChars(string &str)
875490a39dSopenharmony_ci{
885490a39dSopenharmony_ci    size_t sp = 0;
895490a39dSopenharmony_ci
905490a39dSopenharmony_ci    while (sp < str.size()) {
915490a39dSopenharmony_ci        size_t ep = str.find_first_of(" \t\n\v\f\r,.:;!~@#$%^&*()`?/-+", sp);
925490a39dSopenharmony_ci        if (ep != string::npos) {
935490a39dSopenharmony_ci            str.erase(ep, 1);
945490a39dSopenharmony_ci            sp = ep;
955490a39dSopenharmony_ci        } else {
965490a39dSopenharmony_ci            break;
975490a39dSopenharmony_ci        }
985490a39dSopenharmony_ci    }
995490a39dSopenharmony_ci}
1005490a39dSopenharmony_ci
1015490a39dSopenharmony_ciuint32_t StringUtil::CalSubStrNum(const string &str, const string &subStr)
1025490a39dSopenharmony_ci{
1035490a39dSopenharmony_ci    if (subStr.size() == 0) {
1045490a39dSopenharmony_ci        return 0;
1055490a39dSopenharmony_ci    }
1065490a39dSopenharmony_ci    uint32_t count = 0;
1075490a39dSopenharmony_ci    string::size_type pos = 0;
1085490a39dSopenharmony_ci    pos = str.find(subStr, pos);
1095490a39dSopenharmony_ci    while (pos != string::npos) {
1105490a39dSopenharmony_ci        count++;
1115490a39dSopenharmony_ci        pos = pos + subStr.size();
1125490a39dSopenharmony_ci        pos = str.find(subStr, pos);
1135490a39dSopenharmony_ci    }
1145490a39dSopenharmony_ci
1155490a39dSopenharmony_ci    return count;
1165490a39dSopenharmony_ci}
1175490a39dSopenharmony_cibool StringUtil::SplitLineToPair(const std::string &line, std::string &first, std::string &second)
1185490a39dSopenharmony_ci{
1195490a39dSopenharmony_ci    if (line.empty()) {
1205490a39dSopenharmony_ci        INTELL_VOICE_LOG_ERROR("line is empty");
1215490a39dSopenharmony_ci        return false;
1225490a39dSopenharmony_ci    }
1235490a39dSopenharmony_ci    // pinyin:words
1245490a39dSopenharmony_ci    size_t pos = line.find(DELIMITER_EQUAL_SIGN);
1255490a39dSopenharmony_ci    // not find delimiter or it is the last char.
1265490a39dSopenharmony_ci    if (string::npos == pos || (line.length() - 1) == pos) {
1275490a39dSopenharmony_ci        return false;
1285490a39dSopenharmony_ci    }
1295490a39dSopenharmony_ci
1305490a39dSopenharmony_ci    first = line.substr(0, pos);
1315490a39dSopenharmony_ci    second = line.substr(pos + 1, string::npos);
1325490a39dSopenharmony_ci    // trim left and right spaces.
1335490a39dSopenharmony_ci    Trim(first);
1345490a39dSopenharmony_ci    Trim(second);
1355490a39dSopenharmony_ci
1365490a39dSopenharmony_ci    if (first.empty() || second.empty()) {
1375490a39dSopenharmony_ci        INTELL_VOICE_LOG_ERROR("line is invalid, first:%{public}s, second:%{public}s", first.c_str(), second.c_str());
1385490a39dSopenharmony_ci        return false;
1395490a39dSopenharmony_ci    }
1405490a39dSopenharmony_ci    return true;
1415490a39dSopenharmony_ci}
1425490a39dSopenharmony_ci
1435490a39dSopenharmony_cibool StringUtil::StringToInt(const std::string &str, int32_t &val)
1445490a39dSopenharmony_ci{
1455490a39dSopenharmony_ci    char *endStr = nullptr;
1465490a39dSopenharmony_ci    long int conVal = std::strtol(str.c_str(), &endStr, 10); // decimal
1475490a39dSopenharmony_ci    if (conVal == LONG_MAX || conVal == LONG_MIN || endStr == nullptr || endStr == str.c_str() || *endStr != '\0') {
1485490a39dSopenharmony_ci        return false;
1495490a39dSopenharmony_ci    }
1505490a39dSopenharmony_ci
1515490a39dSopenharmony_ci    val = static_cast<int32_t>(conVal);
1525490a39dSopenharmony_ci    return true;
1535490a39dSopenharmony_ci}
1545490a39dSopenharmony_ci}
1555490a39dSopenharmony_ci}
1565490a39dSopenharmony_ci
157