24 # pragma GCC diagnostic error "-Wsign-conversion"
47 char *
BLI_strdupcat(
const char *__restrict str1,
const char *__restrict str2)
50 const size_t str1_len = strlen(str1);
51 const size_t str2_len = strlen(str2) + 1;
57 memcpy(s, str1, str1_len);
59 memcpy(s, str2, str2_len);
64 char *
BLI_strncpy(
char *__restrict dst,
const char *__restrict
src,
const size_t maxncpy)
70 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
73 memcpy(dst,
src, srclen);
79 const char *__restrict
src,
86 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
104 if ((
src[srclen - 1] !=
pad) && (srclen == maxncpy)) {
108 memcpy(&dst[idx],
src, srclen);
111 if (dst[idx - 1] !=
pad) {
126 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
129 memcpy(dst,
src, srclen);
136 size_t srclen = strlen(
src);
137 memcpy(dst,
src, srclen + 1);
149 const char *__restrict
format,
160 if (n != -1 && n < maxncpy) {
164 buffer[maxncpy - 1] =
'\0';
172 const char *__restrict
format,
183 if (n != -1 && n < maxncpy) {
200 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
216 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
250 size_t BLI_str_escape(
char *__restrict dst,
const char *__restrict
src,
const size_t dst_maxncpy)
256 for (; (
len < dst_maxncpy) && (*
src !=
'\0'); dst++,
src++,
len++) {
258 if (
ELEM(
c,
'\\',
'"') ||
259 ((
c ==
'\t') && ((
void)(
c =
't'),
true)) ||
260 ((
c ==
'\n') && ((
void)(
c =
'n'),
true)) ||
261 ((
c ==
'\r') && ((
void)(
c =
'r'),
true)) ||
262 ((
c ==
'\a') && ((
void)(
c =
'a'),
true)) ||
263 ((
c ==
'\b') && ((
void)(
c =
'b'),
true)) ||
264 ((
c ==
'\f') && ((
void)(
c =
'f'),
true)))
282 #define CASE_PAIR(value_src, value_dst) \
284 *r_out = value_dst; \
302 const char *__restrict
src,
303 const size_t src_maxncpy,
305 const size_t dst_maxncpy,
309 bool is_complete =
true;
310 const size_t max_strlen = dst_maxncpy - 1;
311 for (
const char *src_end =
src + src_maxncpy; (
src < src_end) && *
src;
src++) {
323 *r_is_complete = is_complete;
330 for (
const char *src_end =
src + src_maxncpy; (
src < src_end) && *
src;
src++) {
344 while (*
str && (*
str !=
'"' || escape)) {
347 escape = (escape ==
false) && (*
str ==
'\\');
360 const char *__restrict prefix,
361 int *__restrict r_start,
362 int *__restrict r_end)
364 const char *str_start = strstr(
str, prefix);
365 if (str_start ==
NULL) {
368 const size_t prefix_len = strlen(prefix);
371 "Zero length prefix passed in, "
372 "caller must prevent this from happening!");
376 "Prefix includes trailing quote, "
377 "caller must prevent this from happening!");
379 str_start += prefix_len;
389 *r_start = (int)(str_start -
str);
390 *r_end = (int)(str_end -
str);
408 char *BLI_str_quoted_substrN(
const char *__restrict
str,
const char *__restrict prefix)
410 int start_match_ofs, end_match_ofs;
414 const size_t escaped_len = (size_t)(end_match_ofs - start_match_ofs);
417 if (unescaped_len != escaped_len) {
425 const char *__restrict prefix,
427 size_t result_maxlen)
429 int start_match_ofs, end_match_ofs;
433 const size_t escaped_len = (size_t)(end_match_ofs - start_match_ofs);
436 if (is_complete ==
false) {
449 const char *__restrict substr_old,
450 const char *__restrict substr_new)
453 size_t len_old = strlen(substr_old);
460 while ((match = strstr(
str, substr_old))) {
514 const size_t string_len,
515 const char *replace_table[][2],
516 int replace_table_len)
518 for (
int i = 0; i < replace_table_len; i++) {
519 if (
STREQ(
string, replace_table[i][0])) {
520 BLI_strncpy(
string, replace_table[i][1], string_len);
543 if ((
c = *find++) != 0) {
548 if ((sc = *s++) == 0) {
561 return (str_len / 2) + 1;
568 if ((match == haystack) || (*(match - 1) ==
' ') || ispunct(*(match - 1))) {
582 for (index = 0; index < words_len; index++) {
587 const bool all_words_matched = (index == words_len);
589 return all_words_matched;
596 if ((
c = *find++) != 0) {
601 if ((sc = *s++) == 0) {
611 if ((sc = *s++) == 0) {
651 for (i = 0; i <
len; i++) {
672 const char *p1 = s1, *p2 = s2;
673 int numdigit, numzero1, numzero2;
676 for (numzero1 = 0; *p1 ==
'0'; numzero1++) {
679 for (numzero2 = 0; *p2 ==
'0'; numzero2++) {
684 for (numdigit = 0;; numdigit++) {
685 if (isdigit(*(p1 + numdigit)) && isdigit(*(p2 + numdigit))) {
688 if (isdigit(*(p1 + numdigit))) {
691 if (isdigit(*(p2 + numdigit))) {
699 int compare = (int)strncmp(p1, p2, (
size_t)numdigit);
707 if (*tiebreaker == 0) {
708 if (numzero1 > numzero2) {
711 else if (numzero1 < numzero2) {
730 if (isdigit(s1[d1]) && isdigit(s2[d2])) {
733 if (numcompare != 0) {
739 while (isdigit(s1[d1])) {
743 while (isdigit(s2[d2])) {
749 if (
ELEM(0, s1[d1], s2[d2])) {
753 c1 = tolower(s1[d1]);
754 c2 = tolower(s2[d2]);
760 else if (c1 ==
'.') {
763 else if (c2 ==
'.') {
783 return strcmp(s1, s2);
788 size_t str1_len, str2_len;
790 while (*str1 ==
pad) {
793 while (*str2 ==
pad) {
797 str1_len = strlen(str1);
798 str2_len = strlen(str2);
800 while (str1_len && (str1[str1_len - 1] ==
pad)) {
803 while (str2_len && (str2[str2_len - 1] ==
pad)) {
807 if (str1_len == str2_len) {
808 return strncmp(str1, str2, str2_len);
810 if (str1_len > str2_len) {
811 int ret = strncmp(str1, str2, str2_len);
818 int ret = strncmp(str1, str2, str1_len);
833 const char **__restrict str_array,
834 const int str_array_len)
837 const char **str_iter = str_array;
839 for (index = 0; index < str_array_len; str_iter++, index++) {
850 const char **str_iter = str_array;
852 for (index = 0; *str_iter; str_iter++, index++) {
862 for (; *
str && *start;
str++, start++) {
863 if (*
str != *start) {
868 return (*start ==
'\0');
873 size_t elength = strlen(end);
875 if (elength < slength) {
876 const char *iter = &
str[slength - elength];
878 if (*iter++ != *end++) {
889 const size_t slength = strlen(
str);
903 for (
len = 0;
len < maxlen;
len++, s++) {
919 return (
c >=
'A' &&
c <=
'Z') ?
c + (
'a' -
'A') :
c;
924 return (
c >=
'a' &&
c <=
'z') ?
c - (
'a' -
'A') :
c;
931 for (i = 0; (i <
len) &&
str[i]; i++) {
940 for (i = 0; (i <
len) &&
str[i]; i++) {
953 for (
int i = (
int)strlen(
str) - 1; i >= 0; i--) {
954 if (isspace(
str[i])) {
965 char *p = strchr(
str,
'.');
970 end_p = p + (strlen(p) - 1);
972 while (end_p != p && *end_p ==
'0') {
1004 const bool from_right)
1007 char *(*func)(
const char *
str,
int c) = from_right ? strrchr : strchr;
1013 for (d = delim; *d !=
'\0'; d++) {
1018 for (tmp = end - 1; (tmp >=
str) && (*tmp != *d); tmp--) {
1026 tmp = func(
str, *d);
1033 tmp = func(
str, *d);
1036 if (tmp && (from_right ? (*sep < tmp) : (!*sep || *sep > tmp))) {
1043 return (
size_t)(*sep -
str);
1046 return end ? (size_t)(end -
str) : strlen(
str);
1050 const char *
str,
const size_t len,
const char delim,
int r_words[][2],
int words_max)
1053 bool charsearch =
true;
1056 for (i = 0; (i <
len) && (
str[i] !=
'\0'); i++) {
1057 if (
str[i] != delim) {
1062 for (; (i <
len) && (
str[i] !=
'\0') && (n < words_max); i++) {
1063 if ((
str[i] != delim) && (charsearch ==
true)) {
1068 if ((
str[i] == delim) && (charsearch ==
false)) {
1069 r_words[n][1] = i - r_words[n][0];
1076 if (charsearch ==
false) {
1077 r_words[n][1] = i - r_words[n][0];
1095 const char separator =
',';
1098 if (*p_src ==
'-') {
1099 *p_dst++ = *p_src++;
1103 for (commas = 2 - num_len % 3; *p_src; commas = (commas + 1) % 3) {
1104 *p_dst++ = *p_src++;
1106 *p_dst++ = separator;
1111 return (
size_t)(p_dst - dst);
1117 int num_len = sprintf(
src,
"%d", num);
1127 int num_len = sprintf(
src,
"%" PRIu64 "", num);
1134 double bytes_converted = bytes;
1137 const int base = base_10 ? 1000 : 1024;
1138 const char *units_base_10[] = {
"B",
"KB",
"MB",
"GB",
"TB",
"PB"};
1139 const char *units_base_2[] = {
"B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB"};
1140 const int units_num =
ARRAY_SIZE(units_base_2);
1144 while ((
fabs(bytes_converted) >= base) && ((
order + 1) < units_num)) {
1145 bytes_converted /= base;
1151 const size_t dst_len = 15;
1160 float number_to_format_converted = number_to_format;
1162 const float base = 1000;
1163 const char *units[] = {
"",
"K",
"M",
"B"};
1166 while ((
fabsf(number_to_format_converted) >= base) && ((
order + 1) < units_num)) {
1167 number_to_format_converted /= base;
1171 const size_t dst_len = 7;
1173 if ((
order > 0) &&
fabsf(number_to_format_converted) < 100.0f) {
1176 BLI_snprintf(dst, dst_len,
"%.*f%s", decimals, number_to_format_converted, units[
order]);
#define BLI_STATIC_ASSERT(a, msg)
#define BLI_assert_msg(a, msg)
A dynamically sized string ADT.
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_dynstr_nappend(DynStr *__restrict ds, const char *cstr, int len) ATTR_NONNULL()
char * BLI_dynstr_get_cstring(const DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_dynstr_vappendf(DynStr *__restrict ds, const char *__restrict format, va_list args) ATTR_PRINTF_FORMAT(2
void BLI_dynstr_free(DynStr *ds) ATTR_NONNULL()
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr) ATTR_NONNULL()
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint order
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
int pad[32 - sizeof(int)]
SyclQueue void void * src
SyclQueue void void size_t num_bytes void
ccl_global float * buffer
void *(* MEM_mallocN)(size_t len, const char *str)
ccl_device_inline float2 fabs(const float2 &a)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
unsigned __int64 uint64_t
bool BLI_str_quoted_substr(const char *__restrict str, const char *__restrict prefix, char *result, size_t result_maxlen)
int BLI_str_index_in_array(const char *__restrict str, const char **__restrict str_array)
void BLI_str_replace_char(char *str, char src, char dst)
#define CASE_PAIR(value_src, value_dst)
size_t BLI_snprintf_rlen(char *__restrict dst, size_t maxncpy, const char *__restrict format,...)
size_t BLI_strnlen(const char *s, const size_t maxlen)
void BLI_str_format_decimal_unit(char dst[7], int number_to_format)
bool BLI_str_replace_table_exact(char *string, const size_t string_len, const char *replace_table[][2], int replace_table_len)
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...)
static int left_number_strcmp(const char *s1, const char *s2, int *tiebreaker)
int BLI_strcasecmp(const char *s1, const char *s2)
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)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy)
bool BLI_string_all_words_matched(const char *name, const char *str, int(*words)[2], const int words_len)
char * BLI_strncpy_ensure_pad(char *__restrict dst, const char *__restrict src, const char pad, size_t maxncpy)
void BLI_str_rstrip(char *str)
size_t BLI_vsnprintf_rlen(char *__restrict buffer, size_t maxncpy, const char *__restrict format, va_list arg)
size_t BLI_strncpy_rlen(char *__restrict dst, const char *__restrict src, const size_t maxncpy)
int BLI_string_find_split_words(const char *str, const size_t len, const char delim, int r_words[][2], int words_max)
size_t BLI_str_format_int_grouped(char dst[16], int num)
char * BLI_strdup(const char *str)
size_t BLI_strcpy_rlen(char *__restrict dst, const char *__restrict src)
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_strdupcat(const char *__restrict str1, const char *__restrict str2)
int BLI_strcasecmp_natural(const char *s1, const char *s2)
int BLI_strncasecmp(const char *s1, const char *s2, size_t len)
char BLI_toupper_ascii(const char c)
char * BLI_strncasestr(const char *s, const char *find, size_t len)
char * BLI_strdupn(const char *str, const size_t len)
bool BLI_str_quoted_substr_range(const char *__restrict str, const char *__restrict prefix, int *__restrict r_start, int *__restrict r_end)
const char * BLI_str_escape_find_quote(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)
size_t BLI_vsnprintf(char *__restrict buffer, size_t maxncpy, const char *__restrict format, va_list arg)
bool BLI_strn_endswith(const char *__restrict str, const char *__restrict end, size_t slength)
void BLI_str_format_byte_unit(char dst[15], long long int bytes, const bool base_10)
size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const size_t src_maxncpy)
BLI_INLINE bool str_unescape_pair(char c_next, char *r_out)
char BLI_tolower_ascii(const char c)
size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num)
char * BLI_str_replaceN(const char *__restrict str, const char *__restrict substr_old, const char *__restrict substr_new)
void BLI_str_toupper_ascii(char *str, const size_t len)
bool BLI_str_endswith(const char *__restrict str, const char *__restrict end)
char * BLI_strcasestr(const char *s, const char *find)
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_sprintfN(const char *__restrict format,...)
bool BLI_str_startswith(const char *__restrict str, const char *__restrict start)
static size_t BLI_str_format_int_grouped_ex(char src[16], char dst[16], int num_len)
int BLI_strcaseeq(const char *a, const char *b)