40 # pragma GCC diagnostic error "-Wsign-conversion"
81 char *
BLI_strdupcat(
const char *__restrict str1,
const char *__restrict str2)
84 const size_t str1_len = strlen(str1);
85 const size_t str2_len = strlen(str2) + 1;
91 memcpy(s, str1, str1_len);
93 memcpy(s, str2, str2_len);
108 char *
BLI_strncpy(
char *__restrict dst,
const char *__restrict src,
const size_t maxncpy)
114 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
117 memcpy(dst, src, srclen);
133 const char *__restrict src,
140 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
143 if (src[0] ==
'\0') {
151 if (src[idx] != pad) {
158 if ((src[srclen - 1] != pad) && (srclen == maxncpy)) {
162 memcpy(&dst[idx], src, srclen);
165 if (dst[idx - 1] != pad) {
187 size_t BLI_strncpy_rlen(
char *__restrict dst,
const char *__restrict src,
const size_t maxncpy)
193 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
196 memcpy(dst, src, srclen);
203 size_t srclen = strlen(src);
204 memcpy(dst, src, srclen + 1);
213 const char *__restrict
format,
224 if (n != -1 && n < maxncpy) {
228 buffer[maxncpy - 1] =
'\0';
239 const char *__restrict
format,
250 if (n != -1 && n < maxncpy) {
270 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
289 memset(dst, 0xff,
sizeof(*dst) * maxncpy);
333 size_t BLI_str_escape(
char *__restrict dst,
const char *__restrict src,
const size_t dst_maxncpy)
339 for (; (
len < dst_maxncpy) && (*src !=
'\0'); dst++, src++,
len++) {
341 if (
ELEM(
c,
'\\',
'"') ||
342 ((
c ==
'\t') && ((
void)(
c =
't'),
true)) ||
343 ((
c ==
'\n') && ((void)(
c =
'n'),
true)) ||
344 ((
c ==
'\r') && ((
void)(
c =
'r'),
true)) ||
345 ((
c ==
'\a') && ((void)(
c =
'a'),
true)) ||
346 ((
c ==
'\b') && ((
void)(
c =
'b'),
true)) ||
347 ((
c ==
'\f') && ((void)(
c =
'f'),
true)))
375 size_t BLI_str_unescape(
char *__restrict dst,
const char *__restrict src,
const size_t src_maxncpy)
378 for (
size_t i = 0; i < src_maxncpy && (*src !=
'\0'); i++, src++) {
381 char c_next = *(src + 1);
382 if (((c_next ==
'"') && ((void)(
c =
'"'),
true)) ||
383 ((c_next ==
'\\') && ((
void)(
c =
'\\'),
true)) ||
384 ((c_next ==
't') && ((void)(
c =
'\t'),
true)) ||
385 ((c_next ==
'n') && ((
void)(
c =
'\n'),
true)) ||
386 ((c_next ==
'r') && ((void)(
c =
'\r'),
true)) ||
387 ((c_next ==
'a') && ((
void)(
c =
'\a'),
true)) ||
388 ((c_next ==
'b') && ((void)(
c =
'\b'),
true)) ||
389 ((c_next ==
'f') && ((
void)(
c =
'\f'),
true)))
413 while (*
str && (*
str !=
'"' || escape)) {
416 escape = (escape ==
false) && (*
str ==
'\\');
434 const char *start_match, *end_match;
438 start_match = strstr(
str, prefix);
440 const size_t prefix_len = strlen(prefix);
441 start_match += prefix_len + 1;
445 const size_t escaped_len = (size_t)(end_match - start_match);
448 if (unescaped_len != escaped_len) {
471 const char *__restrict substr_old,
472 const char *__restrict substr_new)
475 size_t len_old = strlen(substr_old);
482 while ((match = strstr(
str, substr_old))) {
550 const size_t string_len,
551 const char *replace_table[][2],
552 int replace_table_len)
554 for (
int i = 0; i < replace_table_len; i++) {
555 if (
STREQ(
string, replace_table[i][0])) {
556 BLI_strncpy(
string, replace_table[i][1], string_len);
583 if ((
c = *find++) != 0) {
588 if ((sc = *s++) == 0) {
601 return (str_len / 2) + 1;
608 if ((match == haystack) || (*(match - 1) ==
' ') || ispunct(*(match - 1))) {
622 for (index = 0; index < words_len; index++) {
627 const bool all_words_matched = (index == words_len);
629 return all_words_matched;
639 if ((
c = *find++) != 0) {
644 if ((sc = *s++) == 0) {
654 if ((sc = *s++) == 0) {
694 for (i = 0; i <
len; i++) {
715 const char *p1 = s1, *p2 = s2;
716 int numdigit, numzero1, numzero2;
719 for (numzero1 = 0; *p1 ==
'0'; numzero1++) {
722 for (numzero2 = 0; *p2 ==
'0'; numzero2++) {
727 for (numdigit = 0;; numdigit++) {
728 if (isdigit(*(p1 + numdigit)) && isdigit(*(p2 + numdigit))) {
731 if (isdigit(*(p1 + numdigit))) {
734 if (isdigit(*(p2 + numdigit))) {
742 int compare = (int)strncmp(p1, p2, (
size_t)numdigit);
750 if (*tiebreaker == 0) {
751 if (numzero1 > numzero2) {
754 else if (numzero1 < numzero2) {
777 if (isdigit(s1[d1]) && isdigit(s2[d2])) {
780 if (numcompare != 0) {
786 while (isdigit(s1[d1])) {
790 while (isdigit(s2[d2])) {
796 if (
ELEM(0, s1[d1], s2[d2])) {
800 c1 = tolower(s1[d1]);
801 c2 = tolower(s2[d2]);
807 else if (c1 ==
'.') {
810 else if (c2 ==
'.') {
830 return strcmp(s1, s2);
839 size_t str1_len, str2_len;
841 while (*str1 == pad) {
844 while (*str2 == pad) {
848 str1_len = strlen(str1);
849 str2_len = strlen(str2);
851 while (str1_len && (str1[str1_len - 1] == pad)) {
854 while (str2_len && (str2[str2_len - 1] == pad)) {
858 if (str1_len == str2_len) {
859 return strncmp(str1, str2, str2_len);
861 if (str1_len > str2_len) {
862 int ret = strncmp(str1, str2, str2_len);
869 int ret = strncmp(str1, str2, str1_len);
882 for (
len = 0;
len < maxlen;
len++, s++) {
894 for (i = 0; (i <
len) &&
str[i]; i++) {
895 if (
str[i] >=
'A' &&
str[i] <=
'Z') {
905 for (i = 0; (i <
len) &&
str[i]; i++) {
906 if (
str[i] >=
'a' &&
str[i] <=
'z') {
917 for (
int i = (
int)strlen(
str) - 1; i >= 0; i--) {
918 if (isspace(
str[i])) {
938 char *p = strchr(
str,
'.');
943 end_p = p + (strlen(p) - 1);
945 while (end_p != p && *end_p ==
'0') {
965 const char **__restrict str_array,
966 const int str_array_len)
969 const char **str_iter = str_array;
971 for (index = 0; index < str_array_len; str_iter++, index++) {
989 const char **str_iter = str_array;
991 for (index = 0; *str_iter; str_iter++, index++) {
1008 for (; *
str && *start;
str++, start++) {
1009 if (*
str != *start) {
1014 return (*start ==
'\0');
1019 size_t elength = strlen(end);
1021 if (elength < slength) {
1022 const char *iter = &
str[slength - elength];
1024 if (*iter++ != *end++) {
1042 const size_t slength = strlen(
str);
1093 const bool from_right)
1096 char *(*func)(
const char *
str,
int c) = from_right ? strrchr : strchr;
1102 for (d = delim; *d !=
'\0'; d++) {
1107 for (tmp = end - 1; (tmp >=
str) && (*tmp != *d); tmp--) {
1115 tmp = func(
str, *d);
1122 tmp = func(
str, *d);
1125 if (tmp && (from_right ? (*sep < tmp) : (!*sep || *sep > tmp))) {
1132 return (
size_t)(*sep -
str);
1135 return end ? (size_t)(end -
str) : strlen(
str);
1143 const char separator =
',';
1146 if (*p_src ==
'-') {
1147 *p_dst++ = *p_src++;
1151 for (commas = 2 - num_len % 3; *p_src; commas = (commas + 1) % 3) {
1152 *p_dst++ = *p_src++;
1154 *p_dst++ = separator;
1159 return (
size_t)(p_dst - dst);
1173 int num_len = sprintf(src,
"%d", num);
1191 int num_len = sprintf(src,
"%" PRIu64 "", num);
1208 double bytes_converted = bytes;
1211 const int base = base_10 ? 1000 : 1024;
1212 const char *units_base_10[] = {
"B",
"KB",
"MB",
"GB",
"TB",
"PB"};
1213 const char *units_base_2[] = {
"B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB"};
1214 const int tot_units =
ARRAY_SIZE(units_base_2);
1218 while ((
fabs(bytes_converted) >= base) && ((
order + 1) < tot_units)) {
1219 bytes_converted /= base;
1225 const size_t dst_len = 15;
1243 const char *
str,
const size_t len,
const char delim,
int r_words[][2],
int words_max)
1246 bool charsearch =
true;
1249 for (i = 0; (i <
len) && (
str[i] !=
'\0'); i++) {
1250 if (
str[i] != delim) {
1255 for (; (i <
len) && (
str[i] !=
'\0') && (n < words_max); i++) {
1256 if ((
str[i] != delim) && (charsearch ==
true)) {
1261 if ((
str[i] == delim) && (charsearch ==
false)) {
1262 r_words[n][1] = i - r_words[n][0];
1269 if (charsearch ==
false) {
1270 r_words[n][1] = i - r_words[n][0];
#define BLI_STATIC_ASSERT(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()
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()
char * BLI_dynstr_get_cstring(DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT 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)
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
void *(* MEM_mallocN)(size_t len, const char *str)
unsigned __int64 uint64_t
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)
char * BLI_str_quoted_substrN(const char *__restrict str, const char *__restrict prefix)
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)
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_strncasestr(const char *s, const char *find, size_t len)
char * BLI_strdupn(const char *str, const size_t len)
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)
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)
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)
ccl_device_inline float2 fabs(const float2 &a)