// #TODO: Integrate Allocator / context.allocator #include "Base_String.h" #include "General_Purpose_Allocator.h" #include // vsnprintf #include // va_list, ... bool is_c_string(string n_string) { return (n_string.data && n_string.data[n_string.count] == '\0'); } bool is_valid(string n_string) { return (n_string.data != nullptr && n_string.count > 0); } string format_string(char* format, ...) { constexpr s64 BUFFER_SIZE = 1024; string str = {0}; str.data = ALLOCATE_RAW_ARRAY(BUFFER_SIZE, u8); va_list args; va_start(args, format); // Note that this *is* null-terminated for compatibility. str.count = (s64)vsnprintf((char*)str.data, (size_t)BUFFER_SIZE, format, args); va_end(args); return str; } string copy_string(string original_string) { string str = {0}; str.data = ALLOCATE_RAW_ARRAY(original_string.count + 1, u8); memcpy(str.data, original_string.data, original_string.count); str.count = original_string.count; return str; } string copy_string(char* c_string) { string str = {0}; s64 string_length = strlen(c_string); str.data = ALLOCATE_RAW_ARRAY(string_length + 1, u8); memcpy(str.data, c_string, string_length); str.count = string_length; return str; } bool strings_match(string first_string, string second_string) { if (first_string.count != second_string.count) { return false; } for (s64 i = 0; i < first_string.count; i += 1) { if (first_string.data[i] != second_string.data[i]) { return false; } } return true; } string string_from_literal(char* literal) { string new_string; new_string.count = strlen(literal); new_string.data = (u8*) literal; return new_string; } void free(string& n_string) { // #TODO: Get context allocator? GPAllocator_Delete(n_string.data); n_string.data = nullptr; n_string.count = 0; }