xref: /aosp_15_r20/external/cronet/base/strings/string_util_win.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util_win.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <optional>
8*6777b538SAndroid Build Coastguard Worker #include <string_view>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util_impl_helpers.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace base {
14*6777b538SAndroid Build Coastguard Worker 
IsStringASCII(std::wstring_view str)15*6777b538SAndroid Build Coastguard Worker bool IsStringASCII(std::wstring_view str) {
16*6777b538SAndroid Build Coastguard Worker   return internal::DoIsStringASCII(str.data(), str.length());
17*6777b538SAndroid Build Coastguard Worker }
18*6777b538SAndroid Build Coastguard Worker 
ToLowerASCII(std::wstring_view str)19*6777b538SAndroid Build Coastguard Worker std::wstring ToLowerASCII(std::wstring_view str) {
20*6777b538SAndroid Build Coastguard Worker   return internal::ToLowerASCIIImpl(str);
21*6777b538SAndroid Build Coastguard Worker }
22*6777b538SAndroid Build Coastguard Worker 
ToUpperASCII(std::wstring_view str)23*6777b538SAndroid Build Coastguard Worker std::wstring ToUpperASCII(std::wstring_view str) {
24*6777b538SAndroid Build Coastguard Worker   return internal::ToUpperASCIIImpl(str);
25*6777b538SAndroid Build Coastguard Worker }
26*6777b538SAndroid Build Coastguard Worker 
CompareCaseInsensitiveASCII(std::wstring_view a,std::wstring_view b)27*6777b538SAndroid Build Coastguard Worker int CompareCaseInsensitiveASCII(std::wstring_view a, std::wstring_view b) {
28*6777b538SAndroid Build Coastguard Worker   return internal::CompareCaseInsensitiveASCIIT(a, b);
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker 
RemoveChars(std::wstring_view input,std::wstring_view remove_chars,std::wstring * output)31*6777b538SAndroid Build Coastguard Worker bool RemoveChars(std::wstring_view input,
32*6777b538SAndroid Build Coastguard Worker                  std::wstring_view remove_chars,
33*6777b538SAndroid Build Coastguard Worker                  std::wstring* output) {
34*6777b538SAndroid Build Coastguard Worker   return internal::ReplaceCharsT(input, remove_chars, std::wstring_view(),
35*6777b538SAndroid Build Coastguard Worker                                  output);
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker 
ReplaceChars(std::wstring_view input,std::wstring_view replace_chars,std::wstring_view replace_with,std::wstring * output)38*6777b538SAndroid Build Coastguard Worker bool ReplaceChars(std::wstring_view input,
39*6777b538SAndroid Build Coastguard Worker                   std::wstring_view replace_chars,
40*6777b538SAndroid Build Coastguard Worker                   std::wstring_view replace_with,
41*6777b538SAndroid Build Coastguard Worker                   std::wstring* output) {
42*6777b538SAndroid Build Coastguard Worker   return internal::ReplaceCharsT(input, replace_chars, replace_with, output);
43*6777b538SAndroid Build Coastguard Worker }
44*6777b538SAndroid Build Coastguard Worker 
TrimString(std::wstring_view input,std::wstring_view trim_chars,std::wstring * output)45*6777b538SAndroid Build Coastguard Worker bool TrimString(std::wstring_view input,
46*6777b538SAndroid Build Coastguard Worker                 std::wstring_view trim_chars,
47*6777b538SAndroid Build Coastguard Worker                 std::wstring* output) {
48*6777b538SAndroid Build Coastguard Worker   return internal::TrimStringT(input, trim_chars, TRIM_ALL, output) !=
49*6777b538SAndroid Build Coastguard Worker          TRIM_NONE;
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker 
TrimString(std::wstring_view input,std::wstring_view trim_chars,TrimPositions positions)52*6777b538SAndroid Build Coastguard Worker std::wstring_view TrimString(std::wstring_view input,
53*6777b538SAndroid Build Coastguard Worker                              std::wstring_view trim_chars,
54*6777b538SAndroid Build Coastguard Worker                              TrimPositions positions) {
55*6777b538SAndroid Build Coastguard Worker   return internal::TrimStringPieceT(input, trim_chars, positions);
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker 
TrimWhitespace(std::wstring_view input,TrimPositions positions,std::wstring * output)58*6777b538SAndroid Build Coastguard Worker TrimPositions TrimWhitespace(std::wstring_view input,
59*6777b538SAndroid Build Coastguard Worker                              TrimPositions positions,
60*6777b538SAndroid Build Coastguard Worker                              std::wstring* output) {
61*6777b538SAndroid Build Coastguard Worker   return internal::TrimStringT(input, std::wstring_view(kWhitespaceWide),
62*6777b538SAndroid Build Coastguard Worker                                positions, output);
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker 
TrimWhitespace(std::wstring_view input,TrimPositions positions)65*6777b538SAndroid Build Coastguard Worker std::wstring_view TrimWhitespace(std::wstring_view input,
66*6777b538SAndroid Build Coastguard Worker                                  TrimPositions positions) {
67*6777b538SAndroid Build Coastguard Worker   return internal::TrimStringPieceT(input, std::wstring_view(kWhitespaceWide),
68*6777b538SAndroid Build Coastguard Worker                                     positions);
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker 
CollapseWhitespace(std::wstring_view text,bool trim_sequences_with_line_breaks)71*6777b538SAndroid Build Coastguard Worker std::wstring CollapseWhitespace(std::wstring_view text,
72*6777b538SAndroid Build Coastguard Worker                                 bool trim_sequences_with_line_breaks) {
73*6777b538SAndroid Build Coastguard Worker   return internal::CollapseWhitespaceT(text, trim_sequences_with_line_breaks);
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker 
ContainsOnlyChars(std::wstring_view input,std::wstring_view characters)76*6777b538SAndroid Build Coastguard Worker bool ContainsOnlyChars(std::wstring_view input, std::wstring_view characters) {
77*6777b538SAndroid Build Coastguard Worker   return input.find_first_not_of(characters) == StringPiece::npos;
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker 
EqualsASCII(std::wstring_view str,StringPiece ascii)80*6777b538SAndroid Build Coastguard Worker bool EqualsASCII(std::wstring_view str, StringPiece ascii) {
81*6777b538SAndroid Build Coastguard Worker   return ranges::equal(ascii, str);
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker 
StartsWith(std::wstring_view str,std::wstring_view search_for,CompareCase case_sensitivity)84*6777b538SAndroid Build Coastguard Worker bool StartsWith(std::wstring_view str,
85*6777b538SAndroid Build Coastguard Worker                 std::wstring_view search_for,
86*6777b538SAndroid Build Coastguard Worker                 CompareCase case_sensitivity) {
87*6777b538SAndroid Build Coastguard Worker   return internal::StartsWithT(str, search_for, case_sensitivity);
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker 
EndsWith(std::wstring_view str,std::wstring_view search_for,CompareCase case_sensitivity)90*6777b538SAndroid Build Coastguard Worker bool EndsWith(std::wstring_view str,
91*6777b538SAndroid Build Coastguard Worker               std::wstring_view search_for,
92*6777b538SAndroid Build Coastguard Worker               CompareCase case_sensitivity) {
93*6777b538SAndroid Build Coastguard Worker   return internal::EndsWithT(str, search_for, case_sensitivity);
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker 
ReplaceFirstSubstringAfterOffset(std::wstring * str,size_t start_offset,std::wstring_view find_this,std::wstring_view replace_with)96*6777b538SAndroid Build Coastguard Worker void ReplaceFirstSubstringAfterOffset(std::wstring* str,
97*6777b538SAndroid Build Coastguard Worker                                       size_t start_offset,
98*6777b538SAndroid Build Coastguard Worker                                       std::wstring_view find_this,
99*6777b538SAndroid Build Coastguard Worker                                       std::wstring_view replace_with) {
100*6777b538SAndroid Build Coastguard Worker   internal::DoReplaceMatchesAfterOffset(
101*6777b538SAndroid Build Coastguard Worker       str, start_offset, internal::MakeSubstringMatcher(find_this),
102*6777b538SAndroid Build Coastguard Worker       replace_with, internal::ReplaceType::REPLACE_FIRST);
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker 
ReplaceSubstringsAfterOffset(std::wstring * str,size_t start_offset,std::wstring_view find_this,std::wstring_view replace_with)105*6777b538SAndroid Build Coastguard Worker void ReplaceSubstringsAfterOffset(std::wstring* str,
106*6777b538SAndroid Build Coastguard Worker                                   size_t start_offset,
107*6777b538SAndroid Build Coastguard Worker                                   std::wstring_view find_this,
108*6777b538SAndroid Build Coastguard Worker                                   std::wstring_view replace_with) {
109*6777b538SAndroid Build Coastguard Worker   internal::DoReplaceMatchesAfterOffset(
110*6777b538SAndroid Build Coastguard Worker       str, start_offset, internal::MakeSubstringMatcher(find_this),
111*6777b538SAndroid Build Coastguard Worker       replace_with, internal::ReplaceType::REPLACE_ALL);
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker 
WriteInto(std::wstring * str,size_t length_with_null)114*6777b538SAndroid Build Coastguard Worker wchar_t* WriteInto(std::wstring* str, size_t length_with_null) {
115*6777b538SAndroid Build Coastguard Worker   return internal::WriteIntoT(str, length_with_null);
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker 
JoinString(span<const std::wstring> parts,std::wstring_view separator)118*6777b538SAndroid Build Coastguard Worker std::wstring JoinString(span<const std::wstring> parts,
119*6777b538SAndroid Build Coastguard Worker                         std::wstring_view separator) {
120*6777b538SAndroid Build Coastguard Worker   return internal::JoinStringT(parts, separator);
121*6777b538SAndroid Build Coastguard Worker }
122*6777b538SAndroid Build Coastguard Worker 
JoinString(span<const std::wstring_view> parts,std::wstring_view separator)123*6777b538SAndroid Build Coastguard Worker std::wstring JoinString(span<const std::wstring_view> parts,
124*6777b538SAndroid Build Coastguard Worker                         std::wstring_view separator) {
125*6777b538SAndroid Build Coastguard Worker   return internal::JoinStringT(parts, separator);
126*6777b538SAndroid Build Coastguard Worker }
127*6777b538SAndroid Build Coastguard Worker 
JoinString(std::initializer_list<std::wstring_view> parts,std::wstring_view separator)128*6777b538SAndroid Build Coastguard Worker std::wstring JoinString(std::initializer_list<std::wstring_view> parts,
129*6777b538SAndroid Build Coastguard Worker                         std::wstring_view separator) {
130*6777b538SAndroid Build Coastguard Worker   return internal::JoinStringT(parts, separator);
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker 
ReplaceStringPlaceholders(std::wstring_view format_string,const std::vector<std::wstring> & subst,std::vector<size_t> * offsets)133*6777b538SAndroid Build Coastguard Worker std::wstring ReplaceStringPlaceholders(std::wstring_view format_string,
134*6777b538SAndroid Build Coastguard Worker                                        const std::vector<std::wstring>& subst,
135*6777b538SAndroid Build Coastguard Worker                                        std::vector<size_t>* offsets) {
136*6777b538SAndroid Build Coastguard Worker   std::optional<std::wstring> replacement =
137*6777b538SAndroid Build Coastguard Worker       internal::DoReplaceStringPlaceholders(
138*6777b538SAndroid Build Coastguard Worker           format_string, subst,
139*6777b538SAndroid Build Coastguard Worker           /*placeholder_prefix*/ L'$',
140*6777b538SAndroid Build Coastguard Worker           /*should_escape_multiple_placeholder_prefixes*/ true,
141*6777b538SAndroid Build Coastguard Worker           /*is_strict_mode*/ false, offsets);
142*6777b538SAndroid Build Coastguard Worker 
143*6777b538SAndroid Build Coastguard Worker   DCHECK(replacement);
144*6777b538SAndroid Build Coastguard Worker   return replacement.value();
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker }  // namespace base
148