summaryrefslogtreecommitdiff
path: root/prbwin.c
diff options
context:
space:
mode:
Diffstat (limited to 'prbwin.c')
-rw-r--r--prbwin.c77
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;
+}