diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-02-20 15:08:47 +0500 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-02-20 15:08:47 +0500 |
commit | 0bd7c5dc0725a4882cb33c5d8f1a3b101d4025cd (patch) | |
tree | ecb3e42bf4855ba9e4836a20b94cb4857943eda6 /prb_string.c |
initial
Diffstat (limited to 'prb_string.c')
-rw-r--r-- | prb_string.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/prb_string.c b/prb_string.c new file mode 100644 index 0000000..061731c --- /dev/null +++ b/prb_string.c @@ -0,0 +1,115 @@ +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"); + } +} |