#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; }