37 const char *__restrict substr_old,
38 const char *__restrict substr_new)
41 size_t len_old = strlen(substr_old);
48 while ((match = strstr(
str, substr_old))) {
97 while ((index = haystack.find(needle,
i)) != std::string::npos) {
98 haystack.replace(index,
size_t(needle.
size()), other);
99 i = index + size_t(other.
size());
114 const size_t string_maxncpy,
115 const char *replace_table[][2],
116 int replace_table_len)
120 for (
int i = 0;
i < replace_table_len;
i++) {
121 if (
STREQ(
string, replace_table[
i][0])) {
122 BLI_strncpy(
string, replace_table[
i][1], string_maxncpy);
130 char *
string,
size_t string_maxncpy,
int src_beg,
int src_end,
const char *dst)
132 int string_len = int(strlen(
string));
135 const int src_len = src_end - src_beg;
136 int dst_len = int(strlen(dst));
138 if (src_len < dst_len) {
142 if (
UNLIKELY(
int(string_maxncpy) <= src_beg + dst_len)) {
144 dst_len = (int(string_maxncpy) - src_beg) - 1;
145 string_len = src_end;
146 string[string_len] =
'\0';
149 const int ofs = dst_len - src_len;
151 if (string_len + ofs >=
int(string_maxncpy)) {
152 string_len = (int(string_maxncpy) - ofs) - 1;
153 string[string_len] =
'\0';
158 memmove(
string + (src_end + ofs),
string + src_end,
size_t(string_len - src_end) + 1);
161 else if (src_len > dst_len) {
163 const int ofs = src_len - dst_len;
164 memmove(
string + (src_end - ofs),
string + src_end,
size_t(string_len - src_end) + 1);
172 memcpy(
string + src_beg, dst,
size_t(dst_len));
175 return size_t(string_len);
192 if (delim_index < name_full.
size() - 1) {
194 if (!std::all_of(num_str.
begin(), num_str.
end(), ::isdigit)) {
199 r_number = std::stoi(num_str);
202 catch (std::out_of_range
const & ) {
216 BLI_strncpy(r_name_left, name_base.c_str(), name_base.size() + 1);
217 return name_base.size();
222 if (*
string ==
'\0') {
227 while (isdigit(*
string)) {
232 return *
string ==
'\0';
237 return ELEM(c,
'.',
' ',
'-',
'_');
241 const size_t string_maxlen,
251 r_body[0] = r_suf[0] =
'\0';
253 for (
i =
len;
i > 0;
i--) {
261 memcpy(r_body,
string,
len + 1);
265 const size_t string_maxlen,
275 r_body[0] = r_pre[0] =
'\0';
277 for (
i = 1;
i <
len;
i++) {
290 const char *name_src,
291 const bool strip_number,
292 const size_t name_dst_maxncpy)
297 char *prefix =
static_cast<char *
>(alloca(name_dst_maxncpy));
298 char *suffix =
static_cast<char *
>(alloca(name_dst_maxncpy));
299 char *number =
static_cast<char *
>(alloca(name_dst_maxncpy));
300 const char *replace =
nullptr;
301 char *index =
nullptr;
304 *prefix = *suffix = *number =
'\0';
314 if (isdigit(name_dst[
len - 1])) {
315 index = strrchr(name_dst,
'.');
316 if (index && isdigit(index[1])) {
317 if (strip_number ==
false) {
321 len = size_t(index - name_dst);
330 switch (name_dst[
len - 1]) {
355 switch (name_dst[0]) {
381 if (!is_set &&
len > 5) {
383 if (((index =
BLI_strcasestr(prefix,
"right")) == prefix) || (index == prefix +
len - 5)) {
385 if (index[0] ==
'r') {
389 replace = (index[1] ==
'I' ?
"LEFT" :
"Left");
394 else if (((index =
BLI_strcasestr(prefix,
"left")) == prefix) || (index == prefix +
len - 4)) {
396 if (index[0] ==
'l') {
400 replace = (index[1] ==
'E' ?
"RIGHT" :
"Right");
408 name_dst, name_dst_maxncpy,
"%s%s%s%s", prefix, replace ? replace :
"", suffix, number);
421 if (
name[0] ==
'\0') {
425 if (unique_check(
name)) {
427 char *tempname =
static_cast<char *
>(alloca(name_maxncpy));
428 char *
left =
static_cast<char *
>(alloca(name_maxncpy));
432 const size_t numlen =
SNPRINTF_UTF8(numstr,
"%c%03d", delim, ++number);
436 if (
UNLIKELY((
len == 0) || (numlen + 1 >= name_maxncpy))) {
443 memcpy(tempname_buf, numstr, numlen + 1);
445 }
while (unique_check(tempname));
455 std::string new_name =
name;
457 if (!unique_check(new_name)) {
464 new_name.c_str(), delim, left_buffer.
data(), &number);
466 const std::string
left = left_buffer.
data();
469 std::array<char, 16> num_str;
470 BLI_snprintf(num_str.data(), num_str.size(),
"%c%03d", delim, ++number);
473 new_name = num_str.data();
476 new_name =
left + num_str.data();
478 }
while (unique_check(new_name));
493 if (
ELEM(
nullptr, vlink)) {
501 const char *link_name =
POINTER_OFFSET((
const char *)link, name_offset);
502 if (
name == link_name) {
517 size_t total_len = 0;
518 for (
uint i = 0;
i < strings_num;
i++) {
519 total_len += strlen(strings[
i]);
536 size_t result_maxncpy,
537 const char *strings[],
543 char *c_end = &
result[result_maxncpy - 1];
544 for (
uint i = 0;
i < strings_num;
i++) {
545 const char *p = strings[
i];
555 return size_t(c -
result);
559 char *
result,
size_t result_maxncpy,
char sep,
const char *strings[],
uint strings_num)
564 char *c_end = &
result[result_maxncpy - 1];
565 for (
uint i = 0;
i < strings_num;
i++) {
572 const char *p = strings[
i];
582 return size_t(c -
result);
590 for (
uint i = 0;
i < strings_num;
i++) {
591 const size_t string_len = strlen(strings[
i]);
592 memcpy(c, strings[
i], string_len);
604 (strings_num ? strings_num - 1 : 0) + 1;
607 if (strings_num != 0) {
608 for (
uint i = 0;
i < strings_num;
i++) {
609 const size_t string_len = strlen(strings[
i]);
610 memcpy(c, strings[
i], string_len);
624 const char *strings[],
627 size_t result_size = 0;
628 for (
uint i = 0;
i < strings_num;
i++) {
629 result_size += strlen(strings[
i]) + 1;
631 if (result_size == 0) {
637 if (strings_num != 0) {
638 for (
uint i = 0;
i < strings_num;
i++) {
639 const size_t string_len = strlen(strings[
i]);
640 memcpy(c, strings[
i], string_len);
642 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()
#define LISTBASE_FOREACH(type, var, list)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
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(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) 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
#define SNPRINTF_UTF8(dst, format,...)
char * BLI_strncpy_utf8(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
size_t BLI_snprintf_utf8_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define POINTER_OFFSET(v, ofs)
These structs are the foundation for all linked lists in the library system.
Read Guarded memory(de)allocation.
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)
blender::StringRef BLI_string_split_name_number(const blender::StringRef name_full, const char delim, int &r_number)
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)
bool BLI_string_replace_table_exact(char *string, const size_t string_maxncpy, const char *replace_table[][2], int replace_table_len)
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)
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)
void BLI_string_replace(std::string &haystack, const blender::StringRef needle, const blender::StringRef other)
size_t BLI_string_replace_range(char *string, size_t string_maxncpy, int src_beg, int src_end, const char *dst)
void BLI_uniquename_cb(blender::FunctionRef< bool(blender::StringRefNull)> unique_check, const char *defname, char delim, char *name, size_t name_maxncpy)
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 constexpr int64_t not_found
constexpr int64_t rfind(char c, int64_t pos=INT64_MAX) const
constexpr const char * begin() const
constexpr const char * end() const
constexpr StringRef substr(int64_t start, int64_t size) const
constexpr int64_t size() const
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)