34 const char *__restrict substr_old,
35 const char *__restrict substr_new)
38 size_t len_old = strlen(substr_old);
45 while ((match = strstr(
str, substr_old))) {
99 const size_t string_len,
100 const char *replace_table[][2],
101 int replace_table_len)
105 for (
int i = 0; i < replace_table_len; i++) {
106 if (
STREQ(
string, replace_table[i][0])) {
107 BLI_strncpy(
string, replace_table[i][1], string_len);
115 char *
string,
size_t string_maxncpy,
int src_beg,
int src_end,
const char *dst)
117 int string_len =
int(strlen(
string));
120 const int src_len = src_end - src_beg;
121 int dst_len =
int(strlen(dst));
123 if (src_len < dst_len) {
127 if (
UNLIKELY(
int(string_maxncpy) <= src_beg + dst_len)) {
129 dst_len = (
int(string_maxncpy) - src_beg) - 1;
130 string_len = src_end;
131 string[string_len] =
'\0';
134 const int ofs = dst_len - src_len;
136 if (string_len + ofs >=
int(string_maxncpy)) {
137 string_len = (
int(string_maxncpy) - ofs) - 1;
138 string[string_len] =
'\0';
143 memmove(
string + (src_end + ofs),
string + src_end,
size_t(string_len - src_end) + 1);
146 else if (src_len > dst_len) {
148 const int ofs = src_len - dst_len;
149 memmove(
string + (src_end - ofs),
string + src_end,
size_t(string_len - src_end) + 1);
157 memcpy(
string + src_beg, dst,
size_t(dst_len));
160 return size_t(string_len);
170 const size_t name_len = strlen(name);
173 memcpy(r_name_left, name, (name_len + 1) *
sizeof(
char));
176 if ((name_len > 1 && name[name_len - 1] == delim) == 0) {
179 if (name[a] == delim) {
180 r_name_left[a] =
'\0';
181 *r_number =
int(atol(name + a + 1));
188 if (isdigit(name[a]) == 0) {
200 if (*
string ==
'\0') {
205 while (isdigit(*
string)) {
210 return *
string ==
'\0';
215 return ELEM(c,
'.',
' ',
'-',
'_');
219 const size_t string_maxlen,
229 r_body[0] = r_suf[0] =
'\0';
231 for (i =
len; i > 0; i--) {
239 memcpy(r_body,
string,
len + 1);
243 const size_t string_maxlen,
253 r_body[0] = r_pre[0] =
'\0';
255 for (i = 1; i <
len; i++) {
268 const char *name_src,
269 const bool strip_number,
270 const size_t name_dst_maxncpy)
275 char *prefix =
static_cast<char *
>(alloca(name_dst_maxncpy));
276 char *suffix =
static_cast<char *
>(alloca(name_dst_maxncpy));
277 char *number =
static_cast<char *
>(alloca(name_dst_maxncpy));
278 const char *replace =
nullptr;
279 char *index =
nullptr;
282 *prefix = *suffix = *number =
'\0';
292 if (isdigit(name_dst[
len - 1])) {
293 index = strrchr(name_dst,
'.');
294 if (index && isdigit(index[1])) {
295 if (strip_number ==
false) {
308 switch (name_dst[
len - 1]) {
333 switch (name_dst[0]) {
336 BLI_strncpy(suffix, name_dst + 1, name_dst_maxncpy);
341 BLI_strncpy(suffix, name_dst + 1, name_dst_maxncpy);
346 BLI_strncpy(suffix, name_dst + 1, name_dst_maxncpy);
351 BLI_strncpy(suffix, name_dst + 1, name_dst_maxncpy);
359 if (!is_set &&
len > 5) {
361 if (((index =
BLI_strcasestr(prefix,
"right")) == prefix) || (index == prefix +
len - 5)) {
363 if (index[0] ==
'r') {
367 replace = (index[1] ==
'I' ?
"LEFT" :
"Left");
372 else if (((index =
BLI_strcasestr(prefix,
"left")) == prefix) || (index == prefix +
len - 4)) {
374 if (index[0] ==
'l') {
378 replace = (index[1] ==
'E' ?
"RIGHT" :
"Right");
386 name_dst, name_dst_maxncpy,
"%s%s%s%s", prefix, replace ? replace :
"", suffix, number);
400 if (name[0] ==
'\0') {
404 if (unique_check(arg, name)) {
406 char *tempname =
static_cast<char *
>(alloca(name_maxncpy));
407 char *left =
static_cast<char *
>(alloca(name_maxncpy));
411 const size_t numlen =
SNPRINTF(numstr,
"%c%03d", delim, ++number);
415 if (
UNLIKELY((
len == 0) || (numlen + 1 >= name_maxncpy))) {
422 memcpy(tempname_buf, numstr, numlen + 1);
424 }
while (unique_check(arg, tempname));
434 std::string new_name = name;
436 if (!unique_check(new_name)) {
443 new_name.c_str(), delim, left_buffer.
data(), &number);
445 const std::string left = left_buffer.
data();
448 std::array<char, 16> num_str;
449 BLI_snprintf(num_str.data(), num_str.size(),
"%c%03d", delim, ++number);
452 new_name = num_str.data();
455 new_name = left + num_str.data();
457 }
while (unique_check(new_name));
476 for (
Link *link =
static_cast<Link *
>(list->first); link; link = link->next) {
478 if (
STREQ(
static_cast<const char *
>(
POINTER_OFFSET((
const char *)link, name_offset)), name))
511 data.name_offset = name_offset;
516 if (
ELEM(
nullptr, vlink)) {
530 size_t total_len = 0;
531 for (
uint i = 0; i < strings_num; i++) {
532 total_len += strlen(strings[i]);
549 size_t result_maxncpy,
550 const char *strings[],
556 char *c_end = &result[result_maxncpy - 1];
557 for (
uint i = 0; i < strings_num; i++) {
558 const char *p = strings[i];
568 return size_t(c - result);
572 char *result,
size_t result_maxncpy,
char sep,
const char *strings[],
uint strings_num)
577 char *c_end = &result[result_maxncpy - 1];
578 for (
uint i = 0; i < strings_num; i++) {
585 const char *p = strings[i];
595 return size_t(c - result);
601 char *result = MEM_cnew_array<char>(result_size, __func__);
603 for (
uint i = 0; i < strings_num; i++) {
604 const size_t string_len = strlen(strings[i]);
605 memcpy(c, strings[i], string_len);
617 (strings_num ? strings_num - 1 : 0) + 1;
618 char *result = MEM_cnew_array<char>(result_size, __func__);
620 if (strings_num != 0) {
621 for (
uint i = 0; i < strings_num; i++) {
622 const size_t string_len = strlen(strings[i]);
623 memcpy(c, strings[i], string_len);
637 const char *strings[],
640 size_t result_size = 0;
641 for (
uint i = 0; i < strings_num; i++) {
642 result_size += strlen(strings[i]) + 1;
644 if (result_size == 0) {
648 char *result = MEM_cnew_array<char>(result_size, __func__);
650 if (strings_num != 0) {
651 for (
uint i = 0; i < strings_num; i++) {
652 const size_t string_len = strlen(strings[i]);
653 memcpy(c, strings[i], string_len);
655 memcpy(c, strings[i], string_len);
A dynamically sized string ADT.
char * BLI_dynstr_get_cstring(const DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_dynstr_nappend(DynStr *__restrict ds, const char *cstr, int len) ATTR_NONNULL()
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_dynstr_free(DynStr *ds) ATTR_NONNULL()
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr) ATTR_NONNULL()
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define SNPRINTF(dst, format,...)
int char char int int int int size_t BLI_strnlen(const char *str, size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define BLI_string_debug_size_after_nil(str, str_maxncpy)
#define BLI_string_debug_size(str, str_maxncpy)
size_t BLI_snprintf_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char char size_t BLI_strncpy_rlen(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int char * BLI_strcasestr(const char *s, const char *find) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
char size_t BLI_strncpy_utf8_rlen(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
bool(*)(void *arg, const char *name) UniquenameCheckCallback
#define POINTER_OFFSET(v, ofs)
These structs are the foundation for all linked lists in the library system.
Read Guarded memory(de)allocation.
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
size_t BLI_string_split_name_number(const char *name, const char delim, char *r_name_left, int *r_number)
bool BLI_string_replace_table_exact(char *string, const size_t string_len, const char *replace_table[][2], int replace_table_len)
char * BLI_string_replaceN(const char *__restrict str, const char *__restrict substr_old, const char *__restrict substr_new)
static bool is_char_sep(const char c)
void BLI_string_split_suffix(const char *string, const size_t string_maxlen, char *r_body, char *r_suf)
char * BLI_string_join_array_by_sep_charN(char sep, const char *strings[], uint strings_num)
static bool uniquename_find_dupe(const ListBase *list, void *vlink, const char *name, int name_offset)
char * BLI_string_join_array_by_sep_char_with_tableN(char sep, char *table[], const char *strings[], uint strings_num)
void BLI_uniquename(const ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy)
void BLI_uniquename_cb(UniquenameCheckCallback unique_check, void *arg, const char *defname, char delim, char *name, size_t name_maxncpy)
size_t BLI_string_join_array_by_sep_char(char *result, size_t result_maxncpy, char sep, const char *strings[], uint strings_num)
void BLI_string_split_prefix(const char *string, const size_t string_maxlen, char *r_pre, char *r_body)
void BLI_string_replace_char(char *str, char src, char dst)
size_t BLI_string_join_array(char *result, size_t result_maxncpy, const char *strings[], uint strings_num)
size_t BLI_string_replace_range(char *string, size_t string_maxncpy, int src_beg, int src_end, const char *dst)
char * BLI_string_join_arrayN(const char *strings[], uint strings_num)
size_t BLI_string_len_array(const char *strings[], uint strings_num)
size_t BLI_string_flip_side_name(char *name_dst, const char *name_src, const bool strip_number, const size_t name_dst_maxncpy)
bool BLI_string_is_decimal(const char *string)
static bool uniquename_unique_check(void *arg, const char *name)