#ifndef SCUFCONT_DSTRING_H_ #define SCUFCONT_DSTRING_H_ #include #include #include "scufcont.h" #define SCDSTRING_FMT(dstr) (int) (dstr).len, (dstr).data #define SCDString_is_null(dstr) ((dstr)->data == NULL) #define SCDString_c_str(dstr) ((dstr)->data) typedef struct { char *data; size_t len; size_t capacity; } SCDString; /** @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_alloc(SCDString *const dstr, const char *str, const size_t len); /** @param dstr Must not be allocated with any of the alloc functions. This functions allocates it. @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_alloc_copy(SCDString *const dstr, const SCDString *const o); /** @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_reserve(SCDString *const dstr, const size_t new_capacity); void SCDString_free(SCDString *const dstr); /** @param dst Must have been allocated with one of the allocation functions. @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_copy(const SCDString *const src, SCDString *const dst); bool SCDString_equal(const SCDString *const s1, const SCDString *s2); bool SCDString_equal_c_str(const SCDString *const s1, const char *s2); bool SCDString_equal_next_chars_c_str( const SCDString *const dstr, const char *str, const size_t str_len, const size_t s ); /** @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_concat_char(SCDString *const dstr, const char ch); /** @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_concat_c_str( SCDString *const dstr, const char *str, const size_t str_len ); /** @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_alloc_concat_c_strs( SCDString *const dstr, const char *s1, const size_t s1_len, const char *s2, const size_t s2_len ); /** @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_split( const SCDString *const dstr, const char *delim, SCDString **const split_arr, size_t *const arr_len ); void SCDString_split_arr_free(SCDString **const arr, const size_t arr_len); /** @return SCUFCONT_OUT_OF_BOUNDS @return SCUFCONT_SUCCESS */ ScufContResult SCDString_char_mod(SCDString *const dstr, const size_t at, const char ch); /** @return SCUFCONT_OUT_OF_BOUNDS @return SCUFCONT_SUCCESS */ ScufContResult SCDString_char_remove_no_resize(SCDString *const dstr, const size_t at); /** @return SCUFCONT_OUT_OF_BOUNDS @return SCUFCONT_SUCCESS */ ScufContResult SCDString_char_remove(SCDString *const dstr, const size_t at); /** @return SCUFCONT_OUT_OF_BOUNDS @return SCUFCONT_OUT_OF_MEMORY @return SCUFCONT_SUCCESS */ ScufContResult SCDString_char_insert(SCDString *const dstr, const size_t at, const char ch); #endif // SCUFCONT_DSTRING_H_