#include "tlibc/string/StringBuilder.h" void StringBuilder_destroy(StringBuilder* b){ if(!b) return; free(b->buffer.data); } str StringBuilder_getStr(StringBuilder* b){ if(b->buffer.size == 0 || ((char*)b->buffer.data)[b->buffer.size - 1] != '\0'){ List_push(&b->buffer, u8, '\0'); // '\0' at the end doesn't increase buffer.size b->buffer.size -= 1; } str result = str_construct((char*)b->buffer.data, b->buffer.size, true); return result; } bool StringBuilder_equals(const StringBuilder* a, const StringBuilder* b){ str a_str = str_construct((char*)a->buffer.data, a->buffer.size, false); str b_str = str_construct((char*)b->buffer.data, b->buffer.size, false); return str_equals(a_str, b_str); } void StringBuilder_removeFromEnd(StringBuilder* b, u32 count){ if(count < b->buffer.size){ b->buffer.size -= count; } else{ b->buffer.size = 0; } } void StringBuilder_append_char(StringBuilder* b, char c){ List_push(&b->buffer, u8, c); } void StringBuilder_append_str(StringBuilder* b, str s){ if(s.data == NULL) return; List_push_size(&b->buffer, s.data, s.size); } void StringBuilder_append_cstr(StringBuilder* b, cstr s){ StringBuilder_append_str(b, str_construct((char*)(void*)s, strlen(s), true)); } void StringBuilder_append_i64(StringBuilder* b, i64 n){ char buf[32]; sprintf(buf, FMT_i64, n); StringBuilder_append_cstr(b, buf); } void StringBuilder_append_u64(StringBuilder* b, u64 n){ char buf[32]; sprintf(buf, FMT_u64, n); StringBuilder_append_cstr(b, buf); } void StringBuilder_append_f32(StringBuilder* b, f32 n){ char buf[32]; sprintf(buf, FMT_f32, n); StringBuilder_append_cstr(b, buf); } void StringBuilder_append_f64(StringBuilder* b, f64 n){ char buf[32]; sprintf(buf, FMT_f64, n); StringBuilder_append_cstr(b, buf); } void StringBuilder_append_memory(StringBuilder* b, Array(u8) mem, bool uppercase) { if(mem.data == NULL) return; char buf[8]; for (u32 i=0; i < mem.size; i++) { sprintf(buf, uppercase ? "%02X" : "%02x", ((u8*)mem.data)[i]); StringBuilder_append_str(b, str_construct(buf, 2, true)); } }