11767c5feSopenharmony_ci// Copyright (C) 2011 The Libphonenumber Authors 21767c5feSopenharmony_ci// 31767c5feSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 41767c5feSopenharmony_ci// you may not use this file except in compliance with the License. 51767c5feSopenharmony_ci// You may obtain a copy of the License at 61767c5feSopenharmony_ci// 71767c5feSopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 81767c5feSopenharmony_ci// 91767c5feSopenharmony_ci// Unless required by applicable law or agreed to in writing, software 101767c5feSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 111767c5feSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121767c5feSopenharmony_ci// See the License for the specific language governing permissions and 131767c5feSopenharmony_ci// limitations under the License. 141767c5feSopenharmony_ci 151767c5feSopenharmony_ci// Author: Philippe Liard 161767c5feSopenharmony_ci 171767c5feSopenharmony_ci#include <algorithm> 181767c5feSopenharmony_ci#include <cassert> 191767c5feSopenharmony_ci#include <cstring> 201767c5feSopenharmony_ci#include <sstream> 211767c5feSopenharmony_ci 221767c5feSopenharmony_ci#include "phonenumbers/stringutil.h" 231767c5feSopenharmony_ci 241767c5feSopenharmony_ci#include "absl/strings/str_replace.h" 251767c5feSopenharmony_ci#include "absl/strings/substitute.h" 261767c5feSopenharmony_ci#include "absl/strings/match.h" 271767c5feSopenharmony_ci 281767c5feSopenharmony_cinamespace i18n { 291767c5feSopenharmony_cinamespace phonenumbers { 301767c5feSopenharmony_ci 311767c5feSopenharmony_ciusing std::equal; 321767c5feSopenharmony_ciusing std::stringstream; 331767c5feSopenharmony_ci 341767c5feSopenharmony_cistring operator+(const string& s, int n) { // NOLINT(runtime/string) 351767c5feSopenharmony_ci string result; 361767c5feSopenharmony_ci absl::StrAppend(&result,s,n); 371767c5feSopenharmony_ci return result; 381767c5feSopenharmony_ci} 391767c5feSopenharmony_ci 401767c5feSopenharmony_cistring SimpleItoa(int n) { 411767c5feSopenharmony_ci return absl::StrCat(n); 421767c5feSopenharmony_ci} 431767c5feSopenharmony_ci 441767c5feSopenharmony_cistring SimpleItoa(uint64 n) { 451767c5feSopenharmony_ci return absl::StrCat(n); 461767c5feSopenharmony_ci} 471767c5feSopenharmony_ci 481767c5feSopenharmony_cistring SimpleItoa(int64 n) { 491767c5feSopenharmony_ci return absl::StrCat(n); 501767c5feSopenharmony_ci} 511767c5feSopenharmony_ci 521767c5feSopenharmony_cibool HasPrefixString(const string& s, const string& prefix) { 531767c5feSopenharmony_ci return absl::StartsWith(s, prefix); 541767c5feSopenharmony_ci} 551767c5feSopenharmony_ci 561767c5feSopenharmony_cisize_t FindNth(const string& s, char c, int n) { 571767c5feSopenharmony_ci size_t pos = string::npos; 581767c5feSopenharmony_ci 591767c5feSopenharmony_ci for (int i = 0; i < n; ++i) { 601767c5feSopenharmony_ci pos = s.find_first_of(c, pos + 1); 611767c5feSopenharmony_ci if (pos == string::npos) { 621767c5feSopenharmony_ci break; 631767c5feSopenharmony_ci } 641767c5feSopenharmony_ci } 651767c5feSopenharmony_ci return pos; 661767c5feSopenharmony_ci} 671767c5feSopenharmony_ci 681767c5feSopenharmony_civoid SplitStringUsing(const string& s, char delimiter, 691767c5feSopenharmony_ci vector<string>* result) { 701767c5feSopenharmony_ci assert(result); 711767c5feSopenharmony_ci for (absl::string_view split_piece : absl::StrSplit( 721767c5feSopenharmony_ci s, absl::ByChar(delimiter), absl::SkipEmpty())) { 731767c5feSopenharmony_ci result->push_back(std::string(split_piece)); 741767c5feSopenharmony_ci } 751767c5feSopenharmony_ci} 761767c5feSopenharmony_ci 771767c5feSopenharmony_cibool TryStripPrefixString(const string& in, const string& prefix, string* out) { 781767c5feSopenharmony_ci assert(out); 791767c5feSopenharmony_ci const bool has_prefix = in.compare(0, prefix.length(), prefix) == 0; 801767c5feSopenharmony_ci out->assign(has_prefix ? in.substr(prefix.length()) : in); 811767c5feSopenharmony_ci 821767c5feSopenharmony_ci return has_prefix; 831767c5feSopenharmony_ci} 841767c5feSopenharmony_ci 851767c5feSopenharmony_cibool HasSuffixString(const string& s, const string& suffix) { 861767c5feSopenharmony_ci return absl::EndsWith(s, suffix); 871767c5feSopenharmony_ci} 881767c5feSopenharmony_ci 891767c5feSopenharmony_citemplate <typename T> 901767c5feSopenharmony_civoid GenericAtoi(const string& s, T* out) { 911767c5feSopenharmony_ci if (!absl::SimpleAtoi(s, out)) 921767c5feSopenharmony_ci *out = 0; 931767c5feSopenharmony_ci} 941767c5feSopenharmony_ci 951767c5feSopenharmony_civoid safe_strto32(const string& s, int32 *n) { 961767c5feSopenharmony_ci GenericAtoi(s, n); 971767c5feSopenharmony_ci} 981767c5feSopenharmony_ci 991767c5feSopenharmony_civoid safe_strtou64(const string& s, uint64 *n) { 1001767c5feSopenharmony_ci GenericAtoi(s, n); 1011767c5feSopenharmony_ci} 1021767c5feSopenharmony_ci 1031767c5feSopenharmony_civoid safe_strto64(const string& s, int64* n) { 1041767c5feSopenharmony_ci GenericAtoi(s, n); 1051767c5feSopenharmony_ci} 1061767c5feSopenharmony_ci 1071767c5feSopenharmony_civoid strrmm(string* s, const string& chars) { 1081767c5feSopenharmony_ci for (string::iterator it = s->begin(); it != s->end(); ) { 1091767c5feSopenharmony_ci const char current_char = *it; 1101767c5feSopenharmony_ci if (chars.find(current_char) != string::npos) { 1111767c5feSopenharmony_ci it = s->erase(it); 1121767c5feSopenharmony_ci } else { 1131767c5feSopenharmony_ci ++it; 1141767c5feSopenharmony_ci } 1151767c5feSopenharmony_ci } 1161767c5feSopenharmony_ci} 1171767c5feSopenharmony_ci 1181767c5feSopenharmony_ciint GlobalReplaceSubstring(const string& substring, 1191767c5feSopenharmony_ci const string& replacement, 1201767c5feSopenharmony_ci string* s) { 1211767c5feSopenharmony_ci return absl::StrReplaceAll({{substring, replacement}}, s);; 1221767c5feSopenharmony_ci} 1231767c5feSopenharmony_ci 1241767c5feSopenharmony_ci// StringHolder class 1251767c5feSopenharmony_ciStringHolder::StringHolder(const string& s) 1261767c5feSopenharmony_ci : absl::AlphaNum(s) 1271767c5feSopenharmony_ci{} 1281767c5feSopenharmony_ci 1291767c5feSopenharmony_ciStringHolder::StringHolder(const char* cp) 1301767c5feSopenharmony_ci : absl::AlphaNum(cp) 1311767c5feSopenharmony_ci{} 1321767c5feSopenharmony_ci 1331767c5feSopenharmony_ciStringHolder::StringHolder(uint64 n) 1341767c5feSopenharmony_ci : absl::AlphaNum(n) 1351767c5feSopenharmony_ci{} 1361767c5feSopenharmony_ci 1371767c5feSopenharmony_ciStringHolder::~StringHolder() {} 1381767c5feSopenharmony_ci 1391767c5feSopenharmony_ci// StrCat 1401767c5feSopenharmony_ci 1411767c5feSopenharmony_ci// Implements s += sh; (s: string, sh: StringHolder) 1421767c5feSopenharmony_cistring& operator+=(string& lhs, const StringHolder& rhs) { 1431767c5feSopenharmony_ci absl::string_view s = rhs.GetString();; 1441767c5feSopenharmony_ci if (s.size() != 0) { 1451767c5feSopenharmony_ci lhs += s.data(); 1461767c5feSopenharmony_ci } else { 1471767c5feSopenharmony_ci const char* const cs = rhs.GetCString(); 1481767c5feSopenharmony_ci if (cs) 1491767c5feSopenharmony_ci lhs.append(cs, rhs.Length()); 1501767c5feSopenharmony_ci } 1511767c5feSopenharmony_ci return lhs; 1521767c5feSopenharmony_ci} 1531767c5feSopenharmony_ci 1541767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2) { 1551767c5feSopenharmony_ci return absl::StrCat(s1, s2); 1561767c5feSopenharmony_ci} 1571767c5feSopenharmony_ci 1581767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 1591767c5feSopenharmony_ci const StringHolder& s3) { 1601767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3); 1611767c5feSopenharmony_ci} 1621767c5feSopenharmony_ci 1631767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 1641767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4) { 1651767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4); 1661767c5feSopenharmony_ci} 1671767c5feSopenharmony_ci 1681767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 1691767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 1701767c5feSopenharmony_ci const StringHolder& s5) { 1711767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5); 1721767c5feSopenharmony_ci} 1731767c5feSopenharmony_ci 1741767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 1751767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 1761767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6) { 1771767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6); 1781767c5feSopenharmony_ci} 1791767c5feSopenharmony_ci 1801767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 1811767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 1821767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 1831767c5feSopenharmony_ci const StringHolder& s7) { 1841767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7); 1851767c5feSopenharmony_ci} 1861767c5feSopenharmony_ci 1871767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 1881767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 1891767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 1901767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8) { 1911767c5feSopenharmony_ci string result; 1921767c5feSopenharmony_ci result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + 1931767c5feSopenharmony_ci s5.Length() + s6.Length() + s7.Length() + s8.Length() + 1); 1941767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8); 1951767c5feSopenharmony_ci} 1961767c5feSopenharmony_ci 1971767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 1981767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 1991767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 2001767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8, 2011767c5feSopenharmony_ci const StringHolder& s9) { 2021767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9); 2031767c5feSopenharmony_ci} 2041767c5feSopenharmony_ci 2051767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 2061767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 2071767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 2081767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8, 2091767c5feSopenharmony_ci const StringHolder& s9, const StringHolder& s10, 2101767c5feSopenharmony_ci const StringHolder& s11) { 2111767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11); 2121767c5feSopenharmony_ci} 2131767c5feSopenharmony_ci 2141767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 2151767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 2161767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 2171767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8, 2181767c5feSopenharmony_ci const StringHolder& s9, const StringHolder& s10, 2191767c5feSopenharmony_ci const StringHolder& s11, const StringHolder& s12) { 2201767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12); 2211767c5feSopenharmony_ci} 2221767c5feSopenharmony_ci 2231767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 2241767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 2251767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 2261767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8, 2271767c5feSopenharmony_ci const StringHolder& s9, const StringHolder& s10, 2281767c5feSopenharmony_ci const StringHolder& s11, const StringHolder& s12, 2291767c5feSopenharmony_ci const StringHolder& s13) { 2301767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, 2311767c5feSopenharmony_ci s13); 2321767c5feSopenharmony_ci} 2331767c5feSopenharmony_ci 2341767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 2351767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 2361767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 2371767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8, 2381767c5feSopenharmony_ci const StringHolder& s9, const StringHolder& s10, 2391767c5feSopenharmony_ci const StringHolder& s11, const StringHolder& s12, 2401767c5feSopenharmony_ci const StringHolder& s13, const StringHolder& s14) { 2411767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, 2421767c5feSopenharmony_ci s13, s14); 2431767c5feSopenharmony_ci} 2441767c5feSopenharmony_ci 2451767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 2461767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 2471767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 2481767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8, 2491767c5feSopenharmony_ci const StringHolder& s9, const StringHolder& s10, 2501767c5feSopenharmony_ci const StringHolder& s11, const StringHolder& s12, 2511767c5feSopenharmony_ci const StringHolder& s13, const StringHolder& s14, 2521767c5feSopenharmony_ci const StringHolder& s15) { 2531767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, 2541767c5feSopenharmony_ci s13, s14, s15); 2551767c5feSopenharmony_ci} 2561767c5feSopenharmony_ci 2571767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2, 2581767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 2591767c5feSopenharmony_ci const StringHolder& s5, const StringHolder& s6, 2601767c5feSopenharmony_ci const StringHolder& s7, const StringHolder& s8, 2611767c5feSopenharmony_ci const StringHolder& s9, const StringHolder& s10, 2621767c5feSopenharmony_ci const StringHolder& s11, const StringHolder& s12, 2631767c5feSopenharmony_ci const StringHolder& s13, const StringHolder& s14, 2641767c5feSopenharmony_ci const StringHolder& s15, const StringHolder& s16) { 2651767c5feSopenharmony_ci return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, 2661767c5feSopenharmony_ci s13, s14, s15, s16); 2671767c5feSopenharmony_ci} 2681767c5feSopenharmony_ci 2691767c5feSopenharmony_ci// StrAppend 2701767c5feSopenharmony_ci 2711767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1) { 2721767c5feSopenharmony_ci absl::StrAppend(dest, s1); 2731767c5feSopenharmony_ci} 2741767c5feSopenharmony_ci 2751767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2) { 2761767c5feSopenharmony_ci absl::StrAppend(dest, s1, s2); 2771767c5feSopenharmony_ci} 2781767c5feSopenharmony_ci 2791767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2, 2801767c5feSopenharmony_ci const StringHolder& s3) { 2811767c5feSopenharmony_ci absl::StrAppend(dest, s1, s2, s3); 2821767c5feSopenharmony_ci} 2831767c5feSopenharmony_ci 2841767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2, 2851767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4) { 2861767c5feSopenharmony_ci absl::StrAppend(dest, s1, s2, s3, s4); 2871767c5feSopenharmony_ci} 2881767c5feSopenharmony_ci 2891767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2, 2901767c5feSopenharmony_ci const StringHolder& s3, const StringHolder& s4, 2911767c5feSopenharmony_ci const StringHolder& s5) { 2921767c5feSopenharmony_ci absl::StrAppend(dest, s1, s2, s3, s4, s5); 2931767c5feSopenharmony_ci} 2941767c5feSopenharmony_ci 2951767c5feSopenharmony_ci} // namespace phonenumbers 2961767c5feSopenharmony_ci} // namespace i18n 297