#ifndef INCLUDED__CMMM__STRING_BUILDER__H #define INCLUDED__CMMM__STRING_BUILDER__H // #define CMMM__STRING_BUILDER__STRIP_VENDOR // #define CMMM__STRING_BUILDER__SHORT_NAMESPACE #include #include #include "cmmm/dynamic-array.h" #define CMMM__STRING_BUILDER struct string_builder * struct cmmm__string_builder { union { char *items, *string; }; size_t count; size_t capacity; }; #define CMMM__STRING_BUILDER__APPEND_CHAR(SB, CHAR) \ CMMM__DYNAMIC_ARRAY__APPEND (SB, CHAR) #define CMMM__STRING_BUILDER__APPEND_BUF(SB, BUF, SIZE) \ CMMM__DYNAMIC_ARRAY__APPEND_MANY (SB, BUF, SIZE) #define CMMM__STRING_BUILDER__APPEND_CSTR(SB, CSTR) \ ({ \ const char *s = (CSTR); \ size_t n = strlen (s); \ CMMM__DYNAMIC_ARRAY__APPEND_MANY(SB, s, n); \ }) #define CMMM__STRING_BUILDER__APPEND_CSTRS(SB, ...) \ cmmm__string_builder__append_cstrs (&(SB), __VA_ARGS__, NULL) #define CMMM__STRING_BUILDER__APPEND_STRING_VIEW(SB, SV) \ CMMM__DYNAMIC_ARRAY__APPEND_MANY(SB, (SV).beg, CMMM__STRING_VIEW__LENGTH (SV)); #define CMMM__STRING_BUILDER__APPEND_NULL(SB) \ CMMM__DYNAMIC_ARRAY__APPEND (SB, '\0') #define CMMM__STRING_BUILDER__RESET(SB) CMMM__DYNAMIC_ARRAY__RESET (SB) #define CMMM__STRING_BUILDER__FREE( SB) CMMM__DYNAMIC_ARRAY__FREE ( SB) void cmmm__string_builder__append_ntimes (CMMM__STRING_BUILDER, char c, size_t n); void cmmm__string_builder__append_cstrs (CMMM__STRING_BUILDER, ...); void cmmm__string_builder__printf (CMMM__STRING_BUILDER, const char *format, ...); #ifdef CMMM__STRING_BUILDER__SHORT_NAMESPACE #define CMMM__SB_STRIP_VENDOR CMMM__STRING_BUILDER__STRIP_VENDOR #define CMMM__SB_SHORT_NAMESPACE CMMM__STRING_BUILDER__SHORT_NAMESPACE #define CMMM__SB CMMM__STRING_BUILDER #define cmmm__sb cmmm__string_builder #define CMMM__SB_APPEND_CHAR CMMM__STRING_BUILDER__APPEND_CHAR #define CMMM__SB_APPEND_BUF CMMM__STRING_BUILDER__APPEND_BUF #define CMMM__SB_APPEND_CSTR CMMM__STRING_BUILDER__APPEND_CSTR #define CMMM__SB_APPEND_CSTRS CMMM__STRING_BUILDER__APPEND_CSTRS #define CMMM__SB_APPEND_STRING_VIEW CMMM__STRING_BUILDER__APPEND_STRING_VIEW #define CMMM__SB_APPEND_NULL CMMM__STRING_BUILDER__APPEND_NULL #define CMMM__SB_RESET CMMM__STRING_BUILDER__RESET #define CMMM__SB_FREE CMMM__STRING_BUILDER__FREE #define cmmm__sb_append_ntimes cmmm__string_builder__append_ntimes #define cmmm__sb_append_cstrs cmmm__string_builder__append_cstrs #define cmmm__sb_printf cmmm__string_builder__printf #endif // CMMM__STRING_BUILDER__SHORT_NAMESPACE #ifdef CMMM__STRING_BUILDER__STRIP_VENDOR #define STRING_BUILDER__STRIP_VENDOR CMMM__STRING_BUILDER__STRIP_VENDOR #define STRING_BUILDER__SHORT_NAMESPACE CMMM__STRING_BUILDER__SHORT_NAMESPACE #define STRING_BUILDER CMMM__STRING_BUILDER #define STRING_BUILDER__APPEND_CHAR CMMM__STRING_BUILDER__APPEND_CHAR #define STRING_BUILDER__APPEND_BUF CMMM__STRING_BUILDER__APPEND_BUF #define STRING_BUILDER__APPEND_CSTR CMMM__STRING_BUILDER__APPEND_CSTR #define STRING_BUILDER__APPEND_CSTRS CMMM__STRING_BUILDER__APPEND_CSTRS #define STRING_BUILDER__APPEND_STRING_VIEW CMMM__STRING_BUILDER__APPEND_STRING_VIEW #define STRING_BUILDER__APPEND_NULL CMMM__STRING_BUILDER__APPEND_NULL #define STRING_BUILDER__RESET CMMM__STRING_BUILDER__RESET #define STRING_BUILDER__FREE CMMM__STRING_BUILDER__FREE #define string_builder__append_ntimes cmmm__string_builder__append_ntimes #define string_builder__append_cstrs cmmm__string_builder__append_cstrs #define string_builder__printf cmmm__string_builder__printf #ifdef CMMM__STRING_BUILDER__SHORT_NAMESPACE #define SB_STRIP_VENDOR CMMM__STRING_BUILDER__STRIP_VENDOR #define SB_SHORT_NAMESPACE CMMM__STRING_BUILDER__SHORT_NAMESPACE #define SB CMMM__STRING_BUILDER #define SB_APPEND_CHAR CMMM__STRING_BUILDER__APPEND_CHAR #define SB_APPEND_BUF CMMM__STRING_BUILDER__APPEND_BUF #define SB_APPEND_CSTR CMMM__STRING_BUILDER__APPEND_CSTR #define SB_APPEND_CSTRS CMMM__STRING_BUILDER__APPEND_CSTRS #define SB_APPEND_STRING_VIEW CMMM__STRING_BUILDER__APPEND_STRING_VIEW #define SB_APPEND_NULL CMMM__STRING_BUILDER__APPEND_NULL #define SB_RESET CMMM__STRING_BUILDER__RESET #define SB_FREE CMMM__STRING_BUILDER__FREE #define sb_append_ntimes cmmm__string_builder__append_ntimes #define sb_append_cstrs cmmm__string_builder__append_cstrs #define sb_printf cmmm__string_builder__printf #endif // CMMM__STRING_BUILDER__SHORT_NAMESPACE #endif // CMMM__STRING_BUILDER__STRIP_VENDOR #endif // INCLUDED__STRING_BUILDER__H