From e7f67b450d8034b532101445035d3b199e702621 Mon Sep 17 00:00:00 2001 From: pryazha Date: Sun, 15 Jun 2025 15:28:45 +0500 Subject: windows? --- prb_linux.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 prb_linux.h (limited to 'prb_linux.h') diff --git a/prb_linux.h b/prb_linux.h new file mode 100644 index 0000000..3acc229 --- /dev/null +++ b/prb_linux.h @@ -0,0 +1,69 @@ +#include +#include +#include +#include + +void *sys_alloc(u64 length) +{ + assert(length); + void *result = mmap(0, length, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + return result; +} + +void sys_free(void *memory, u64 length) +{ + assert(memory); + assert(length); + munmap(memory, length); +} + +u64 sys_read_file(arena_t *arena, char **buffer, const char *filename) +{ + FILE *file = fopen(filename, "rb"); + if (!file) + return 0; + + if (fseek(file, 0, SEEK_END) == -1) + goto error; + long len = ftell(file); + if (!len || (len == -1)) + goto error; + if (fseek(file, 0, SEEK_SET) == -1) + goto error; + + *buffer = push_arena(arena, len + 1); + if (!fread(*buffer, 1, len, file)) { + pop_arena(arena, len + 1); + *buffer = 0; + goto error; + } + (*buffer)[len] = 0; + fclose(file); + + return len; +error: + fclose(file); + *buffer = 0; + return 0; +} + +char *sys_getbindir(arena_t *arena) +{ + char path[MAX_PATH]; + i64 len = readlink("/proc/self/exe", path, MAX_PATH - 1); + if (len <= 0) + return 0; + + path[len] = 0; + + char *dir = strrchr(path, '/'); + assert(dir); + assert(dir > path); + + len = dir - path; + dir = push_arena(arena, len + 1); + prb_memmove(dir, path, len); + dir[len] = 0; + + return dir; +} -- cgit v1.2.3-70-g09d2