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