#include "prbs.h" #include "macros.h" #include #include 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); }