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