diff options
Diffstat (limited to 'prb_windows.h')
-rw-r--r-- | prb_windows.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/prb_windows.h b/prb_windows.h new file mode 100644 index 0000000..aec7e9b --- /dev/null +++ b/prb_windows.h @@ -0,0 +1,75 @@ +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; +} |