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