summaryrefslogtreecommitdiff
path: root/prb_string.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-02-20 15:08:47 +0500
committerpryazha <pryadeiniv@mail.ru>2025-02-20 15:08:47 +0500
commit0bd7c5dc0725a4882cb33c5d8f1a3b101d4025cd (patch)
treeecb3e42bf4855ba9e4836a20b94cb4857943eda6 /prb_string.c
initial
Diffstat (limited to 'prb_string.c')
-rw-r--r--prb_string.c115
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");
+ }
+}