diff options
Diffstat (limited to 'prbs.c')
-rw-r--r-- | prbs.c | 132 |
1 files changed, 132 insertions, 0 deletions
@@ -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); +} |