summaryrefslogtreecommitdiff
path: root/bindgen/ocaml/bindings
diff options
context:
space:
mode:
Diffstat (limited to 'bindgen/ocaml/bindings')
-rw-r--r--bindgen/ocaml/bindings/bindings_sys.ml49
-rw-r--r--bindgen/ocaml/bindings/caml_bindings.c132
-rw-r--r--bindgen/ocaml/bindings/celeritas.h21
-rw-r--r--bindgen/ocaml/bindings/dune13
4 files changed, 215 insertions, 0 deletions
diff --git a/bindgen/ocaml/bindings/bindings_sys.ml b/bindgen/ocaml/bindings/bindings_sys.ml
new file mode 100644
index 0000000..1c100e9
--- /dev/null
+++ b/bindgen/ocaml/bindings/bindings_sys.ml
@@ -0,0 +1,49 @@
+(* automatically generated by ocaml-bindgen 0.0.1 *)
+
+type lifetime =
+ | Function
+ (** The value can live for the lifetime of the function call, which upon return will signal that the
+ value can be dropped (finalizer?) *)
+ | Ocaml (** The value is managed by the OCaml runtime *)
+ | C
+ (** The value is allocated and passed to C which is then in charge of cleaning it up *)
+
+type 'a cptr = { lifetime : lifetime; addr : nativeint }
+
+external bindgen_alloc : size:int -> nativeint = "bindgen_alloc"
+external bindgen_free : nativeint -> unit = "bindgen_free"
+external bindgen_alloc_string : string -> nativeint = "bindgen_alloc_string"
+
+let sizeof _ = 4 (* TODO: how to handle different types? *)
+
+let create_ptr (value : 'a) : 'a cptr =
+ let addr = bindgen_alloc ~size:(sizeof value) in
+ print_endline ("Addr: " ^ Nativeint.to_string addr);
+ Gc.finalise bindgen_free addr;
+ { lifetime = Ocaml; addr }
+
+let make_cstr (s: string) : char cptr =
+ let addr = bindgen_alloc_string s in
+ { lifetime = Ocaml; addr }
+
+type nonrec core
+type nonrec glfwwindow
+external get_global_core : unit -> core cptr = "caml_get_global_core"
+external core_Bringup :
+ optional_window:unit cptr -> unit = "caml_core_Bringup"
+external frame_Begin : unit -> unit = "caml_frame_Begin"
+external frame_Draw : unit -> unit = "caml_frame_Draw"
+external frame_End : unit -> unit = "caml_frame_End"
+type nonrec vec2 = {
+ x: float ;
+ y: float }
+type nonrec vec3 = {
+ x: float ;
+ y: float ;
+ z: float }
+type nonrec vec4 = {
+ x: float ;
+ y: float ;
+ z: float ;
+ w: float }
+external vec3_add : b:vec3 -> a:vec3 -> vec3 = "caml_vec3_add"
diff --git a/bindgen/ocaml/bindings/caml_bindings.c b/bindgen/ocaml/bindings/caml_bindings.c
new file mode 100644
index 0000000..4a7dc70
--- /dev/null
+++ b/bindgen/ocaml/bindings/caml_bindings.c
@@ -0,0 +1,132 @@
+/* automatically generated by ocaml-bindgen 0.0.1 */
+
+#include "celeritas.h"
+#include <caml/alloc.h>
+#include <caml/callback.h>
+#include <caml/fail.h>
+#include <caml/memory.h>
+#include <caml/mlvalues.h>
+#include <caml/unixsupport.h>
+Core* caml_get_global_core() {
+ CAMLparam0();
+ CAMLlocal1(result);
+ result = get_global_core();
+ CAMLreturn(result);
+}
+
+void caml_core_Bringup(value caml_optional_window) {
+ CAMLparam1(caml_optional_window);
+ void* optional_window = Nativeint_val(Field(caml_optional_window, 1));
+ core_Bringup(optional_window);
+ CAMLreturn0;
+}
+
+void caml_frame_Begin() {
+ CAMLparam0();
+ frame_Begin();
+ CAMLreturn0;
+}
+
+void caml_frame_Draw() {
+ CAMLparam0();
+ frame_Draw();
+ CAMLreturn0;
+}
+
+void caml_frame_End() {
+ CAMLparam0();
+ frame_End();
+ CAMLreturn0;
+}
+
+Vec2* caml_Vec2_of_value(value caml_x) {
+ Vec2* x = malloc(sizeof(struct Vec2));
+ x->x = Double_val(Field(caml_x, 0));
+ x->y = Double_val(Field(caml_x, 1));
+ return x;
+}
+
+value caml_Vec2_to_value(struct Vec2* x) {
+ CAMLparam0();
+ CAMLlocal1(caml_x);
+ caml_x = caml_alloc_tuple(2);
+ Store_field(caml_x, 0, caml_copy_double(x->x));
+ Store_field(caml_x, 1, caml_copy_double(x->y));
+ CAMLreturn(caml_x);
+}
+
+Vec3* caml_Vec3_of_value(value caml_x) {
+ Vec3* x = malloc(sizeof(struct Vec3));
+ x->x = Double_val(Field(caml_x, 0));
+ x->y = Double_val(Field(caml_x, 1));
+ x->z = Double_val(Field(caml_x, 2));
+ return x;
+}
+
+value caml_Vec3_to_value(struct Vec3* x) {
+ CAMLparam0();
+ CAMLlocal1(caml_x);
+ caml_x = caml_alloc_tuple(3);
+ Store_field(caml_x, 0, caml_copy_double(x->x));
+ Store_field(caml_x, 1, caml_copy_double(x->y));
+ Store_field(caml_x, 2, caml_copy_double(x->z));
+ CAMLreturn(caml_x);
+}
+
+Vec4* caml_Vec4_of_value(value caml_x) {
+ Vec4* x = malloc(sizeof(struct Vec4));
+ x->x = Double_val(Field(caml_x, 0));
+ x->y = Double_val(Field(caml_x, 1));
+ x->z = Double_val(Field(caml_x, 2));
+ x->w = Double_val(Field(caml_x, 3));
+ return x;
+}
+
+value caml_Vec4_to_value(struct Vec4* x) {
+ CAMLparam0();
+ CAMLlocal1(caml_x);
+ caml_x = caml_alloc_tuple(4);
+ Store_field(caml_x, 0, caml_copy_double(x->x));
+ Store_field(caml_x, 1, caml_copy_double(x->y));
+ Store_field(caml_x, 2, caml_copy_double(x->z));
+ Store_field(caml_x, 3, caml_copy_double(x->w));
+ CAMLreturn(caml_x);
+}
+
+Vec3 caml_vec3_add(value caml_a, value caml_b) {
+ CAMLparam2(caml_a, caml_b);
+ CAMLlocal1(result);
+ Vec3 a = caml_Vec3_of_value(caml_a);
+ Vec3 b = caml_Vec3_of_value(caml_b);
+ result = vec3_add(a, b);
+ CAMLreturn(result);
+}
+
+
+#include <stdlib.h>
+value bindgen_alloc(value caml_size) {
+ CAMLparam1(caml_size);
+
+ // Convert OCaml integer to C size
+ size_t size = Int_val(caml_size);
+ printf("Allocated size %ld \n", size);
+
+ void* ptr = malloc(sizeof(size));
+ if (ptr == NULL) {
+ // TODO: handle allocation failure
+ CAMLreturn(Val_unit);
+ }
+
+ // Wrap the pointer as an OCaml value
+ CAMLreturn(caml_copy_nativeint(ptr));
+}
+
+void bindgen_free(value caml_addr) {
+ free(Nativeint_val(caml_addr));
+}
+
+value bindgen_alloc_string(value caml_string) {
+ CAMLparam1(caml_string);
+ char* str = String_val(caml_string);
+ CAMLreturn(caml_copy_nativeint((intnat)str));
+}
diff --git a/bindgen/ocaml/bindings/celeritas.h b/bindgen/ocaml/bindings/celeritas.h
new file mode 100644
index 0000000..fce4d62
--- /dev/null
+++ b/bindgen/ocaml/bindings/celeritas.h
@@ -0,0 +1,21 @@
+/* The Goal of this file is to test ocaml-bindgen on it to start moving development over into OCaml */
+
+// #include <stdbool.h>
+// #include <stdint.h>
+
+typedef struct Core Core;
+typedef struct GLFWwindow GLFWwindow;
+
+Core* get_global_core();
+void core_Bringup(void* optional_window);
+
+void frame_Begin();
+void frame_Draw();
+void frame_End();
+
+
+struct Vec2 { float x; float y; };
+typedef struct Vec3 { float x; float y; float z; } Vec3;
+struct Vec4 { float x; float y; float z; float w; };
+
+Vec3 vec3_add(Vec3 a, Vec3 b); \ No newline at end of file
diff --git a/bindgen/ocaml/bindings/dune b/bindgen/ocaml/bindings/dune
new file mode 100644
index 0000000..673491d
--- /dev/null
+++ b/bindgen/ocaml/bindings/dune
@@ -0,0 +1,13 @@
+(library
+ (name bindings)
+ (libraries bindgen))
+
+(rule
+ (alias gen_bindings)
+ (deps celeritas.h)
+ (targets bindings_sys.ml caml_bindings.c)
+ (action
+ (run
+ %{bin:ocaml-bindgen} celeritas.h bindings)
+ )
+ (mode (promote (until-clean)))) \ No newline at end of file