Str8 str8(U8 *ptr, U64 length) { Assert(ptr); Str8 r; r.ptr = ptr; r.length = length; return r; } Str8 str8range(U8 *start, U8 *end) { Str8 r; r.ptr = start; r.length = end-start; return r; } Str8 str8fromcstr(char *cstr) { U8 *ptr; Str8 r; ptr = (U8 *)cstr; for (; *ptr; ++ptr); r = str8range((U8 *)cstr, ptr); return r; } char *str8tocstr(Arena *arena, Str8 s) { U64 length; char *r; length = s.length+1; r = arena_push(arena, length*sizeof(U8)); MemoryCopy(r, s.ptr, length*sizeof(U8)); *(r+s.length) = 0; return r; } Str8 str8chopend(Str8 s, U64 count) { U64 length; Str8 r; length = s.length-ClampTop(count, s.length); r = str8(s.ptr, length); return r; } Str8 str8chopstart(Str8 s, U64 count) { U64 clamped, length; Str8 r; clamped = ClampTop(count, s.length); length = s.length-ClampTop(count, s.length); r = str8(s.ptr+clamped, length); return r; } void str8print(Str8 s) { for (U64 i = 0; i < s.length; ++i) printf("%c", (char)(*(s.ptr+i))); } Str8List *str8list(Arena *arena) { Str8List *list; list = arena_push(arena, sizeof(Str8List)); MemoryZero(list, sizeof(Str8List)); return list; } void str8listpush(Arena *arena, Str8List *list, Str8 str, B32 to_front) { Assert(arena && list); Str8Node *n; 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 str8listprint(Str8List *list) { Str8Node *n; for (n = list->first; n; n = n->next) str8print(n->str); } Str8 str8pushfv(Arena *arena, char *fmt, va_list args) { va_list args2; Str8 r; S32 buf_size, n; U8 *buf; va_copy(args2, args); buf_size = 1024; buf = arena_push(arena, buf_size); n = vsnprintf((char *)buf, buf_size, fmt, args); va_end(args2); MemoryZero(&r, sizeof(Str8)); if (n > 0) r = str8(buf, n); return r; } Str8 str8pushf(Arena *arena, char *fmt, ...) { va_list args; Str8 r; va_start(args, fmt); r = str8pushfv(arena, fmt, args); va_end(args); return r; } void str8listpushf(Arena *arena, Str8List *list, B32 to_front, char *fmt, ...) { va_list args; Str8 str; va_start(args, fmt); str = str8pushfv(arena, fmt, args); va_end(args); str8listpush(arena, list, str, to_front); }