summaryrefslogtreecommitdiff
path: root/prbs.c
diff options
context:
space:
mode:
Diffstat (limited to 'prbs.c')
-rw-r--r--prbs.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/prbs.c b/prbs.c
new file mode 100644
index 0000000..818a110
--- /dev/null
+++ b/prbs.c
@@ -0,0 +1,132 @@
+#include "prbs.h"
+#include "macros.h"
+#include <string.h>
+#include <stdio.h>
+
+i32 cstrings_equal(const char *s1, const char *s2)
+{
+ assert(s1 && s2);
+ while (*s1++ == *s2++)
+ if (!*s1)
+ return 1;
+ return 0;
+}
+
+char *string_to_cstring(struct arena *arena, struct string str)
+{
+ u64 len = str.len + 1;
+ char *cstr = push_arena(arena, len);
+ memmove(cstr, str.ptr, len);
+ cstr[str.len] = 0;
+ return cstr;
+}
+
+i32 strings_equal(struct string str1, struct string str2)
+{
+ if (str1.len != str2.len)
+ return 0;
+ for (u64 i = 0; i < str1.len; ++i)
+ if (str1.ptr[i] != str2.ptr[i])
+ return 0;
+ return 1;
+}
+
+u8 *find_char(struct string str, i32 c)
+{
+ for (u64 i = 0; i < str.len; ++i)
+ if (str.ptr[i] == c)
+ return str.ptr + i;
+ return 0;
+}
+
+u8 *find_last_char(struct string str, i32 c)
+{
+ for (u64 i = str.len - 1; i > 0; --i)
+ if (str.ptr[i] == c)
+ return str.ptr + i;
+ return 0;
+}
+
+struct string string_from_range(u8 *start, u8 *end)
+{
+ assert(start);
+ assert(end);
+ assert(start < end);
+ return (struct string){start, end - start};
+}
+
+struct string get_dirname(struct string str)
+{
+ assert(str.len);
+ u8 *slash = find_last_char(str, '/');
+ if (!slash)
+ return str;
+ return string_from_range(str.ptr, slash);
+}
+
+struct string push_fstringv(struct arena *arena, const char *format, va_list args)
+{
+ char tmp[kilobytes(4) + 1];
+ i32 len = vsnprintf(tmp, kilobytes(4), format, args);
+ struct string str = {0};
+ if (len < 0)
+ return str;
+ u8 *ptr = push_arena(arena, len);
+ memmove(ptr, tmp, len);
+ return (struct string){ptr, len};
+}
+
+struct string push_fstring(struct arena *arena, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ struct string str = push_fstringv(arena, format, args);
+ va_end(args);
+ return str;
+}
+
+void print_string(struct string str)
+{
+ assert(str.ptr && str.len);
+ printf("%.*s", str.len, str.ptr);
+}
+
+void push_string_to_list(struct arena *arena, struct string_list *list, i32 front, struct string str)
+{
+ struct string_node *node = push_arena(arena, sizeof(struct string_node));
+ node->str = str;
+ if (front)
+ dllpushfront(list->first, list->last, node);
+ else
+ dllpushback(list->first, list->last, node);
+ list->len += str.len;
+ list->cnt++;
+}
+
+void push_fstring_to_list(struct arena *arena, struct string_list *list, i32 front, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ struct string str = push_fstringv(arena, format, args);
+ va_end(args);
+ push_string_to_list(arena, list, front, str);
+}
+
+struct string join_string_list(struct arena *arena, struct string_list *list)
+{
+ assert(arena);
+ assert(list);
+ struct string str = {arena->memory + arena->used, 0};
+ for (struct string_node *node = list->first; node; node = node->next) {
+ u8 *ptr = push_arena(arena, node->str.len);
+ memmove(ptr, node->str.ptr, node->str.len);
+ str.len += node->str.len;
+ }
+ return str;
+}
+
+void print_string_list(struct string_list *list)
+{
+ for (struct string_node *node = list->first; node; node = node->next)
+ print_string(node->str);
+}