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