51char *
BLI_strdupcat(
const char *__restrict str1,
const char *__restrict str2)
54 const size_t str1_len = strlen(str1);
55 const size_t str2_len = strlen(str2) + 1;
61 memcpy(s, str1, str1_len);
63 memcpy(s, str2, str2_len);
68char *
BLI_strncpy(
char *__restrict dst,
const char *__restrict src,
const size_t dst_maxncpy)
75 memcpy(dst, src, srclen);
81 const char *__restrict src,
96 if (src[idx] !=
pad) {
103 if ((src[srclen - 1] !=
pad) && (srclen == dst_maxncpy)) {
107 memcpy(&dst[idx], src, srclen);
110 if (dst[idx - 1] !=
pad) {
119size_t BLI_strncpy_rlen(
char *__restrict dst,
const char *__restrict src,
const size_t dst_maxncpy)
126 memcpy(dst, src, srclen);
137char *
BLI_strncat(
char *__restrict dst,
const char *__restrict src,
const size_t dst_maxncpy)
142 if (
len < dst_maxncpy) {
156 const char *__restrict
format,
165 const size_t n = size_t(vsnprintf(dst, dst_maxncpy,
format, arg));
166 if (n < dst_maxncpy) {
170 dst[dst_maxncpy - 1] =
'\0';
178 const char *__restrict
format,
187 size_t n = size_t(vsnprintf(dst, dst_maxncpy,
format, arg));
188 if (n < dst_maxncpy) {
213 const char *__restrict
format,
227 char *fixed_buf,
size_t fixed_buf_size,
size_t *result_len,
const char *__restrict
format, ...)
231 int retval = vsnprintf(fixed_buf, fixed_buf_size,
format, args);
236 if (
UNLIKELY(fixed_buf_size == 0)) {
242 *result_len = size_t(retval);
243 if (
size_t(retval) < fixed_buf_size) {
248 const size_t size = size_t(retval) + 1;
259 size_t fixed_buf_size,
261 const char *__restrict
format,
265 va_copy(args_copy, args);
266 int retval = vsnprintf(fixed_buf, fixed_buf_size,
format, args_copy);
271 if (
UNLIKELY(fixed_buf_size == 0)) {
277 *result_len = size_t(retval);
278 if (
size_t(retval) < fixed_buf_size) {
283 const size_t size = size_t(retval) + 1;
298 fixed_buf,
sizeof(fixed_buf), &result_len,
format, args);
300 if (
result != fixed_buf) {
303 size_t size = result_len + 1;
314 fixed_buf,
sizeof(fixed_buf), &result_len,
format, args);
315 if (
result != fixed_buf) {
318 size_t size = result_len + 1;
330size_t BLI_str_escape(
char *__restrict dst,
const char *__restrict src,
const size_t dst_maxncpy)
336 for (; (
len < dst_maxncpy) && (*src !=
'\0'); dst++, src++,
len++) {
338 if (
ELEM(c,
'\\',
'"') ||
339 ((c ==
'\t') && ((
void)(c =
't'),
true)) ||
340 ((c ==
'\n') && ((
void)(c =
'n'),
true)) ||
341 ((c ==
'\r') && ((
void)(c =
'r'),
true)) ||
342 ((c ==
'\a') && ((
void)(c =
'a'),
true)) ||
343 ((c ==
'\b') && ((
void)(c =
'b'),
true)) ||
344 ((c ==
'\f') && ((
void)(c =
'f'),
true)))
365 const size_t max_result_size = strlen(
str) * 2 + 1;
367 result.resize(max_result_size);
369 result.resize(result_size);
375#define CASE_PAIR(value_src, value_dst) \
377 *r_out = value_dst; \
395 const char *__restrict src,
396 const size_t src_maxncpy,
398 const size_t dst_maxncpy,
404 bool is_complete =
true;
405 const size_t max_strlen = dst_maxncpy - 1;
406 for (
const char *src_end = src + src_maxncpy; (src < src_end) && *src; src++) {
418 *r_is_complete = is_complete;
422size_t BLI_str_unescape(
char *__restrict dst,
const char *__restrict src,
const size_t src_maxncpy)
427 for (
const char *src_end = src + src_maxncpy; (src < src_end) && *src; src++) {
441 while (*
str && (*
str !=
'"' || escape)) {
444 escape = (escape ==
false) && (*
str ==
'\\');
447 return (*
str ==
'"') ?
str :
nullptr;
457 const char *__restrict prefix,
458 int *__restrict r_start,
459 int *__restrict r_end)
461 const char *str_start = strstr(
str, prefix);
462 if (str_start ==
nullptr) {
465 const size_t prefix_len = strlen(prefix);
468 "Zero length prefix passed in, "
469 "caller must prevent this from happening!");
473 "Prefix includes trailing quote, "
474 "caller must prevent this from happening!");
476 str_start += prefix_len;
486 *r_start = int(str_start -
str);
487 *r_end = int(str_end -
str);
505char *BLI_str_quoted_substrN(
const char *__restrict
str,
const char *__restrict prefix)
507 int start_match_ofs, end_match_ofs;
511 const size_t escaped_len = size_t(end_match_ofs - start_match_ofs);
514 if (unescaped_len != escaped_len) {
522 const char *__restrict prefix,
524 size_t result_maxncpy)
528 int start_match_ofs, end_match_ofs;
532 const size_t escaped_len = size_t(end_match_ofs - start_match_ofs);
535 if (is_complete ==
false) {
557 if ((c = *find++) != 0) {
558 c = char(tolower(c));
562 if ((sc = *s++) == 0) {
565 sc = char(tolower(sc));
575 return (str_len / 2) + 1;
582 if ((match == haystack) || (*(match - 1) ==
' ') || ispunct(*(match - 1))) {
596 for (index = 0; index < words_len; index++) {
601 const bool all_words_matched = (index == words_len);
603 return all_words_matched;
610 if ((c = *find++) != 0) {
611 c = char(tolower(c));
615 if ((sc = *s++) == 0) {
618 sc = char(tolower(sc));
625 if ((sc = *s++) == 0) {
628 sc = char(tolower(sc));
643 c1 = char(tolower(s1[
i]));
644 c2 = char(tolower(s2[
i]));
665 for (
i = 0;
i <
len;
i++) {
666 c1 = char(tolower(s1[
i]));
667 c2 = char(tolower(s2[
i]));
686 const char *p1 = s1, *p2 = s2;
687 int numdigit, numzero1, numzero2;
690 for (numzero1 = 0; *p1 ==
'0'; numzero1++) {
693 for (numzero2 = 0; *p2 ==
'0'; numzero2++) {
698 for (numdigit = 0;; numdigit++) {
699 if (isdigit(*(p1 + numdigit)) && isdigit(*(p2 + numdigit))) {
702 if (isdigit(*(p1 + numdigit))) {
705 if (isdigit(*(p2 + numdigit))) {
713 int compare = strncmp(p1, p2,
size_t(numdigit));
721 if (*tiebreaker == 0) {
722 if (numzero1 > numzero2) {
725 else if (numzero1 < numzero2) {
744 if (isdigit(s1[d1]) && isdigit(s2[d2])) {
747 if (numcompare != 0) {
753 while (isdigit(s1[d1])) {
757 while (isdigit(s2[d2])) {
763 if (
ELEM(0, s1[d1], s2[d2])) {
767 c1 = char(tolower(s1[d1]));
768 c2 = char(tolower(s2[d2]));
774 else if (c1 ==
'.') {
777 else if (c2 ==
'.') {
797 return strcmp(s1, s2);
802 size_t str1_len, str2_len;
804 while (*str1 ==
pad) {
807 while (*str2 ==
pad) {
811 str1_len = strlen(str1);
812 str2_len = strlen(str2);
814 while (str1_len && (str1[str1_len - 1] ==
pad)) {
817 while (str2_len && (str2[str2_len - 1] ==
pad)) {
821 if (str1_len == str2_len) {
822 return strncmp(str1, str2, str2_len);
824 if (str1_len > str2_len) {
825 int ret = strncmp(str1, str2, str2_len);
832 int ret = strncmp(str1, str2, str1_len);
847 const char **__restrict str_array,
848 const int str_array_len)
851 const char **str_iter = str_array;
853 for (index = 0; index < str_array_len; str_iter++, index++) {
864 const char **str_iter = str_array;
866 for (index = 0; *str_iter; str_iter++, index++) {
876 for (; *
str && *start;
str++, start++) {
877 if (*
str != *start) {
882 return (*start ==
'\0');
887 size_t end_len = strlen(end);
889 if (end_len <= str_len) {
890 const char *iter = &
str[str_len - end_len];
892 if (*iter++ != *end++) {
903 const size_t str_len = strlen(
str);
934 while (!
ELEM(*p, ch,
'\0')) {
948 return (c >=
'A' && c <=
'Z') ? c + (
'a' -
'A') : c;
953 return (c >=
'a' && c <=
'z') ? c - (
'a' -
'A') : c;
982 for (
int i =
int(strlen(
str)) - 1;
i >= 0;
i--) {
983 if (isspace(
str[
i])) {
994 char *p = strchr(
str,
'.');
999 end_p = p + (strlen(p) - 1);
1001 while (end_p != p && *end_p ==
'0') {
1015 int str_len = int(strlen(
str));
1016 while (str_len > 0 && isdigit(
str[--str_len])) {
1017 str[str_len] =
'\0';
1044 const bool from_right)
1050 *sep = *suf =
nullptr;
1052 for (d = delim; *d !=
'\0'; d++) {
1057 for (tmp = end - 1; (tmp >=
str) && (*tmp != *d); tmp--) {
1065 tmp = strchr(
str, *d);
1072 tmp = (from_right) ? strrchr(
str, *d) : strchr(
str, *d);
1075 if (tmp && (from_right ? (*sep < tmp) : (!*sep || *sep > tmp))) {
1082 return size_t(*sep -
str);
1085 return end ? size_t(end -
str) : strlen(
str);
1089 const char *
str,
const size_t str_maxlen,
const char delim,
int r_words[][2],
int words_max)
1092 bool charsearch =
true;
1095 for (
i = 0; (
i < int(str_maxlen)) && (
str[
i] !=
'\0');
i++) {
1096 if (
str[
i] != delim) {
1101 for (; (
i < int(str_maxlen)) && (
str[
i] !=
'\0') && (n < words_max);
i++) {
1102 if ((
str[
i] != delim) && (charsearch ==
true)) {
1107 if ((
str[
i] == delim) && (charsearch ==
false)) {
1108 r_words[n][1] =
i - r_words[n][0];
1115 if (charsearch ==
false) {
1116 r_words[n][1] =
i - r_words[n][0];
1126 const size_t needle_len = strlen(needle);
1127 const char *p = haystack;
1130 if ((
size_t(p_next - p) == needle_len) && (memcmp(p, needle, needle_len) == 0)) {
1133 if (*p_next ==
'\0') {
1152 const char separator =
',';
1155 if (*p_src ==
'-') {
1156 *p_dst++ = *p_src++;
1160 for (commas = 2 - num_len % 3; *p_src; commas = (commas + 1) % 3) {
1161 *p_dst++ = *p_src++;
1163 *p_dst++ = separator;
1168 return size_t(p_dst - dst);
1178 const int num_len = int(
SNPRINTF(src,
"%d",
num));
1208 long long int bytes,
1214 double bytes_converted = double(bytes);
1217 const int base = base_10 ? 1000 : 1024;
1218 const char *units_base_10[] = {
"B",
"KB",
"MB",
"GB",
"TB",
"PB"};
1219 const char *units_base_2[] = {
"B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB"};
1220 const int units_num = int(
ARRAY_SIZE(units_base_2));
1224 while ((
fabs(bytes_converted) >= base) && ((order + 1) < units_num)) {
1225 bytes_converted /= base;
1228 decimals = std::max(order - 1, 0);
1234 BLI_strncpy(dst +
len, base_10 ? units_base_10[order] : units_base_2[order], dst_maxncpy -
len);
1238 long long int bytes,
1244 float number_to_format_converted =
float(bytes);
1246 const float base = base_10 ? 1000.0f : 1024.0f;
1247 const char *units[] = {
"B",
"K",
"M",
"G",
"T",
"P"};
1248 const int units_num = int(
ARRAY_SIZE(units));
1250 while ((
fabsf(number_to_format_converted) >= base) && ((order + 1) < units_num)) {
1251 number_to_format_converted /= base;
1255 const bool add_dot = (llabs(bytes) > 99999) &&
fabsf(number_to_format_converted) > 99;
1258 number_to_format_converted /= 100.0f;
1271 int number_to_format)
1275 float number_to_format_converted =
float(number_to_format);
1277 const float base = 1000.0f;
1278 const char *units[] = {
"",
"K",
"M",
"B"};
1279 const int units_num = int(
ARRAY_SIZE(units));
1281 while ((
fabsf(number_to_format_converted) >= base) && ((order + 1) < units_num)) {
1282 number_to_format_converted /= base;
1288 if ((order > 0) &&
fabsf(number_to_format_converted) < 100.0f) {
1291 BLI_snprintf(dst, dst_maxncpy,
"%.*f%s", decimals, number_to_format_converted, units[order]);
1295 const int number_to_format)
1300 float number_to_format_converted =
float(number_to_format);
1302 const float base = 1000;
1303 const char *units[] = {
"",
"K",
"M",
"B"};
1304 const int units_num = int(
ARRAY_SIZE(units));
1306 while ((
fabsf(number_to_format_converted) >= base) && ((order + 1) < units_num)) {
1307 number_to_format_converted /= base;
1311 const bool add_dot = (
abs(number_to_format) > 99999) &&
fabsf(number_to_format_converted) > 99;
1314 number_to_format_converted /= 100;
1321 number_to_format < 0 ?
"-" :
"",
1333#ifdef WITH_STRSIZE_DEBUG
1338 if (str_tail < str_maxncpy) {
#define BLI_STATIC_ASSERT(a, msg)
#define BLI_assert_msg(a, msg)
ATTR_WARN_UNUSED_RESULT const size_t num
#define BLI_STR_FORMAT_INT64_GROUPED_SIZE
#define BLI_STR_FORMAT_INT64_BYTE_UNIT_SIZE
#define SNPRINTF(dst, format,...)
#define BLI_STR_FORMAT_INT32_DECIMAL_UNIT_SIZE
#define BLI_string_debug_size_after_nil(str, str_maxncpy)
#define BLI_STR_FORMAT_INT32_GROUPED_SIZE
#define BLI_STR_FORMAT_INT32_INTEGER_UNIT_SIZE
#define BLI_string_debug_size(str, str_maxncpy)
#define BLI_STR_FORMAT_UINT64_GROUPED_SIZE
#define BLI_STR_FORMAT_INT64_BYTE_UNIT_COMPACT_SIZE
#define UNUSED_VARS_NDEBUG(...)
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
int pad[32 - sizeof(int)]
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
ccl_device_inline float2 fabs(const float2 a)
int BLI_str_index_in_array(const char *__restrict str, const char **__restrict str_array)
size_t BLI_str_format_int_grouped(char dst[BLI_STR_FORMAT_INT32_GROUPED_SIZE], int num)
#define CASE_PAIR(value_src, value_dst)
char * BLI_strdupn(const char *str, const size_t len)
static int left_number_strcmp(const char *s1, const char *s2, int *tiebreaker)
char * BLI_strncasestr(const char *s, const char *find, size_t len)
int BLI_strcasecmp(const char *s1, const char *s2)
void BLI_str_format_decimal_unit(char dst[BLI_STR_FORMAT_INT32_DECIMAL_UNIT_SIZE], int number_to_format)
size_t BLI_str_partition(const char *str, const char delim[], const char **sep, const char **suf)
bool BLI_string_has_word_prefix(const char *haystack, const char *needle, size_t needle_len)
int BLI_string_max_possible_word_count(const int str_len)
void BLI_str_format_byte_unit_compact(char dst[BLI_STR_FORMAT_INT64_BYTE_UNIT_COMPACT_SIZE], long long int bytes, const bool base_10)
bool BLI_string_all_words_matched(const char *name, const char *str, int(*words)[2], const int words_len)
void BLI_str_rstrip(char *str)
void BLI_str_format_byte_unit(char dst[BLI_STR_FORMAT_INT64_BYTE_UNIT_SIZE], long long int bytes, const bool base_10)
char * BLI_vsprintfN(const char *__restrict format, va_list args)
size_t BLI_str_format_int64_grouped(char dst[BLI_STR_FORMAT_INT64_GROUPED_SIZE], int64_t num)
int BLI_strcmp_ignore_pad(const char *str1, const char *str2, const char pad)
int BLI_str_index_in_array_n(const char *__restrict str, const char **__restrict str_array, const int str_array_len)
char * BLI_strcasestr(const char *s, const char *find)
int BLI_strcasecmp_natural(const char *s1, const char *s2)
int BLI_strncasecmp(const char *s1, const char *s2, size_t len)
size_t BLI_snprintf_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...)
char BLI_toupper_ascii(const char c)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...)
char * BLI_vsprintfN_with_buffer(char *fixed_buf, size_t fixed_buf_size, size_t *result_len, const char *__restrict format, va_list args)
void BLI_str_format_integer_unit(char dst[BLI_STR_FORMAT_INT32_INTEGER_UNIT_SIZE], const int number_to_format)
bool BLI_str_quoted_substr_range(const char *__restrict str, const char *__restrict prefix, int *__restrict r_start, int *__restrict r_end)
int BLI_string_find_split_words(const char *str, const size_t str_maxlen, const char delim, int r_words[][2], int words_max)
char * BLI_strdup_null(const char *str)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy)
void BLI_str_tolower_ascii(char *str, const size_t len)
size_t BLI_str_partition_ex(const char *str, const char *end, const char delim[], const char **sep, const char **suf, const bool from_right)
size_t BLI_str_rpartition(const char *str, const char delim[], const char **sep, const char **suf)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy)
size_t BLI_vsnprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format, va_list arg)
bool BLI_strn_endswith(const char *__restrict str, const char *__restrict end, size_t str_len)
char * BLI_sprintfN_with_buffer(char *fixed_buf, size_t fixed_buf_size, size_t *result_len, const char *__restrict format,...)
size_t BLI_strnlen(const char *str, const size_t maxlen)
size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const size_t src_maxncpy)
char * BLI_strncpy_ensure_pad(char *__restrict dst, const char *__restrict src, const char pad, size_t dst_maxncpy)
BLI_INLINE bool str_unescape_pair(char c_next, char *r_out)
size_t BLI_vsnprintf_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format, va_list arg)
char * BLI_sprintfN(const char *__restrict format,...)
size_t BLI_strncpy_rlen(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy)
char BLI_tolower_ascii(const char c)
bool BLI_string_elem_split_by_delim(const char *haystack, const char delim, const char *needle)
static size_t BLI_str_format_int_grouped_ex(char *src, char *dst, int num_len)
const char * BLI_str_escape_find_quote(const char *str)
const char * BLI_strchr_or_end(const char *str, const char ch)
bool BLI_str_quoted_substr(const char *__restrict str, const char *__restrict prefix, char *result, size_t result_maxncpy)
void BLI_str_toupper_ascii(char *str, const size_t len)
bool BLI_str_endswith(const char *__restrict str, const char *__restrict end)
size_t BLI_str_format_uint64_grouped(char dst[BLI_STR_FORMAT_UINT64_GROUPED_SIZE], uint64_t num)
char * BLI_strdupcat(const char *__restrict str1, const char *__restrict str2)
size_t BLI_str_unescape_ex(char *__restrict dst, const char *__restrict src, const size_t src_maxncpy, const size_t dst_maxncpy, bool *r_is_complete)
int BLI_str_rstrip_float_zero(char *str, const char pad)
char * BLI_strncat(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy)
char * BLI_strdup(const char *str)
bool BLI_str_startswith(const char *__restrict str, const char *__restrict start)
int BLI_strcaseeq(const char *a, const char *b)
int BLI_str_rstrip_digits(char *str)