object: add b_string_substr

This commit is contained in:
2025-04-11 13:55:36 +01:00
parent a627116264
commit 640bf57b60
2 changed files with 23 additions and 1 deletions

View File

@@ -37,7 +37,6 @@ BLUE_API b_status b_string_replace_all(b_string *str, const char *new_data);
BLUE_API void b_string_append_s(b_string *dest, const b_string *src); BLUE_API void b_string_append_s(b_string *dest, const b_string *src);
BLUE_API void b_string_append_cstr(b_string *dest, const char *src); BLUE_API void b_string_append_cstr(b_string *dest, const char *src);
BLUE_API void b_string_append_cstrf(b_string *dest, const char *format, ...); BLUE_API void b_string_append_cstrf(b_string *dest, const char *format, ...);
BLUE_API void b_string_prepend_s(b_string *dest, const b_string *src);
BLUE_API void b_string_prepend_cstr(b_string *dest, const char *src); BLUE_API void b_string_prepend_cstr(b_string *dest, const char *src);
BLUE_API void b_string_prepend_cstrf(b_string *dest, const char *format, ...); BLUE_API void b_string_prepend_cstrf(b_string *dest, const char *format, ...);
BLUE_API void b_string_insert_s(b_string *dest, const b_string *src, size_t at); BLUE_API void b_string_insert_s(b_string *dest, const b_string *src, size_t at);
@@ -57,6 +56,7 @@ BLUE_API char b_string_back(const b_string *str);
BLUE_API void b_string_pop_back(b_string *str); BLUE_API void b_string_pop_back(b_string *str);
BLUE_API const char *b_string_ptr(const b_string *str); BLUE_API const char *b_string_ptr(const b_string *str);
BLUE_API b_string *b_string_substr(const b_string *str, size_t start, size_t len);
BLUE_API char *b_strdup(const char *s); BLUE_API char *b_strdup(const char *s);
BLUE_API size_t b_strlen(const char *s, b_strlen_flags flags); BLUE_API size_t b_strlen(const char *s, b_strlen_flags flags);

View File

@@ -365,6 +365,28 @@ const char *b_string_ptr(const struct b_string *str)
return str->s_data.d_external; return str->s_data.d_external;
} }
struct b_string *b_string_substr(const struct b_string *str, size_t start, size_t len)
{
if (start > b_string_get_size(str, B_STRLEN_NORMAL)) {
return NULL;
}
if (start + len > b_string_get_size(str, B_STRLEN_NORMAL)) {
len = b_string_get_size(str, B_STRLEN_NORMAL) - start;
}
struct b_string *newstr = b_string_create();
b_string_reserve(newstr, len);
const char *src = b_string_ptr(str) + start;
char *dest = string_ptr(newstr);
memcpy(dest, src, len);
newstr->s_len = len;
return newstr;
}
static void string_release(struct b_object *obj) static void string_release(struct b_object *obj)
{ {
struct b_string *str = B_STRING(obj); struct b_string *str = B_STRING(obj);