diff options
Diffstat (limited to 'prbwin.c')
-rw-r--r-- | prbwin.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/prbwin.c b/prbwin.c new file mode 100644 index 0000000..81ad626 --- /dev/null +++ b/prbwin.c @@ -0,0 +1,77 @@ +#include "sys.h" + +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)); +} + +void die(const char *error_string, ...) +{ + va_list args; + va_start(args, error_string); + printf("error: "); + vprintf(error_string, args); + printf("\n"); + va_end(args); + exit(1); +} + +void info(const char *format, ...) +{ + va_list args; + va_start(args, format); + vprintf(format, args); + putchar('\n'); + va_end(args); +} + +char *read_entire_file(struct arena *arena, u64 *len, const char *filename) +{ + HANDLE file = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, + 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) + return 0; + LARGE_INTEGER lisize; + if (!GetFileSizeEx(file, &lisize)) + goto error; + *len = lisize.QuadPart; + if (!*len) + goto error; + char *buffer = push_arena(arena, *len + 1); + DWORD bytes_read; + if (!ReadFile(file, *buffer, size, &bytes_read, 0)) { + pop_arena(arena, *len + 1); + goto error; + } + CloseHandle(file); + buffer[*len] = 0; + return buffer; +error: + CloseHandle(file); + return 0; +} + +char *get_exe_path(arena_t *arena) +{ + char path[max_path_len] = {0}; + u32 len = GetModuleFileName(0, path, max_path_len); + if (!len) + return 0; + char *dir = strrchr(path, '\\'); + if (!dir) + return path; + len = dir - path; + dir = push_arena(arena, len + 1); + memmove(dir, path, len); + dir[len] = 0; + return dir; +} |