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