xref: /aosp_15_r20/external/cronet/base/strings/string_util_win.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 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 #ifndef BASE_STRINGS_STRING_UTIL_WIN_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_STRINGS_STRING_UTIL_WIN_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdarg.h>
9*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
10*6777b538SAndroid Build Coastguard Worker #include <stdio.h>
11*6777b538SAndroid Build Coastguard Worker #include <string.h>
12*6777b538SAndroid Build Coastguard Worker #include <wchar.h>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include <string>
15*6777b538SAndroid Build Coastguard Worker #include <string_view>
16*6777b538SAndroid Build Coastguard Worker #include <vector>
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker namespace base {
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker // Chromium code style is to not use malloc'd strings; this is only for use
26*6777b538SAndroid Build Coastguard Worker // for interaction with APIs that require it.
strdup(const char * str)27*6777b538SAndroid Build Coastguard Worker inline char* strdup(const char* str) {
28*6777b538SAndroid Build Coastguard Worker   return _strdup(str);
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker 
vsnprintf(char * buffer,size_t size,const char * format,va_list arguments)31*6777b538SAndroid Build Coastguard Worker inline int vsnprintf(char* buffer, size_t size,
32*6777b538SAndroid Build Coastguard Worker                      const char* format, va_list arguments) {
33*6777b538SAndroid Build Coastguard Worker   int length = vsnprintf_s(buffer, size, size - 1, format, arguments);
34*6777b538SAndroid Build Coastguard Worker   if (length < 0)
35*6777b538SAndroid Build Coastguard Worker     return _vscprintf(format, arguments);
36*6777b538SAndroid Build Coastguard Worker   return length;
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker 
vswprintf(wchar_t * buffer,size_t size,const wchar_t * format,va_list arguments)39*6777b538SAndroid Build Coastguard Worker inline int vswprintf(wchar_t* buffer, size_t size,
40*6777b538SAndroid Build Coastguard Worker                      const wchar_t* format, va_list arguments) {
41*6777b538SAndroid Build Coastguard Worker   DCHECK(IsWprintfFormatPortable(format));
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   int length = _vsnwprintf_s(buffer, size, size - 1, format, arguments);
44*6777b538SAndroid Build Coastguard Worker   if (length < 0)
45*6777b538SAndroid Build Coastguard Worker     return _vscwprintf(format, arguments);
46*6777b538SAndroid Build Coastguard Worker   return length;
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker // Utility functions to access the underlying string buffer as a wide char
50*6777b538SAndroid Build Coastguard Worker // pointer.
51*6777b538SAndroid Build Coastguard Worker //
52*6777b538SAndroid Build Coastguard Worker // Note: These functions violate strict aliasing when char16_t and wchar_t are
53*6777b538SAndroid Build Coastguard Worker // unrelated types. We thus pass -fno-strict-aliasing to the compiler on
54*6777b538SAndroid Build Coastguard Worker // non-Windows platforms [1], and rely on it being off in Clang's CL mode [2].
55*6777b538SAndroid Build Coastguard Worker //
56*6777b538SAndroid Build Coastguard Worker // [1] https://crrev.com/b9a0976622/build/config/compiler/BUILD.gn#244
57*6777b538SAndroid Build Coastguard Worker // [2]
58*6777b538SAndroid Build Coastguard Worker // https://github.com/llvm/llvm-project/blob/1e28a66/clang/lib/Driver/ToolChains/Clang.cpp#L3949
as_writable_wcstr(char16_t * str)59*6777b538SAndroid Build Coastguard Worker inline wchar_t* as_writable_wcstr(char16_t* str) {
60*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<wchar_t*>(str);
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker 
as_writable_wcstr(std::u16string & str)63*6777b538SAndroid Build Coastguard Worker inline wchar_t* as_writable_wcstr(std::u16string& str) {
64*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<wchar_t*>(data(str));
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker 
as_wcstr(const char16_t * str)67*6777b538SAndroid Build Coastguard Worker inline const wchar_t* as_wcstr(const char16_t* str) {
68*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<const wchar_t*>(str);
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker 
as_wcstr(StringPiece16 str)71*6777b538SAndroid Build Coastguard Worker inline const wchar_t* as_wcstr(StringPiece16 str) {
72*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<const wchar_t*>(str.data());
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker // Utility functions to access the underlying string buffer as a char16_t
76*6777b538SAndroid Build Coastguard Worker // pointer.
as_writable_u16cstr(wchar_t * str)77*6777b538SAndroid Build Coastguard Worker inline char16_t* as_writable_u16cstr(wchar_t* str) {
78*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<char16_t*>(str);
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker 
as_writable_u16cstr(std::wstring & str)81*6777b538SAndroid Build Coastguard Worker inline char16_t* as_writable_u16cstr(std::wstring& str) {
82*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<char16_t*>(data(str));
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker 
as_u16cstr(const wchar_t * str)85*6777b538SAndroid Build Coastguard Worker inline const char16_t* as_u16cstr(const wchar_t* str) {
86*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<const char16_t*>(str);
87*6777b538SAndroid Build Coastguard Worker }
88*6777b538SAndroid Build Coastguard Worker 
as_u16cstr(std::wstring_view str)89*6777b538SAndroid Build Coastguard Worker inline const char16_t* as_u16cstr(std::wstring_view str) {
90*6777b538SAndroid Build Coastguard Worker   return reinterpret_cast<const char16_t*>(str.data());
91*6777b538SAndroid Build Coastguard Worker }
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker // Utility functions to convert between std::wstring_view and
94*6777b538SAndroid Build Coastguard Worker // base::StringPiece16.
AsWStringView(StringPiece16 str)95*6777b538SAndroid Build Coastguard Worker inline std::wstring_view AsWStringView(StringPiece16 str) {
96*6777b538SAndroid Build Coastguard Worker   return std::wstring_view(as_wcstr(str.data()), str.size());
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker 
AsStringPiece16(std::wstring_view str)99*6777b538SAndroid Build Coastguard Worker inline StringPiece16 AsStringPiece16(std::wstring_view str) {
100*6777b538SAndroid Build Coastguard Worker   return StringPiece16(as_u16cstr(str.data()), str.size());
101*6777b538SAndroid Build Coastguard Worker }
102*6777b538SAndroid Build Coastguard Worker 
AsWString(StringPiece16 str)103*6777b538SAndroid Build Coastguard Worker inline std::wstring AsWString(StringPiece16 str) {
104*6777b538SAndroid Build Coastguard Worker   return std::wstring(as_wcstr(str.data()), str.size());
105*6777b538SAndroid Build Coastguard Worker }
106*6777b538SAndroid Build Coastguard Worker 
AsString16(std::wstring_view str)107*6777b538SAndroid Build Coastguard Worker inline std::u16string AsString16(std::wstring_view str) {
108*6777b538SAndroid Build Coastguard Worker   return std::u16string(as_u16cstr(str.data()), str.size());
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker // The following section contains overloads of the cross-platform APIs for
112*6777b538SAndroid Build Coastguard Worker // std::wstring and std::wstring_view.
113*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool IsStringASCII(std::wstring_view str);
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring ToLowerASCII(std::wstring_view str);
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring ToUpperASCII(std::wstring_view str);
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker BASE_EXPORT int CompareCaseInsensitiveASCII(std::wstring_view a,
120*6777b538SAndroid Build Coastguard Worker                                             std::wstring_view b);
121*6777b538SAndroid Build Coastguard Worker 
EqualsCaseInsensitiveASCII(std::wstring_view a,std::wstring_view b)122*6777b538SAndroid Build Coastguard Worker inline bool EqualsCaseInsensitiveASCII(std::wstring_view a,
123*6777b538SAndroid Build Coastguard Worker                                        std::wstring_view b) {
124*6777b538SAndroid Build Coastguard Worker   return internal::EqualsCaseInsensitiveASCIIT(a, b);
125*6777b538SAndroid Build Coastguard Worker }
EqualsCaseInsensitiveASCII(std::wstring_view a,StringPiece b)126*6777b538SAndroid Build Coastguard Worker inline bool EqualsCaseInsensitiveASCII(std::wstring_view a, StringPiece b) {
127*6777b538SAndroid Build Coastguard Worker   return internal::EqualsCaseInsensitiveASCIIT(a, b);
128*6777b538SAndroid Build Coastguard Worker }
EqualsCaseInsensitiveASCII(StringPiece a,std::wstring_view b)129*6777b538SAndroid Build Coastguard Worker inline bool EqualsCaseInsensitiveASCII(StringPiece a, std::wstring_view b) {
130*6777b538SAndroid Build Coastguard Worker   return internal::EqualsCaseInsensitiveASCIIT(a, b);
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool RemoveChars(std::wstring_view input,
134*6777b538SAndroid Build Coastguard Worker                              std::wstring_view remove_chars,
135*6777b538SAndroid Build Coastguard Worker                              std::wstring* output);
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool ReplaceChars(std::wstring_view input,
138*6777b538SAndroid Build Coastguard Worker                               std::wstring_view replace_chars,
139*6777b538SAndroid Build Coastguard Worker                               std::wstring_view replace_with,
140*6777b538SAndroid Build Coastguard Worker                               std::wstring* output);
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool TrimString(std::wstring_view input,
143*6777b538SAndroid Build Coastguard Worker                             std::wstring_view trim_chars,
144*6777b538SAndroid Build Coastguard Worker                             std::wstring* output);
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring_view TrimString(std::wstring_view input,
147*6777b538SAndroid Build Coastguard Worker                                          std::wstring_view trim_chars,
148*6777b538SAndroid Build Coastguard Worker                                          TrimPositions positions);
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker BASE_EXPORT TrimPositions TrimWhitespace(std::wstring_view input,
151*6777b538SAndroid Build Coastguard Worker                                          TrimPositions positions,
152*6777b538SAndroid Build Coastguard Worker                                          std::wstring* output);
153*6777b538SAndroid Build Coastguard Worker 
154*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring_view TrimWhitespace(std::wstring_view input,
155*6777b538SAndroid Build Coastguard Worker                                              TrimPositions positions);
156*6777b538SAndroid Build Coastguard Worker 
157*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring CollapseWhitespace(
158*6777b538SAndroid Build Coastguard Worker     std::wstring_view text,
159*6777b538SAndroid Build Coastguard Worker     bool trim_sequences_with_line_breaks);
160*6777b538SAndroid Build Coastguard Worker 
161*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool ContainsOnlyChars(std::wstring_view input,
162*6777b538SAndroid Build Coastguard Worker                                    std::wstring_view characters);
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool EqualsASCII(StringPiece16 str, StringPiece ascii);
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool StartsWith(
167*6777b538SAndroid Build Coastguard Worker     std::wstring_view str,
168*6777b538SAndroid Build Coastguard Worker     std::wstring_view search_for,
169*6777b538SAndroid Build Coastguard Worker     CompareCase case_sensitivity = CompareCase::SENSITIVE);
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool EndsWith(
172*6777b538SAndroid Build Coastguard Worker     std::wstring_view str,
173*6777b538SAndroid Build Coastguard Worker     std::wstring_view search_for,
174*6777b538SAndroid Build Coastguard Worker     CompareCase case_sensitivity = CompareCase::SENSITIVE);
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void ReplaceFirstSubstringAfterOffset(
177*6777b538SAndroid Build Coastguard Worker     std::wstring* str,
178*6777b538SAndroid Build Coastguard Worker     size_t start_offset,
179*6777b538SAndroid Build Coastguard Worker     std::wstring_view find_this,
180*6777b538SAndroid Build Coastguard Worker     std::wstring_view replace_with);
181*6777b538SAndroid Build Coastguard Worker 
182*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void ReplaceSubstringsAfterOffset(std::wstring* str,
183*6777b538SAndroid Build Coastguard Worker                                               size_t start_offset,
184*6777b538SAndroid Build Coastguard Worker                                               std::wstring_view find_this,
185*6777b538SAndroid Build Coastguard Worker                                               std::wstring_view replace_with);
186*6777b538SAndroid Build Coastguard Worker 
187*6777b538SAndroid Build Coastguard Worker BASE_EXPORT wchar_t* WriteInto(std::wstring* str, size_t length_with_null);
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring JoinString(span<const std::wstring> parts,
190*6777b538SAndroid Build Coastguard Worker                                     std::wstring_view separator);
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring JoinString(span<const std::wstring_view> parts,
193*6777b538SAndroid Build Coastguard Worker                                     std::wstring_view separator);
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring JoinString(
196*6777b538SAndroid Build Coastguard Worker     std::initializer_list<std::wstring_view> parts,
197*6777b538SAndroid Build Coastguard Worker     std::wstring_view separator);
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::wstring ReplaceStringPlaceholders(
200*6777b538SAndroid Build Coastguard Worker     std::wstring_view format_string,
201*6777b538SAndroid Build Coastguard Worker     const std::vector<std::wstring>& subst,
202*6777b538SAndroid Build Coastguard Worker     std::vector<size_t>* offsets);
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker }  // namespace base
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker #endif  // BASE_STRINGS_STRING_UTIL_WIN_H_
207