summaryrefslogtreecommitdiff
path: root/linux.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-10-12 15:24:30 +0500
committerpryazha <pryadeiniv@mail.ru>2025-10-12 15:24:30 +0500
commit223b1056273f5d48d1c0bbfee75be7b82374d4eb (patch)
tree2b2003aad9c26af7006c5a5c7e2baf1a63ad89e7 /linux.c
parent7e73843ac5873833c707687cd0ada0a3034e600c (diff)
change identation, maybe will change back, add own gl functions loading, and glx example
Diffstat (limited to 'linux.c')
-rw-r--r--linux.c115
1 files changed, 68 insertions, 47 deletions
diff --git a/linux.c b/linux.c
index ff20e92..cfdcf6a 100644
--- a/linux.c
+++ b/linux.c
@@ -1,70 +1,91 @@
#include "sys.h"
#include "macros.h"
+#include "prbs.h"
+
#include <sys/mman.h>
#include <stdarg.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
-void *sys_alloc(u64 length)
+void
+*sys_alloc(u64 length)
{
- assert(length);
- i32 prot = PROT_READ | PROT_WRITE;
- i32 flags = MAP_PRIVATE|MAP_ANONYMOUS;
- void *result = mmap(0, length, prot, flags, -1, 0);
- return result;
+ assert(length);
+ i32 prot = PROT_READ | PROT_WRITE;
+ i32 flags = MAP_PRIVATE|MAP_ANONYMOUS;
+ void *result = mmap(0, length, prot, flags, -1, 0);
+ return result;
}
-void sys_free(void *memory, u64 length)
+void
+sys_free(void *memory, u64 length)
{
- assert(memory);
- assert(length);
- munmap(memory, length);
+ assert(memory);
+ assert(length);
+ munmap(memory, length);
}
-void die(const char *format, ...)
+void
+die(const char *format, ...)
{
- va_list args;
- va_start(args, format);
- fprintf(stderr, "error: ");
- vfprintf(stderr, format, args);
- fprintf(stderr, "\n");
- va_end(args);
- _exit(1);
+ va_list args;
+ va_start(args, format);
+ fprintf(stderr, "error: ");
+ vfprintf(stderr, format, args);
+ fprintf(stderr, "\n");
+ va_end(args);
+ _exit(1);
}
-void info(const char *format, ...)
+void
+info(const char *format, ...)
{
- va_list args;
- va_start(args, format);
- vprintf(format, args);
- putchar('\n');
- va_end(args);
+ 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)
+char *
+read_entire_file(struct arena *arena, u64 *len, const char *filename)
{
- FILE *file = fopen(filename, "rb");
- if (!file)
- return 0;
- if (fseek(file, 0, SEEK_END) == -1)
- goto error;
- i64 n = ftell(file);
- if (n <= 0)
- goto error;
- if (len)
- *len = n;
- if (fseek(file, 0, SEEK_SET) == -1)
- goto error;
- char *buffer = push_arena(arena, n + 1);
- if (!fread(buffer, 1, n, file)) {
- pop_arena(arena, n + 1);
- goto error;
- }
- fclose(file);
- buffer[n] = 0;
- return buffer;
+ FILE *file = fopen(filename, "rb");
+ if (!file)
+ return 0;
+ if (fseek(file, 0, SEEK_END) == -1)
+ goto error;
+ i64 n = ftell(file);
+ if (n <= 0)
+ goto error;
+ if (len)
+ *len = n;
+ if (fseek(file, 0, SEEK_SET) == -1)
+ goto error;
+ char *buffer = push_arena(arena, n + 1);
+ if (!fread(buffer, 1, n, file)) {
+ pop_arena(arena, n + 1);
+ goto error;
+ }
+ fclose(file);
+ buffer[n] = 0;
+ return buffer;
+
error:
- fclose(file);
- return 0;
+ fclose(file);
+ return 0;
+}
+
+struct string
+get_basedir(struct arena *arena)
+{
+ char buf[1024] = {0};
+ if (readlink("/proc/self/exe", buf, 1024 - 1) == -1)
+ die("failed to read link /proc/self/exe");
+ struct arena temp = alloc_arena(0);
+ struct string full = string_from_cstring(&temp, buf);
+ struct string base = push_string(arena, get_dirname(full));
+ release_arena(&temp);
+ return base;
}