From 640bf57b604b015d11c8e836df1c6001ab0c870f Mon Sep 17 00:00:00 2001 From: Max Wash Date: Fri, 11 Apr 2025 13:55:36 +0100 Subject: [PATCH] object: add b_string_substr --- object/include/blue/object/string.h | 2 +- object/string.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/object/include/blue/object/string.h b/object/include/blue/object/string.h index 9b1a813..9c23086 100644 --- a/object/include/blue/object/string.h +++ b/object/include/blue/object/string.h @@ -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_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_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_cstrf(b_string *dest, const char *format, ...); 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 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 size_t b_strlen(const char *s, b_strlen_flags flags); diff --git a/object/string.c b/object/string.c index d662ece..e1ab6e0 100644 --- a/object/string.c +++ b/object/string.c @@ -365,6 +365,28 @@ const char *b_string_ptr(const struct b_string *str) 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) { struct b_string *str = B_STRING(obj);