Musa-Cpp-Lib-V2/lib/Base/String.cpp
2025-11-19 22:00:36 -05:00

82 lines
1.8 KiB
C++

// #TODO: Integrate Allocator / context.allocator
#include "Base_String.h"
#include "General_Purpose_Allocator.h"
#include <stdio.h> // vsnprintf
#include <cstdarg> // 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;
}