#ifndef BLUELIB_STRING_H_ #define BLUELIB_STRING_H_ #include #include #include #include struct b_stream; #define B_STRING(p) ((b_string *)(p)) #define B_CSTR(s) (b_string_create_from_cstr(s)) #define B_RV_CSTR(s) (B_RV(b_string_create_from_cstr(s))) typedef struct b_string b_string; typedef enum b_strlen_flags { B_STRLEN_NORMAL = 0, B_STRLEN_IGNORE_ESC = 0x01u, B_STRLEN_IGNORE_MOD = 0x02u, } b_strlen_flags; BLUE_API b_string *b_string_create(void); BLUE_API b_string *b_string_create_from_cstr(const char *s); BLUE_API b_string *b_string_create_from_c(char c, size_t count); BLUE_API b_string *b_string_duplicate(const b_string *str); static inline b_string *b_string_retain(b_string *str) { return B_STRING(b_retain(B_OBJECT(str))); } static inline void b_string_release(b_string *str) { b_release(B_OBJECT(str)); } BLUE_API char *b_string_steal(b_string *str); BLUE_API b_status b_string_reserve(b_string *str, size_t capacity); BLUE_API b_status b_string_replace( b_string *str, size_t start, size_t length, const char *new_data); BLUE_API b_status b_string_replace_all(b_string *str, const char *new_data); BLUE_API b_status b_string_remove(b_string *str, size_t start, size_t length); BLUE_API b_status b_string_transform(b_string *str, int (*transformer)(int)); static inline b_status b_string_toupper(b_string *str) { return b_string_transform(str, toupper); } static inline b_status b_string_tolower(b_string *str) { return b_string_transform(str, tolower); } BLUE_API b_status b_string_open_stream(b_string *str, struct b_stream **out); 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_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); BLUE_API void b_string_insert_cstr(b_string *dest, const char *src, size_t at); BLUE_API void b_string_insert_cstrn( b_string *dest, const char *src, size_t len, size_t at); BLUE_API void b_string_insert_cstrf( b_string *dest, size_t at, const char *format, ...); BLUE_API void b_string_clear(b_string *str); BLUE_API size_t b_string_get_size(const b_string *str, b_strlen_flags flags); BLUE_API size_t b_string_get_capacity(const b_string *str); BLUE_API char b_string_front(const b_string *str); 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); BLUE_API uint64_t b_cstr_hash(const char *s); #endif