diff options
Diffstat (limited to 'prbs.c')
| -rw-r--r-- | prbs.c | 219 |
1 files changed, 133 insertions, 86 deletions
@@ -1,132 +1,179 @@ #include "prbs.h" #include "macros.h" +#include "sys.h" #include <string.h> #include <stdio.h> -i32 cstrings_equal(const char *s1, const char *s2) +i32 +cstrings_equal(const char *s1, const char *s2) { - assert(s1 && s2); - while (*s1++ == *s2++) - if (!*s1) - return 1; - return 0; + assert(s1 && s2); + while (*s1++ == *s2++) + if (!*s1) + return 1; + return 0; } -char *string_to_cstring(struct arena *arena, struct string str) +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; + 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) +struct string +string_from_cstring(struct arena *arena, const char *cstr) { - 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; + u64 len = 0; + while (cstr[len++]) + ; + len--; + u8 *ptr = push_arena(arena, len); + for (i32 i = 0; i < len; i++) + ptr[i] = cstr[i]; + return (struct string){ptr, len}; } -u8 *find_char(struct string str, i32 c) +i32 +strings_equal(struct string str1, struct string str2) { - for (u64 i = 0; i < str.len; ++i) - if (str.ptr[i] == c) - return str.ptr + i; - return 0; + 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_last_char(struct string str, i32 c) +u8 * +find_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; + for (u64 i = 0; i < str.len; ++i) + if (str.ptr[i] == c) + return str.ptr + i; + return 0; } -struct string string_from_range(u8 *start, u8 *end) +u8 * +find_last_char(struct string str, i32 c) { - assert(start); - assert(end); - assert(start < end); - return (struct string){start, end - start}; + for (u64 i = str.len - 1; i > 0; --i) + if (str.ptr[i] == c) + return str.ptr + i; + return 0; } -struct string get_dirname(struct string str) +struct string +string_from_range(u8 *start, u8 *end) { - assert(str.len); - u8 *slash = find_last_char(str, '/'); - if (!slash) - return str; - return string_from_range(str.ptr, slash); + assert(start); + assert(end); + assert(start < end); + return (struct string){start, end - start}; } -struct string push_fstringv(struct arena *arena, const char *format, va_list args) +struct string +get_dirname(struct string str) { - 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}; + assert(str.len); + u8 *dot = find_char(str, '.'); + u8 *slash = find_last_char(str, '/'); + if (!slash) + return str; + return string_from_range(str.ptr, slash); } -struct string push_fstring(struct arena *arena, const char *format, ...) +struct string +push_string(struct arena *arena, struct string str) { - va_list args; - va_start(args, format); - struct string str = push_fstringv(arena, format, args); - va_end(args); - return str; + assert(str.ptr && str.len); + u8 *ptr = push_arena(arena, str.len); + memmove(ptr, str.ptr, str.len); + return (struct string){ptr, str.len}; } -void print_string(struct string str) +static struct string +push_fstringv(struct arena *arena, const char *format, va_list args) { - assert(str.ptr && str.len); - printf("%.*s", str.len, str.ptr); + 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}; } -void push_string_to_list(struct arena *arena, struct string_list *list, i32 front, struct string str) +struct string +push_fstring(struct arena *arena, const char *format, ...) { - 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++; + va_list args; + va_start(args, format); + struct string str = push_fstringv(arena, format, args); + va_end(args); + return str; } -void push_fstring_to_list(struct arena *arena, struct string_list *list, i32 front, const char *format, ...) +void +print_string(struct string str) { - 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); + assert(str.ptr && str.len); + printf("%.*s", str.len, str.ptr); } -struct string join_string_list(struct arena *arena, struct string_list *list) +void +print_stringnl(struct string str) { - 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; + print_string(str); + printf("\n"); } -void print_string_list(struct string_list *list) +void +push_string_to_list(struct arena *arena, struct string_list *list, + i32 front, struct string str) { - for (struct string_node *node = list->first; node; node = node->next) - print_string(node->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); } |
