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