#define c_Arena_alloc_str(a, fmt, ...) c_Arena_alloc(&(a), sizeof(char)*stbsp_snprintf((a).ptr, (int)((a).buff_size - ((uint8*)(a).ptr - (uint8*)(a).buff)), (fmt), __VA_ARGS__)+1)\r
#define c_Arena_alloc_wstr(a, fmt, ...) c_Arena_alloc(&a, sizeof(char)*wprintf(a.ptr, a.buff_size - ((uint8*)a.ptr - (uint8*)a.buff), (fmt), __VA_ARGS__)+1)\r
\r
+//\r
+// String Builder\r
+//\r
+\r
+typedef struct {\r
+ char* data;\r
+ size_t size;\r
+ size_t capacity;\r
+} String_builder;\r
+\r
+void sb_append(String_builder* sb, char* data);\r
+\r
//\r
// String view\r
//\r
free(a->buff);\r
}\r
\r
+//\r
+// String Builder\r
+//\r
+\r
+void sb_append(String_builder* sb, char* data) {\r
+ size_t data_size = strlen(data);\r
+ if (sb->size + data_size > sb->capacity) {\r
+ sb->capacity *= 2;\r
+ sb->data = realloc(sb->data, sb->capacity);\r
+ }\r
+\r
+ // void *memcpy(void dest[restrict .n], const void src[restrict .n],\r
+ memcpy((uintptr_t)sb->data + (uintptr_t)sb->data, data, data_size);\r
+ sb->size += data_size;\r
+}\r
+\r
//\r
// String view\r
//\r