Str8 str8(U8 *ptr, U64 length) { Assert(ptr); Str8 r = { ptr, length }; return r; } Str8 str8_range(U8 *start, U8 *end) { Str8 r = { start, end-start }; return r; } Str8 str8_from_cstr(char *cstr) { U8 *ptr = (U8 *)cstr; for (; *ptr; ++ptr); Str8 r = str8_range((U8 *)cstr, ptr); return r; } char *str8_to_cstr(Arena *arena, Str8 s) { U64 length = s.length+1; char *r = arena_push(arena, length*sizeof(U8)); MemoryCopy(r, s.ptr, length*sizeof(U8)); *(r+s.length) = 0; return r; } Str8 str8_chop_end(Str8 s, U64 count) { U64 length = s.length-ClampTop(count, s.length); Str8 r = str8(s.ptr, length); return r; } Str8 str8_chop_start(Str8 s, U64 count) { U64 clamped = ClampTop(count, s.length); U64 length = s.length-ClampTop(count, s.length); Str8 r = str8(s.ptr+clamped, length); return r; } Str8 str8_pushfv(Arena *arena, char *fmt, va_list args) { Str8 r = {0}; va_list args2; va_copy(args2, args); U32 buf_size = 1024; U8 *buf = arena_push(arena, buf_size); S32 n = vsnprintf((char *)buf, buf_size, fmt, args); va_end(args2); if (n > 0) r = str8(buf, n); return r; } Str8 str8_pushf(Arena *arena, char *fmt, ...) { va_list args; va_start(args, fmt); Str8 r = str8_pushfv(arena, fmt, args); va_end(args); return r; } void str8print(Str8 s) { for (U64 i = 0; i < s.length; ++i) printf("%c", (char)(*(s.ptr+i))); } Str8List *str8_list(Arena *arena) { Str8List *list = arena_push(arena, sizeof(Str8List)); MemoryZero(list, sizeof(Str8List)); return list; } void str8_list_push(Arena *arena, Str8List *list, Str8 str, B32 to_front) { Assert(arena && list); Str8Node *n = arena_push(arena, sizeof(Str8Node)); n->str = str; if (to_front) DLLPushFront(list->first, list->last, n); else DLLPushBack(list->first, list->last, n); list->total_length += str.length; list->node_count++; } void str8_list_pushf(Arena *arena, Str8List *list, B32 to_front, char *fmt, ...) { va_list args; va_start(args, fmt); Str8 str = str8_pushfv(arena, fmt, args); va_end(args); str8_list_push(arena, list, str, to_front); } void str8_list_print(Str8List *list) { for (Str8Node *n = list->first; n; n = n->next) { str8print(n->str); printf("%s", (n->next) ? " -> " : "\n"); } }