9 #ifndef BITCOIN_UTIL_STRENCODINGS_H 10 #define BITCOIN_UTIL_STRENCODINGS_H 22 #include <string_view> 23 #include <system_error> 24 #include <type_traits> 49 t = 1'000
'000'000
'000ULL, 60 std::string SanitizeString(std::string_view str, int rule = SAFE_CHARS_DEFAULT); 62 template <typename Byte = std::byte> 63 std::optional<std::vector<Byte>> TryParseHex(std::string_view str); 65 template <typename Byte = uint8_t> 66 std::vector<Byte> ParseHex(std::string_view hex_str) 68 return TryParseHex<Byte>(hex_str).value_or(std::vector<Byte>{}); 70 /* Returns true if each character in str is a hex character, and has an even 71 * number of hex digits.*/ 72 bool IsHex(std::string_view str); 76 bool IsHexNumber(std::string_view str); 77 std::optional<std::vector<unsigned char>> DecodeBase64(std::string_view str); 78 std::string EncodeBase64(Span<const unsigned char> input); 79 inline std::string EncodeBase64(Span<const std::byte> input) { return EncodeBase64(MakeUCharSpan(input)); } 80 inline std::string EncodeBase64(std::string_view str) { return EncodeBase64(MakeUCharSpan(str)); } 81 std::optional<std::vector<unsigned char>> DecodeBase32(std::string_view str); 88 std::string EncodeBase32(Span<const unsigned char> input, bool pad = true); 95 std::string EncodeBase32(std::string_view str, bool pad = true); 106 bool SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut); 108 // LocaleIndependentAtoi is provided for backwards compatibility reasons. 110 // New code should use ToIntegral or the ParseInt* functions 111 // which provide parse error feedback. 113 // The goal of LocaleIndependentAtoi is to replicate the defined behaviour of 114 // std::atoi as it behaves under the "C" locale, and remove some undefined 115 // behavior. If the parsed value is bigger than the integer type's maximum
119 template <
typename T>
122 static_assert(std::is_integral<T>::value);
126 if (!s.empty() && s[0] ==
'+') {
127 if (s.length() >= 2 && s[1] ==
'-') {
132 auto [
_, error_condition] = std::from_chars(s.data(), s.data() + s.size(), result);
133 if (error_condition == std::errc::result_out_of_range) {
134 if (s.length() >= 1 && s[0] ==
'-') {
136 return std::numeric_limits<T>::min();
139 return std::numeric_limits<T>::max();
141 }
else if (error_condition != std::errc{}) {
154 return c >=
'0' && c <=
'9';
168 constexpr
inline bool IsSpace(
char c) noexcept {
169 return c ==
' ' || c ==
'\f' || c ==
'\n' || c ==
'\r' || c ==
'\t' || c ==
'\v';
180 template <
typename T>
183 static_assert(std::is_integral<T>::value);
185 const auto [first_nonmatching, error_condition] = std::from_chars(str.data(), str.data() + str.size(), result);
186 if (first_nonmatching != str.data() + str.size() || error_condition != std::errc{}) {
197 [[nodiscard]]
bool ParseInt32(std::string_view str, int32_t *
out);
204 [[nodiscard]]
bool ParseInt64(std::string_view str, int64_t *
out);
211 [[nodiscard]]
bool ParseUInt8(std::string_view str, uint8_t *
out);
218 [[nodiscard]]
bool ParseUInt16(std::string_view str, uint16_t*
out);
225 [[nodiscard]]
bool ParseUInt32(std::string_view str, uint32_t *
out);
232 [[nodiscard]]
bool ParseUInt64(std::string_view str, uint64_t *
out);
238 std::string
FormatParagraph(std::string_view in,
size_t width = 79,
size_t indent = 0);
245 template <
typename T>
248 if (b.size() == 0)
return a.size() == 0;
249 size_t accumulator = a.size() ^ b.size();
250 for (
size_t i = 0; i < a.size(); i++)
251 accumulator |=
size_t(a[i] ^ b[i%b.size()]);
252 return accumulator == 0;
259 [[nodiscard]]
bool ParseFixedPoint(std::string_view,
int decimals, int64_t *amount_out);
265 [[maybe_unused]]
int operator()(
int x)
const {
return x; }
271 template<
int frombits,
int tobits,
bool pad,
typename O,
typename It,
typename I = IntIdentity>
275 constexpr
size_t maxv = (1 << tobits) - 1;
276 constexpr
size_t max_acc = (1 << (frombits + tobits - 1)) - 1;
279 if (v < 0)
return false;
280 acc = ((acc << frombits) | v) & max_acc;
282 while (bits >= tobits) {
284 outfn((acc >> bits) & maxv);
289 if (bits) outfn((acc << (tobits - bits)) & maxv);
290 }
else if (bits >= frombits || ((acc << (tobits - bits)) & maxv)) {
308 return (c >=
'A' && c <=
'Z' ? (c -
'A') +
'a' : c);
320 std::string
ToLower(std::string_view str);
334 return (c >=
'a' && c <=
'z' ? (c -
'a') +
'A' : c);
346 std::string
ToUpper(std::string_view str);
372 #endif // BITCOIN_UTIL_STRENCODINGS_H bool TimingResistantEqual(const T &a, const T &b)
Timing-attack-resistant comparison.
The full set of allowed chars.
constexpr char ToUpper(char c)
Converts the given character to its uppercase equivalent.
T LocaleIndependentAtoi(std::string_view str)
std::optional< uint64_t > ParseByteUnits(std::string_view str, ByteUnit default_multiplier)
Parse a string with suffix unit [k|K|m|M|g|G|t|T].
bool ParseUInt64(std::string_view str, uint64_t *out)
Convert decimal string to unsigned 64-bit integer with strict parse error feedback.
bool ParseUInt16(std::string_view str, uint16_t *out)
Convert decimal string to unsigned 16-bit integer with strict parse error feedback.
bool ParseFixedPoint(std::string_view, int decimals, int64_t *amount_out)
Parse number as fixed point according to JSON number syntax.
constexpr bool IsDigit(char c)
Tests if the given character is a decimal digit.
bool ParseUInt32(std::string_view str, uint32_t *out)
Convert decimal string to unsigned 32-bit integer with strict parse error feedback.
bool ParseInt32(std::string_view str, int32_t *out)
Convert string to signed 32-bit integer with strict parse error feedback.
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \\\)
SafeChars
Utilities for converting data from/to strings.
bool ParseUInt8(std::string_view str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
std::string Capitalize(std::string str)
Capitalizes the first character of the given string.
ByteUnit
Used by ParseByteUnits() Lowercase base 1000 Uppercase base 1024.
Chars allowed in filenames.
constexpr bool IsSpace(char c) noexcept
Tests if the given character is a whitespace character.
std::optional< T > ToIntegral(std::string_view str)
Convert string to integral type T.
bool ParseInt64(std::string_view str, int64_t *out)
Convert string to signed 64-bit integer with strict parse error feedback.
constexpr char ToLower(char c)
Converts the given character to its lowercase equivalent.
bool ConvertBits(O outfn, It it, It end, I infn={})
Convert from one power-of-2 number base to another.
Chars allowed in URIs (RFC 3986)
std::string FormatParagraph(std::string_view in, size_t width=79, size_t indent=0)
Format a paragraph of text to a fixed width, adding spaces for indentation to any added line...
bilingual_str _(ConstevalStringLiteral str)
Translation function.