22#include <unordered_map>
27#define STRINGIFY(x) #x
28#define TOSTRING(x) STRINGIFY(x)
31#define IS_ASCII_PRINTABLE_CHAR(x) \
32 (((unsigned int)(x) >= 0x20) && \
33 ( (unsigned int)(x) <= 0x7e))
36#define IS_PRIVATE_USE_CHAR16(x) \
37 ((wchar_t)(x) >= 0xE000 && \
38 (wchar_t)(x) <= 0xF8FF)
39#define IS_PRIVATE_USE_CHAR32(x) \
40 (((wchar_t)(x) >= 0xF0000 && \
41 (wchar_t)(x) <= 0xFFFFD) || \
42 ((wchar_t)(x) >= 0x100000 && \
43 (wchar_t)(x) <= 0x10FFFD))
45#define IS_PRIVATE_USE_CHAR(x) (IS_PRIVATE_USE_CHAR16(x) || IS_PRIVATE_USE_CHAR32(x))
47#define IS_PRIVATE_USE_CHAR(x) IS_PRIVATE_USE_CHAR16(x)
51#define IS_UTF8_MULTB_INNER(x) \
52 (((unsigned char)(x) >= 0x80) && \
53 ( (unsigned char)(x) <= 0xbf))
56#define IS_UTF8_MULTB_START(x) \
57 (((unsigned char)(x) >= 0xc2) && \
58 ( (unsigned char)(x) <= 0xf4))
62#define UTF8_MULTB_START_LEN(x) \
63 (((unsigned char)(x) < 0xe0) ? 2 : \
64 (((unsigned char)(x) < 0xf0) ? 3 : 4))
67#define UTF8_MULTB_MAX 4
69typedef std::unordered_map<std::string, std::string>
StringMap;
78[[nodiscard]] std::wstring
utf8_to_wide(std::string_view input);
79[[nodiscard]] std::string
wide_to_utf8(std::wstring_view input);
90std::string
urlencode(std::string_view str);
91std::string
urldecode(std::string_view str);
96size_t mystrlcpy(
char *dst,
const char *src,
size_t size)
noexcept;
101bool parseColorString(
const std::string &value, video::SColor &color,
bool quiet,
102 unsigned char default_alpha = 0xff);
115 if (
static_cast<unsigned char>(c) > 0x7f)
118 return tolower(
static_cast<unsigned char>(c));
128 if (len > str.size())
129 str.insert(str.end(), len - str.size(),
' ');
148 const char **
p = ends;
150 for (; *
p && (*p)[0] !=
'\0';
p++) {
151 std::string_view end(*
p);
152 if (str.size() < end.size())
154 if (str.compare(str.size() - end.size(), end.size(), end) == 0)
155 return str.substr(0, str.size() - end.size());
158 return std::string_view();
162#define MAKE_VARIANT(_name, _t0, _t1) \
163 template <typename T, typename... Args> \
164 inline auto _name(_t0 arg1, _t1 arg2, Args&&... args) \
166 return (_name)(std::basic_string_view<T>(arg1), std::basic_string_view<T>(arg2), \
167 std::forward<Args>(args)...); \
182 std::basic_string_view<T> s2,
183 bool case_insensitive =
false)
185 if (!case_insensitive)
188 if (s1.size() != s2.size())
191 for (
size_t i = 0; i < s1.size(); ++i)
221 std::basic_string_view<T> prefix,
222 bool case_insensitive =
false)
224 if (str.size() < prefix.size())
227 if (!case_insensitive)
228 return str.compare(0, prefix.size(), prefix) == 0;
230 for (
size_t i = 0; i < prefix.size(); ++i)
261 std::basic_string_view<T> suffix,
262 bool case_insensitive =
false)
264 if (str.size() < suffix.size())
267 size_t start = str.size() - suffix.size();
268 if (!case_insensitive)
269 return str.compare(start, suffix.size(), suffix) == 0;
271 for (
size_t i = 0; i < suffix.size(); ++i)
302 const std::basic_string<T> &str,
305 std::vector<std::basic_string<T>> parts;
306 std::basic_stringstream<T> sstr(str);
307 std::basic_string<T> part;
309 while (std::getline(sstr, part, delimiter))
310 parts.push_back(std::move(part));
324 s2.resize(str.size());
325 for (
size_t i = 0; i < str.size(); i++)
333 return std::isspace(
static_cast<unsigned char>(c));
338 return std::iswspace(c);
347inline std::basic_string_view<T>
trim(std::basic_string_view<T> str)
350 size_t back = str.size();
352 while (front < back &&
my_isspace(str[front]))
355 while (back > front &&
my_isspace(str[back - 1]))
358 return str.substr(front, back - front);
371inline std::basic_string<T>
trim(std::basic_string<T> &&str)
373 std::basic_string<T> ret(
trim(std::basic_string_view<T>(str)));
379inline std::basic_string_view<T>
trim(
const std::basic_string<T> &str)
381 return trim(std::basic_string_view<T>(str));
387inline std::basic_string_view<T>
trim(
const T *str)
389 return trim(std::basic_string_view<T>(str));
403 return s2 ==
"y" || s2 ==
"yes" || s2 ==
"true" || atoi(s2.c_str()) != 0;
419inline s32
mystoi(
const std::string &str, s32 min, s32 max)
421 s32 i = atoi(str.c_str());
437 return atoi(str.c_str());
444inline float mystof(
const std::string &str)
446 return atof(str.c_str());
456 std::istringstream tmp(str);
466inline std::string
itos(s32 i) {
return std::to_string(i); }
468inline std::string
i64tos(s64 i) {
return std::to_string(i); }
471inline std::string
ftos(
float f)
473 std::ostringstream oss;
474 oss << std::setprecision(std::numeric_limits<float>::max_digits10) << f;
490inline void str_replace(std::string &str, std::string_view pattern,
491 std::string_view replacement)
493 std::string::size_type start = str.find(pattern, 0);
494 while (start != str.npos) {
495 str.replace(start, pattern.size(), replacement);
496 start = str.find(pattern, start + replacement.size());
530void str_replace(std::string &str,
char from,
char to);
545 return str.find_first_not_of(allowed_chars) == str.npos;
560 std::string_view blacklisted_chars)
562 return str.find_first_of(blacklisted_chars) == str.npos;
582std::string
wrap_rows(std::string_view from,
unsigned row_len,
bool has_color_codes =
false);
590std::basic_string<T>
unescape_string(std::basic_string_view<T> str,
const T esc = T(
'\\'))
592 std::basic_string<T> out;
594 out.reserve(str.size());
595 while (pos < str.size()) {
596 size_t cpos = str.find(esc, pos);
597 if (cpos == std::string::npos) {
598 out += str.substr(pos);
601 out += str.substr(pos, cpos - pos);
602 if (cpos + 1 != str.size())
603 out += str[cpos + 1];
632 std::basic_string<T> output;
633 output.reserve(s.size());
635 while (i < s.length()) {
636 if (s[i] ==
static_cast<T
>(
'\x1b')) {
640 if (s[i] ==
static_cast<T
>(
'(')) {
642 while (i < s.length() && s[i] !=
static_cast<T
>(
')')) {
643 if (s[i] ==
static_cast<T
>(
'\\'))
678std::vector<std::basic_string<T>>
split(std::basic_string_view<T> s,
679 T delim, T escape =
static_cast<T
>(
'\\'))
681 std::vector<std::basic_string<T>> tokens;
683 std::basic_string<T> current;
684 bool last_was_escape =
false;
685 for (
size_t i = 0; i < s.length(); i++) {
687 if (last_was_escape) {
690 last_was_escape =
false;
693 tokens.emplace_back(std::move(current));
695 last_was_escape =
false;
696 }
else if (si == escape) {
697 last_was_escape =
true;
700 last_was_escape =
false;
705 tokens.emplace_back(std::move(current));
712std::vector<std::basic_string<T>>
split(
const std::basic_string<T> &s,
713 T delim, T escape =
static_cast<T
>(
'\\'))
715 return split(std::basic_string_view<T>(s), delim, escape);
739 for (
char c : to_check)
740 if (!isdigit(
static_cast<unsigned char>(c)))
743 return !to_check.empty();
754 return val ?
"true" :
"false";
766 std::ostringstream ss;
767 const char *neg =
"";
781 ss << neg << day <<
"d";
782 if (hour > 0 || min > 0 || sec > 0)
787 ss << neg << hour <<
"h";
788 if (min > 0 || sec > 0)
793 ss << neg << min <<
"min";
798 if (sec > 0 || total_sec == 0) {
799 ss << neg << sec <<
"s";
811inline std::string
str_join(
const std::vector<std::string> &list,
812 std::string_view delimiter)
816 for (
const auto &part : list) {
818 ret.append(delimiter);
830inline std::string stringw_to_utf8(
const core::stringw &input)
832 std::wstring_view sv(input.c_str(), input.size());
840inline core::stringw utf8_to_stringw(std::string_view input)
843 return core::stringw(std::move(str));
854std::string
sanitizeDirName(std::string_view str, std::string_view optional_prefix);
880std::optional<v3f>
str_to_v3f(std::string_view str);
Definition translation.h:19
std::optional< v3f > str_to_v3f(std::string_view str)
Parses a string of form (1, 2, 3) or 1, 2, 4 to a v3f.
Definition string.cpp:1051
bool my_isspace(const char c)
Definition string.h:331
s64 stoi64(const std::string &str)
Returns a 64-bit signed value represented by the string str (decimal).
Definition string.h:463
std::string writeFlagString(u32 flags, const FlagDesc *flagdesc, u32 flagmask)
Definition string.cpp:281
bool string_allowed(std::string_view str, std::string_view allowed_chars)
Check that a string only contains whitelisted characters.
Definition string.h:543
std::string wide_to_utf8(std::wstring_view input)
Definition string.cpp:115
std::string my_double_to_string(double number)
Converts double to string. Handles high precision and inf/nan.
Definition string.cpp:1090
bool str_equal(std::basic_string_view< T > s1, std::basic_string_view< T > s2, bool case_insensitive=false)
Check two strings for equivalence.
Definition string.h:181
std::string sanitize_untrusted(std::string_view str, bool keep_escapes=true)
Sanitize an untrusted string (e.g.
Definition string.cpp:1001
u32 readFlagString(std::string str, const FlagDesc *flagdesc, u32 *flagmask)
Definition string.cpp:245
std::optional< double > my_string_to_double(const std::string &s)
Converts string to double. Handles high precision and inf/nan.
Definition string.cpp:1104
std::wstring unescape_translate(std::wstring_view s)
Definition string.h:725
void wide_add_codepoint(std::wstring &result, char32_t codepoint)
Definition string.cpp:170
const std::string duration_to_string(int sec)
Converts a duration in seconds to a pretty-printed duration in days, hours, minutes and seconds.
Definition string.h:764
const char * bool_to_cstr(bool val)
Returns a C-string, either "true" or "false", corresponding to val.
Definition string.h:752
std::wstring translate_string(std::wstring_view s, Translations *translations)
Definition string.cpp:892
char my_tolower(char c)
Converts a letter to lowercase, with safe handling of the char type and non-ASCII.
Definition string.h:110
size_t utf8_truncate_count(std::string_view input)
Takes a string that may end with a truncated UTF-8 sequence and gets rid of the incomplete sequence.
Definition string.cpp:187
std::string wrap_rows(std::string_view from, unsigned row_len, bool has_color_codes=false)
Create a string based on from where a newline is forcefully inserted every row_len characters.
Definition string.cpp:614
bool parseColorString(const std::string &value, video::SColor &color, bool quiet, unsigned char default_alpha=0xff)
Definition string.cpp:579
std::basic_string< T > unescape_string(std::basic_string_view< T > str, const T esc=T('\\'))
Unescapes a string.
Definition string.h:590
void str_replace(std::string &str, std::string_view pattern, std::string_view replacement)
Replace all occurrences of pattern in str with replacement.
Definition string.h:490
T from_string(const std::string &str)
Returns a value represented by the string val.
Definition string.h:454
std::vector< std::basic_string< T > > str_split(const std::basic_string< T > &str, T delimiter)
Splits a string into its component parts separated by the character delimiter.
Definition string.h:301
std::string sanitizeDirName(std::string_view str, std::string_view optional_prefix)
Sanitize the name of a new directory.
Definition string.cpp:948
std::unordered_map< std::string, std::string > StringMap
Definition string.h:69
bool str_ends_with(std::basic_string_view< T > str, std::basic_string_view< T > suffix, bool case_insensitive=false)
Check whether str ends with the string suffix.
Definition string.h:260
std::string urlencode(std::string_view str)
Definition string.cpp:207
bool string_allowed_blacklist(std::string_view str, std::string_view blacklisted_chars)
Check that a string contains no blacklisted characters.
Definition string.h:559
size_t mystrlcpy(char *dst, const char *src, size_t size) noexcept
Definition string.cpp:302
std::string str_join(const std::vector< std::string > &list, std::string_view delimiter)
Joins a vector of strings by the string delimiter.
Definition string.h:811
void str_texture_modifiers_escape(std::string &str)
Escapes characters to nest texture modifiers.
Definition string.h:516
std::string urldecode(std::string_view str)
Definition string.cpp:226
std::string padStringRight(std::string str, size_t len)
Returns a copy of str with spaces inserted at the right hand side to ensure that the string is len ch...
Definition string.h:126
std::vector< std::basic_string< T > > split(std::basic_string_view< T > s, T delim, T escape=static_cast< T >('\\'))
Splits a string into its component parts separated by the character delimiter.
Definition string.h:678
bool str_starts_with(std::basic_string_view< T > str, std::basic_string_view< T > prefix, bool case_insensitive=false)
Check whether str begins with the string prefix.
Definition string.h:220
float mystof(const std::string &str)
Returns a float reprensented by the string str (decimal).
Definition string.h:444
std::string itos(s32 i)
Returns a string representing the decimal value of the 32-bit value i.
Definition string.h:466
void str_formspec_escape(std::string &str)
Escapes characters that cannot be used in formspecs.
Definition string.h:503
void safe_print_string(std::ostream &os, std::string_view str)
Prints a sanitized version of a string without control characters.
Definition string.cpp:1036
std::string i64tos(s64 i)
Returns a string representing the decimal value of the 64-bit value i.
Definition string.h:468
std::string lowercase(std::string_view str)
Definition string.h:321
std::string ftos(float f)
Returns a string representing the exact decimal value of the float value f.
Definition string.h:471
std::string_view removeStringEnd(std::string_view str, const char *ends[])
Returns a version of str with the first occurrence of a string contained within ends[] removed from t...
Definition string.h:145
std::string encodeHexColorString(video::SColor color)
Definition string.cpp:595
#define MAKE_VARIANT(_name, _t0, _t1)
Definition string.h:162
std::wstring utf8_to_wide(std::string_view input)
Definition string.cpp:87
bool is_yes(std::string_view str)
Returns whether str should be regarded as (bool) true.
Definition string.h:399
std::basic_string< T > unescape_enriched(std::basic_string_view< T > s)
Remove all escape sequences in s.
Definition string.h:630
u64 read_seed(const char *str)
turn string into a map seed. either directly if it's a number or by hashing it.
Definition string.cpp:315
bool is_number(std::string_view to_check)
Checks that all characters in to_check are decimal digits.
Definition string.h:737
std::basic_string_view< T > trim(std::basic_string_view< T > str)
Definition string.h:347
s32 mystoi(const std::string &str, s32 min, s32 max)
Converts the string str to a signed 32-bit integer.
Definition string.h:419
u32 flag
Definition string.h:73
const char * name
Definition string.h:72
static std::string p(std::string path)
Definition test_filesys.cpp:69