commit f9d48018a686761f7f75c777710871b5af0488e0
Author: sam <multisniperism@gmail.com>
Date:   Sun Aug 11 16:18:06 2024 +1200

    first commit

diff --git a/.cache/clangd/index/simple.c.700CB8E1B8AD103E.idx b/.cache/clangd/index/simple.c.700CB8E1B8AD103E.idx
new file mode 100644
index 0000000..fcd2712
Binary files /dev/null and b/.cache/clangd/index/simple.c.700CB8E1B8AD103E.idx differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..30562d0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+compile_commands.json
+**/*.o
+test/log.txt
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..b786e20
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "src/thirdparty/log.c"]
+	path = src/thirdparty/log.c
+	url = https://github.com/rxi/log.c
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..cedc993
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,12 @@
+all:
+	$(MAKE) -C src
+	$(MAKE) -C test clean
+	$(MAKE) -C test simple.o
+	./test/simple.o
+
+bear: clean
+	bear -- $(MAKE)
+
+clean:
+	$(MAKE) -C src clean
+	$(MAKE) -C test clean
diff --git a/src/.cache/clangd/index/gearlib.h.988F31907B86874A.idx b/src/.cache/clangd/index/gearlib.h.988F31907B86874A.idx
new file mode 100644
index 0000000..423d7ca
Binary files /dev/null and b/src/.cache/clangd/index/gearlib.h.988F31907B86874A.idx differ
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..c19b5e4
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,22 @@
+LIBRARY=libgearlib.a
+
+CFLAGS=-O3 \
+       -I. \
+       -Ithirdparty \
+       -DUSE_GLFW \
+       -DLOG_USE_COLOR \
+       $(shell pkg-config --cflags glfw3)
+
+CFILES=$(shell find -L * -type f -name '*.c')
+OBJ=$(CFILES:.c=.o)
+
+$(LIBRARY): $(OBJ) Makefile
+	$(AR) rcs $(LIBRARY) $(OBJ)
+
+%.o: %.c
+	$(CC) $(CFLAGS) -c $< -o $@
+
+clean:
+	rm -rf $(OBJ) $(LIBRARY)
+
+
diff --git a/src/gearlib.h b/src/gearlib.h
new file mode 100644
index 0000000..1ca035c
--- /dev/null
+++ b/src/gearlib.h
@@ -0,0 +1,47 @@
+#ifndef __GEARLIB_H__
+#define __GEARLIB_H__
+
+#include <math.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <assert.h>
+
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+typedef uintptr_t uptr;
+
+typedef int8_t i8;
+typedef int16_t i16;
+typedef int32_t i32;
+typedef int64_t i64;
+typedef intptr_t iptr;
+
+typedef float_t f32;
+typedef double_t f64;
+
+#define GRAPI extern
+#define GR_DEFAULT_MAJOR 4
+#define GR_DEFAULT_MINOR 6
+
+GRAPI i32 gr_state_init();
+#define gr_state_assert() assert(gr_state != NULL && "State not initialized")
+#define gr_state_set(prop, val) gr_state_assert(); gr_state->prop = val
+#define gr_state_get(prop) ({ gr_state_assert(); gr_state->prop; })
+
+GRAPI i32 gr_window_init(i32 major, i32 minor);
+GRAPI i32 gr_window_create(i32 width, i32 height, char* title);
+
+GRAPI i32 gr_log_add_file(char* filename);
+
+typedef struct {
+    i32 major;
+    i32 minor;
+    bool window_initialized;
+    void* window;
+} gr_state_t;
+
+GRAPI gr_state_t* gr_state;
+
+#endif
diff --git a/src/libgearlib.a b/src/libgearlib.a
new file mode 100644
index 0000000..29eab92
Binary files /dev/null and b/src/libgearlib.a differ
diff --git a/src/log.c b/src/log.c
new file mode 100644
index 0000000..19a9d66
--- /dev/null
+++ b/src/log.c
@@ -0,0 +1,14 @@
+#include <gearlib.h>
+#include <log.c/src/log.h>
+
+i32 gr_log_add_file(char* filename) {
+    FILE* fd = fopen(filename, "w");
+    if(fd == NULL) {
+        log_error("Couldn't open file \"%s\"", filename);
+        return 1;
+    }
+
+    log_add_fp(fd, LOG_INFO);
+    log_info("Added file \"%s\" as logging file", filename);
+    return 0;
+}
diff --git a/src/state.c b/src/state.c
new file mode 100644
index 0000000..71df5ea
--- /dev/null
+++ b/src/state.c
@@ -0,0 +1,16 @@
+#include "log.c/src/log.h"
+#include <gearlib.h>
+#include <stdlib.h>
+
+gr_state_t* gr_state = NULL;
+
+i32 gr_state_init() {
+    if(gr_state != NULL) {
+        log_fatal("Init must only be called once");
+        return 1;
+    }
+
+    gr_state = calloc(1, sizeof(gr_state_t));
+    log_info("Created state");
+    return 0;
+}
diff --git a/src/thirdparty/log.c b/src/thirdparty/log.c
new file mode 160000
index 0000000..f9ea349
--- /dev/null
+++ b/src/thirdparty/log.c
@@ -0,0 +1 @@
+Subproject commit f9ea34994bd58ed342d2245cd4110bb5c6790153
diff --git a/src/window.c b/src/window.c
new file mode 100644
index 0000000..b84e166
--- /dev/null
+++ b/src/window.c
@@ -0,0 +1,49 @@
+#include <gearlib.h>
+#include <GLFW/glfw3.h>
+#include <log.c/src/log.h>
+
+i32 gr_window_init(i32 major, i32 minor) {
+    if(gr_state->window_initialized == true) {
+        log_fatal("Init already called");
+        return 1;
+    }
+
+    gr_state_set(major, major);
+    gr_state_set(minor, minor);
+    gr_state_set(window_initialized, true);
+
+    log_info("Initialized for OpenGL %d.%d", major, minor);
+
+    return 0;
+}
+
+i32 gr_window_create(i32 width, i32 height, char* title) {
+    if(!gr_state_get(window_initialized)) {
+        log_info("Window was not initialized before calling create, defaulting to OpenGL %d.%d", 
+                 GR_DEFAULT_MAJOR, GR_DEFAULT_MINOR);
+        gr_window_init(GR_DEFAULT_MAJOR, GR_DEFAULT_MINOR);
+    }
+
+#ifdef USE_GLFW
+    if(glfwInit() != GLFW_TRUE) {
+        log_fatal("GLFW failed to initialize");
+    } else {
+        log_info("GLFW initialized successfully");
+    }
+
+    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, gr_state_get(major));
+    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, gr_state_get(minor));
+    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
+
+    gr_state_set(window, glfwCreateWindow(width, height, title, NULL, NULL));
+    if(gr_state_get(window) == NULL) {
+        log_fatal("Failed to create window");
+        return 1;
+    } else {
+        log_info("Window created successfully");
+    }
+#endif
+
+    return 0;
+}
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..28be3c2
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,15 @@
+CFLAGS=-O3 -I../src
+LDFLAGS=-L../src -lgearlib $(shell pkg-config --libs glfw3)
+
+CFILES=$(shell find -L * -type f -name '*.c')
+OBJ=$(CFILES:.c=.o)
+
+%.o: %.c
+	$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
+
+all: $(OBJ)
+
+clean:
+	rm -rf $(OBJ) $(BINARY)
+
+
diff --git a/test/simple-init.c b/test/simple-init.c
new file mode 100644
index 0000000..be3b766
--- /dev/null
+++ b/test/simple-init.c
@@ -0,0 +1,7 @@
+#include <gearlib.h>
+
+int main() {
+    gr_state_init();
+    gr_window_init(4, 1);
+    gr_window_create(800, 600, "hi");
+}
diff --git a/test/simple-log.c b/test/simple-log.c
new file mode 100644
index 0000000..1c281b2
--- /dev/null
+++ b/test/simple-log.c
@@ -0,0 +1,8 @@
+#include <gearlib.h>
+
+int main() {
+    gr_state_init();
+
+    gr_log_add_file("log.txt");
+    gr_window_create(800, 600, "hi");
+}
diff --git a/test/simple.c b/test/simple.c
new file mode 100644
index 0000000..610af17
--- /dev/null
+++ b/test/simple.c
@@ -0,0 +1,6 @@
+#include <gearlib.h>
+
+int main() {
+    gr_state_init();
+    gr_window_create(800, 600, "hi");
+}