1 #ifndef LIBFILEZILLA_STRING_HEADER 2 #define LIBFILEZILLA_STRING_HEADER 33 #if defined(FZ_UNIX) || defined(FZ_MAC) 41 native_string FZ_PUBLIC_SYMBOL
to_native(std::string
const& in);
47 native_string FZ_PUBLIC_SYMBOL
to_native(std::wstring
const& in);
55 int FZ_PUBLIC_SYMBOL
stricmp(std::string
const& a, std::string
const& b);
56 int FZ_PUBLIC_SYMBOL
stricmp(std::wstring
const& a, std::wstring
const& b);
75 template<
typename Char>
77 if (c >=
'A' && c <=
'Z') {
78 return c + (
'a' -
'A');
84 std::wstring::value_type FZ_PUBLIC_SYMBOL
tolower_ascii(std::wstring::value_type c);
87 template<
typename Char>
89 if (c >=
'a' && c <=
'z') {
90 return c + (
'A' -
'a');
96 std::wstring::value_type FZ_PUBLIC_SYMBOL
toupper_ascii(std::wstring::value_type c);
101 template<
typename String>
105 for (
auto& c : ret) {
111 template<
typename String>
112 String str_toupper_ascii(String
const& s)
115 for (
auto& c : ret) {
127 std::wstring FZ_PUBLIC_SYMBOL
to_wstring(std::string
const& in);
130 inline std::wstring FZ_PUBLIC_SYMBOL
to_wstring(std::wstring
const& in) {
return in; }
133 template<
typename Arg>
134 inline typename std::enable_if<std::is_arithmetic<std::decay_t<Arg>>::value, std::wstring>::type
to_wstring(Arg && arg)
153 std::string FZ_PUBLIC_SYMBOL
to_string(std::wstring
const& in);
156 inline std::string FZ_PUBLIC_SYMBOL
to_string(std::string
const& in) {
return in; }
159 template<
typename Arg>
160 inline typename std::enable_if<std::is_arithmetic<std::decay_t<Arg>>::value, std::string>::type
to_string(Arg && arg)
167 template<
typename Char>
169 return std::char_traits<Char>::length(str);
179 std::string FZ_PUBLIC_SYMBOL
to_utf8(std::string
const& in);
187 std::string FZ_PUBLIC_SYMBOL
to_utf8(std::wstring
const& in);
196 template<
typename Char>
199 if (c >=
'a' && c <=
'z') {
202 if (c >=
'A' && c <=
'Z') {
205 else if (c >=
'0' && c <=
'9') {
211 template<
typename String>
212 std::vector<uint8_t> hex_decode(String
const& in)
214 std::vector<uint8_t> ret;
215 if (!(in.size() % 2)) {
216 ret.reserve(in.size() / 2);
217 for (
size_t i = 0; i < in.size(); i += 2) {
220 if (high == -1 || low == -1) {
221 return std::vector<uint8_t>();
223 ret.push_back(static_cast<uint8_t>((high << 4) + low));
236 template<
typename Char =
char,
bool Lowercase = true>
240 return (Lowercase ?
'a' :
'A') + d - 10;
247 template<
typename String,
typename InString,
bool Lowercase = true>
248 String hex_encode(InString
const& data)
250 static_assert(
sizeof(
typename InString::value_type) == 1,
"Input must be a container of 8 bit values");
252 ret.reserve(data.size() * 2);
253 for (
auto const& c : data) {
254 ret.push_back(int_to_hex_char<typename String::value_type, Lowercase>(static_cast<unsigned char>(c) >> 4));
255 ret.push_back(int_to_hex_char<typename String::value_type, Lowercase>(static_cast<unsigned char>(c) & 0xf));
262 template<
typename String,
typename Arg>
263 inline auto toString(Arg&& arg) ->
typename std::enable_if<std::is_same<String, std::string>::value, decltype(
to_string(std::forward<Arg>(arg)))>::type
265 return to_string(std::forward<Arg>(arg));
268 template<
typename String,
typename Arg>
269 inline auto toString(Arg&& arg) ->
typename std::enable_if<std::is_same<String, std::wstring>::value, decltype(
to_wstring(std::forward<Arg>(arg)))>::type
274 #if !defined(fzT) || defined(DOXYGEN) 280 #define fzT(x) L ## x 291 template<
typename Char>
294 template<>
inline char const*
choose_string(
char const* c,
wchar_t const*) {
return c; }
295 template<>
inline wchar_t const*
choose_string(
char const*,
wchar_t const* w) {
return w; }
297 #if !defined(fzS) || defined(DOXYGEN) 309 #define fzS(Char, s) fz::choose_string<Char>(s, L ## s) 313 std::string FZ_PUBLIC_SYMBOL
replaced_substrings(std::string
const& in, std::string
const& find, std::string
const& replacement);
314 std::wstring FZ_PUBLIC_SYMBOL
replaced_substrings(std::wstring
const& in, std::wstring
const& find, std::wstring
const& replacement);
317 void FZ_PUBLIC_SYMBOL
replace_substrings(std::string& in, std::string
const& find, std::string
const& replacement);
318 void FZ_PUBLIC_SYMBOL
replace_substrings(std::wstring& in, std::wstring
const& find, std::wstring
const& replacement);
321 template<
typename String,
typename Delim,
typename Container = std::vector<String>>
322 Container
strtok(String
const& s, Delim
const& delims)
326 typename String::size_type start{}, pos{};
328 pos = s.find_first_of(delims, start);
331 if (pos == String::npos) {
332 if (start < s.size()) {
333 ret.emplace_back(s.substr(start));
336 else if (pos > start) {
338 ret.emplace_back(s.substr(start, pos - start));
341 }
while (pos != String::npos);
348 std::string FZ_PUBLIC_SYMBOL
base64_encode(std::string
const& in);
351 std::string FZ_PUBLIC_SYMBOL
base64_decode(std::string
const& in);
354 template<
typename T,
typename String>
355 T to_integral(String
const& s, T
const errorval = T())
359 auto it = s.cbegin();
360 if (it != s.cend() && (*it ==
'-' || *it ==
'+')) {
364 if (it == s.cend()) {
368 for (; it != s.cend(); ++it) {
370 if (c < '0' || c >
'9') {
377 if (!s.empty() && s.front() ==
'-') {
378 return ret *=
static_cast<T
>(-1);
386 template<
typename String>
388 for (
auto const& c : s) {
389 if (
static_cast<std::make_unsigned_t<typename String::value_type>
>(c) > 127) {
398 template<
typename String>
399 String
trimmed(String
const& s, String
const& chars =
fzS(
typename String::value_type,
" \r\n\t"),
bool fromLeft =
true,
bool fromRight =
true) {
400 size_t const first = fromLeft ? s.find_first_not_of(chars) : 0;
401 if (first == String::npos) {
405 size_t const last = fromRight ? s.find_last_not_of(chars) : s.size();
406 if (last == String::npos) {
409 return s.substr(first, last - first + 1);
412 template<
typename String>
413 String ltrimmed(String
const& s, String
const& chars =
fzS(
typename String::value_type,
" \r\n\t"),
bool fromLeft =
true,
bool fromRight =
true) {
414 return trimmed(s, chars,
true,
false);
417 template<
typename String>
418 String rtrimmed(String
const& s, String
const& chars =
fzS(
typename String::value_type,
" \r\n\t"),
bool fromLeft =
true,
bool fromRight =
true) {
419 return trimmed(s, chars,
false,
true);
423 template<
typename String>
424 void trim(String & s, String
const& chars =
fzS(
typename String::value_type,
" \r\n\t")) {
428 template<
typename String>
429 void ltrim(String & s, String
const& chars =
fzS(
typename String::value_type,
" \r\n\t")) {
430 s =
trimmed(s, chars,
true,
false);
433 template<
typename String>
434 void rtrim(String & s, String
const& chars =
fzS(
typename String::value_type,
" \r\n\t")) {
435 s =
trimmed(s, chars,
false,
true);
std::wstring to_wstring_from_utf8(std::string const &in)
Converts from std::string in UTF-8 into std::wstring.
Char toupper_ascii(Char c)
Converts ASCII lowercase characters to uppercase as if C-locale is used.
Definition: string.hpp:88
Char int_to_hex_char(int d)
Converts an integer to the corresponding lowercase hex digit.
Definition: string.hpp:237
int hex_char_to_int(Char c)
Converts a hex digit to decimal int.
Definition: string.hpp:197
std::enable_if< std::is_arithmetic< std::decay_t< Arg > >::value, std::wstring >::type to_wstring(Arg &&arg)
Converts from arithmetic type to std::wstring.
Definition: string.hpp:134
std::enable_if< std::is_arithmetic< std::decay_t< Arg > >::value, std::string >::type to_string(Arg &&arg)
Converts from arithmetic type to std::string.
Definition: string.hpp:160
#define fzS(Char, s)
Macro to get const pointer to a string of the corresponding type.
Definition: string.hpp:309
int stricmp(std::string const &a, std::string const &b)
Locale-sensitive stricmp.
Char tolower_ascii(Char c)
Converts ASCII uppercase characters to lowercase as if C-locale is used.
Definition: string.hpp:76
std::string replaced_substrings(std::string const &in, std::string const &find, std::string const &replacement)
Returns in with all occurrences of find in the input string replaced with replacement.
std::string to_utf8(std::string const &in)
Converts from std::string in native encoding into std::string in UTF-8.
void replace_substrings(std::string &in, std::string const &find, std::string const &replacement)
Modifies in, replacing all occurrences of find with replacement.
size_t strlen(Char const *str)
Returns length of 0-terminated character sequence. Works with both narrow and wide-characters.
Definition: string.hpp:168
bool str_is_ascii(String const &s)
Returns true iff the string only has characters in the 7-bit ASCII range.
Definition: string.hpp:387
Container strtok(String const &s, Delim const &delims)
Tokenizes string. Returns all non-empty substrings.
Definition: string.hpp:322
std::string base64_encode(std::string const &in)
Encodes raw input string to base64.
std::wstring native_string
A string in the system's native character type and encoding. Note: This typedef changes depending on...
Definition: string.hpp:31
std::string to_string(std::wstring const &in)
Converts from std::wstring into std::string in system encoding.
The namespace used by libfilezilla.
Definition: apply.hpp:16
Char const * choose_string(char const *c, wchar_t const *w)
Returns the function argument of the type matching the template argument.
Definition: string.hpp:294
void trim(String &s, String const &chars=fz::choose_string< typename String::value_type >(" \\, L" \\\"))
Remove all leading and trailing whitespace from string.
Definition: string.hpp:424
String str_tolower_ascii(String const &s)
tr_tolower_ascii does for strings what tolower_ascii does for individual characters ...
Definition: string.hpp:102
Sets some global macros and further includes string.hpp.
native_string to_native(std::string const &in)
Converts std::string to native_string.
std::string base64_decode(std::string const &in)
Decodes base64, ignores whitespace. Returns empty string on invalid input.
auto toString(Arg &&arg) -> typename std::enable_if< std::is_same< String, std::string >::value, decltype(to_string(std::forward< Arg >(arg)))>::type
Calls either fz::to_string or fz::to_wstring depending on the passed template argument.
Definition: string.hpp:263
String trimmed(String const &s, String const &chars=fz::choose_string< typename String::value_type >(" \\, L" \\\"), bool fromLeft=true, bool fromRight=true)
Return passed string with all leading and trailing whitespace removed.
Definition: string.hpp:399
std::wstring to_wstring(std::string const &in)
Converts from std::string in system encoding into std::wstring.