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