void *sys_alloc(u64 length) { assert(length); void *result = VirtualAlloc(0, length, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); return result; } void sys_free(void *memory, u64 length) { assert(memory); assert(length); assert(VirtualFree(memory, 0, MEM_RELEASE)); } u64 sys_read_file(arena_t *arena, char **buffer, const char *filename) { *buffer = 0; HANDLE file = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (file == INVALID_HANDLE_VALUE) { printf("error: failed to open file \"%s\"\n", filename); return 0; } LARGE_INTEGER lisize; if (!GetFileSizeEx(file, &lisize)) { printf("error: failed to get size of the file \"%s\"", filename); CloseHandle(file); return 0; } u64 size = lisize.QuadPart; if (!size) { printf("error: file \"%s\" is empty", filename); CloseHandle(file); return 0; } *buffer = push_arena(arena, size + 1); DWORD bytes_read; if (!ReadFile(file, *buffer, size, &bytes_read, 0)) { CloseHandle(file); pop_arena(arena, size); printf("error: failed to read file \"%s\", bytes read: %lu\n", filename, bytes_read); return 0; } CloseHandle(file); *(*buffer + size) = 0; return size + 1; } char *sys_getbindir(arena_t *arena) { char path[MAX_PATH]; u32 len = GetModuleFileName(0, path, MAX_PATH); if (!len) { printf("error: failed to get file path\n"); return 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; }