From 7cfefb6f9466dbd5d4cf99a1bda06909d5b9b228 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 4 May 2022 11:20:44 -0500 Subject: [PATCH] cleaning up c library modules --- modules/glfw3/build.onyx | 88 ++++++ modules/glfw3/build.sh | 1 + modules/glfw3/module.onyx | 40 ++- modules/glfw3/onyx_glfw3.c | Bin 20799 -> 18516 bytes modules/glfw3/onyx_glfw3.so | Bin 81680 -> 92176 bytes modules/http/http.onyx | 5 +- modules/openal/ build.bat | 1 + modules/openal/build.onyx | 32 ++ modules/openal/build.sh | 1 + modules/openal/module.onyx | 10 +- modules/openal/onyx_openal.c | 549 +++++++++++++++++++++++++-------- modules/openal/onyx_openal.so | Bin 87384 -> 87400 bytes modules/stb_image/build.onyx | 2 +- modules/stb_image/stb_image.so | Bin 161648 -> 161648 bytes scripts/c_binding.onyx | 18 ++ scripts/c_library.onyx | 3 +- 16 files changed, 605 insertions(+), 145 deletions(-) create mode 100644 modules/glfw3/build.onyx create mode 100644 modules/openal/build.onyx diff --git a/modules/glfw3/build.onyx b/modules/glfw3/build.onyx new file mode 100644 index 00000000..fd968af1 --- /dev/null +++ b/modules/glfw3/build.onyx @@ -0,0 +1,88 @@ +#load "core/std" +#load "scripts/c_binding" +#load "./module" + +use package core +use package c_binding + +main :: () { + result := build_c_binding(.{ + output_file = "modules/glfw3/onyx_glfw3.c", + foreign_block = (package glfw3).foreign_block, + + cast_map = .[ + .{ (package glfw3).GLFWmonitor_p, "GLFWmonitor *" }, + .{ (package glfw3).GLFWwindow_p, "GLFWwindow *" }, + .{ (package glfw3).GLFWcursor_p, "GLFWcursor *" }, + ], + + preamble = .[ +""" +#include + +#define __glfwGetLoadProcAddress() (unsigned long long) &glfwGetProcAddress + +#define _EXPAND(...) __VA_ARGS__ +#define GLFW_HOOK(callback_name, c_args, wasm_args) \ + static wasm_func_t* __glfw_callback_##callback_name ; \ + static void __glfw_##callback_name (GLFWwindow *window, _EXPAND c_args) { \ + wasm_val_t args[] = { WASM_I64_VAL((unsigned long long) window), _EXPAND wasm_args }; \ + wasm_val_vec_t args_array = WASM_ARRAY_VEC(args); \ + wasm_val_vec_t results; \ + runtime->wasm_func_call(__glfw_callback_##callback_name , &args_array, &results); \ + } \ + ONYX_DEF(callback_name, (LONG, PTR, INT), ()) { \ + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; \ + char name[512]; \ + strncpy(name, ONYX_PTR(params->data[1].of.i32), params->data[2].of.i32); \ + name[params->data[2].of.i32] = '\0'; \ + __glfw_callback_##callback_name = runtime->wasm_extern_as_func(runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, name)); \ + callback_name(window, __glfw_##callback_name); \ + return NULL; \ + } +""" + ], + + custom_implementations = .[ + .{ "glfwSetKeyCallback", """ + GLFW_HOOK(glfwSetKeyCallback, (int key, int scancode, int actions, int mods), + (WASM_I32_VAL(key), WASM_I32_VAL(scancode), WASM_I32_VAL(actions), WASM_I32_VAL(mods)))""" + }, + .{ "glfwSetCharCallback", """ + GLFW_HOOK(glfwSetCharCallback, (unsigned int ch), + (WASM_I32_VAL(ch)))""" + }, + .{ "glfwSetCharModsCallback", """ + GLFW_HOOK(glfwSetCharModsCallback, (unsigned int ch, int mods), + (WASM_I32_VAL(ch), WASM_I32_VAL(mods)))""" + }, + .{ "glfwSetMouseButtonCallback", """ + GLFW_HOOK(glfwSetMouseButtonCallback, (int button, int action, int mods), + (WASM_I32_VAL(button), WASM_I32_VAL(action), WASM_I32_VAL(mods)))""" + }, + .{ "glfwSetCursorPosCallback", """ + GLFW_HOOK(glfwSetCursorPosCallback, (double xpos, double ypos), + (WASM_F64_VAL(xpos), WASM_F64_VAL(ypos)))""" + }, + .{ "glfwSetCursorEnterCallback", """ + GLFW_HOOK(glfwSetCursorEnterCallback, (int entered), + (WASM_I32_VAL(entered)))""" + }, + .{ "glfwSetScrollCallback", """ + GLFW_HOOK(glfwSetScrollCallback, (double dx, double dy), + (WASM_F64_VAL(dx), WASM_F64_VAL(dy)))""" + }, + .{ "glfwSetWindowSizeCallback", """ + GLFW_HOOK(glfwSetWindowSizeCallback, (int width, int height), + (WASM_I32_VAL(width), WASM_I32_VAL(height)))""" + }, + ], + }); + + if !result { + println("Failed to make c-file."); + os.exit(1); + } else { + println("Sucessfully made glfw3.c"); + } +} diff --git a/modules/glfw3/build.sh b/modules/glfw3/build.sh index 63a924f3..b7b38863 100755 --- a/modules/glfw3/build.sh +++ b/modules/glfw3/build.sh @@ -1,4 +1,5 @@ #!/bin/sh # To be run from the project root +onyx run modules/glfw3/build --generate-foreign-info gcc -O2 -shared -fPIC ./modules/glfw3/onyx_glfw3.c -I include -I lib/common/include -lglfw -o modules/glfw3/onyx_glfw3.so \ No newline at end of file diff --git a/modules/glfw3/module.onyx b/modules/glfw3/module.onyx index 0e181a17..76b8e777 100644 --- a/modules/glfw3/module.onyx +++ b/modules/glfw3/module.onyx @@ -2,8 +2,11 @@ package glfw3 use package core { cptr } -// Temporary path -#library "onyx_glfw3" +#if #defined((package runtime).Generated_Foreign_Info) { + foreign_block :: __foreign_block +} else { + #library "onyx_glfw3" +} // Opaque types that are only used by pointer GLFWmonitor_p :: #distinct u64 @@ -32,12 +35,12 @@ GLFWgammaramp :: struct { size: i32; } -#foreign "onyx_glfw3" { +#local __foreign_block :: #foreign "onyx_glfw3" { glfwInit :: () -> bool --- glfwTerminate :: () -> void --- glfwInitHint :: (hint, value: i32) -> void --- glfwGetVersion :: (major, minor, rev: ^i32) -> void --- - // glfwGetError :: (description: ^^u8) -> void --- + glfwGetError :: (description: ^cptr(u8)) -> void --- // glfwSetErrorCallback :: (f: (i32, cstr) -> void) -> void --- glfwMakeContextCurrent :: (window: GLFWwindow_p) -> void --- @@ -67,37 +70,37 @@ GLFWgammaramp :: struct { glfwSetScrollCallback :: (window: GLFWwindow_p, export_name: str) -> void --- // glfwSetDropCallback glfwJoystickPresent :: (jid: i32) -> i32 --- - // glfwGetJoystickAxes :: (jid: i32, count: ^i32) -> ^f32 --- - // glfwGetJoystickButtons :: (jid: i32, count: ^i32) -> ^u8 --- - // glfwGetJoystickHats :: (jid: i32, count: ^i32) -> ^u8 --- - // glfwGetJoystickName :: (jid: i32) -> ^u8 --- - // glfwGetJoystickGUID :: (jid: i32) -> ^u8 --- + glfwGetJoystickAxes :: (jid: i32, count: ^i32) -> cptr(f32) --- + glfwGetJoystickButtons :: (jid: i32, count: ^i32) -> cptr(u8) --- + glfwGetJoystickHats :: (jid: i32, count: ^i32) -> cptr(u8) --- + glfwGetJoystickName :: (jid: i32) -> cptr(u8) --- + glfwGetJoystickGUID :: (jid: i32) -> cptr(u8) --- glfwSetJoystickUserPointer :: (jid: i32, pointer: rawptr) -> void --- glfwGetJoystickUserPointer :: (jid: i32) -> rawptr --- glfwJoystickIsGamepad :: (jid: i32) -> i32 --- // glfwSetJoystickCallback glfwUpdateGamepadMappings :: (string: cstr) -> i32 --- - // glfwGetGamepadName :: (jid: i32) -> cstr --- + glfwGetGamepadName :: (jid: i32) -> cptr(u8) --- glfwGetGamepadState :: (jid: i32, state: ^GLFWgamepadstate) -> i32 --- glfwSetClipboardString :: (window: GLFWwindow_p, string: cstr) -> void --- - // glfwGetClipboardString :: (window: GLFWwindow_p) -> cstr --- + glfwGetClipboardString :: (window: GLFWwindow_p) -> cptr(u8) --- glfwGetTime :: () -> f64 --- glfwSetTime :: (time: f64) -> void --- glfwGetTimerValue :: () -> u64 --- glfwGetTimerFrequency :: () -> u64 --- - glfwGetMonitors :: (max_monitors: i32, out_monitors: ^GLFWmonitor_p, out_count: ^i32) -> void --- + glfwGetMonitors :: (out_count: ^i32) -> cptr(GLFWmonitor_p) --- glfwGetPrimaryMonitor :: () -> GLFWmonitor_p --- glfwGetMonitorPos :: (monitor: GLFWmonitor_p, xpos, ypos: ^i32) -> void --- glfwGetMonitorWorkarea :: (monitor: GLFWmonitor_p, xpos, ypos, width, height: ^i32) -> void --- glfwGetMonitorPhysicalSize :: (monitor: GLFWmonitor_p, widthMM, heightMM: ^i32) -> void --- glfwGetMonitorContentScale :: (monitor: GLFWmonitor_p, xscale, yscale: ^f32) -> void --- - // glfwGetMonitorName :: (monitor: GLFWmonitor_p) -> cstr --- + glfwGetMonitorName :: (monitor: GLFWmonitor_p) -> cptr(u8) --- glfwSetMonitorUserPointer :: (monitor: GLFWmonitor_p, pointer: rawptr) -> void --- glfwGetMonitorUserPointer :: (monitor: GLFWmonitor_p) -> rawptr --- // glfwSetMonitorCallback - glfwGetVideoModes :: (monitor: GLFWmonitor_p, max_modes: i32, out_modes: ^GLFWvidmode, out_count: ^i32) -> void --- - glfwGetVideoMode :: (monitor: GLFWmonitor_p, out_mode: ^GLFWvidmode) -> void --- + glfwGetVideoModes :: (monitor: GLFWmonitor_p, out_count: ^i32) -> cptr(GLFWvidmode) --- + glfwGetVideoMode :: (monitor: GLFWmonitor_p) -> cptr(GLFWvidmode) --- glfwSetGamma :: (monitor: GLFWmonitor_p, gamma: f32) -> void --- // glfwGetGammaRamp :: (monitor: GLFWmonitor_p, out_ramp: ^GLFWgammramp) -> void --- // glfwSetGammaRamp :: (monitor: GLFWmonitor_p, ramp: ^GLFWgammramp) -> void --- @@ -136,14 +139,19 @@ GLFWgammaramp :: struct { glfwPostEmptyEvent :: () -> void --- glfwSwapBuffers :: (window: GLFWwindow_p) -> void --- glfwSetWindowSizeCallback :: (window: GLFWwindow_p, name: str) -> void --- + #local __glfwGetLoadProcAddress :: () -> u64 --- } // This should always be defined right? #if #defined(package opengles) { use package opengles { GLGetProcAddress } - glfwGetLoadProcAddress :: () -> GLGetProcAddress #foreign "onyx_glfw3" "glfwGetLoadProcAddress" --- + glfwGetLoadProcAddress :: macro () -> GLGetProcAddress { + __glfwGetLoadProcAddress :: __glfwGetLoadProcAddress + return ~~ __glfwGetLoadProcAddress(); + } } + GLFW_FOCUSED :: 0x00020001; GLFW_ICONIFIED :: 0x00020002; GLFW_RESIZABLE :: 0x00020003; diff --git a/modules/glfw3/onyx_glfw3.c b/modules/glfw3/onyx_glfw3.c index dcbfb7b9a32f80974fd268d906f3dc9245a5da7a..21957b32327245b011b5cc4283f58c5209042f02 100644 GIT binary patch literal 18516 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 OXgD4I?>Y{?zy2Sw%x!7_ literal 20799 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 diff --git a/modules/glfw3/onyx_glfw3.so b/modules/glfw3/onyx_glfw3.so index d73d1198dd71f05dc6cc67b0c699cd53cb304998..618f6307f7b136e3200015e23ae9bcd5e7339852 100755 GIT binary patch literal 92176 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%0Dbg>C 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 TzHZUce%l#Z^Dto`lE(i6EtD%U diff --git a/modules/http/http.onyx b/modules/http/http.onyx index 76f06112..4d05d9ee 100644 --- a/modules/http/http.onyx +++ b/modules/http/http.onyx @@ -217,6 +217,7 @@ send_request :: (connection: ^Connection, req: ^Request) -> Response { line := io.read_line(^connection.r, consume_newline=true); if line == "\r\n" do break; res.headers->parse_header_line(line); + delete(^line); } data: [..] u8; @@ -262,13 +263,13 @@ send_request :: (connection: ^Connection, req: ^Request) -> Response { } +Key_Value_Pair :: struct { key, value: str; } + #local { HTTP_VERSION_STRING :: "HTTP/1.1" USER_AGENT :: "onyx/0.1.0" - Key_Value_Pair :: struct { key, value: str; } - Post_Data_Encoding :: enum { Json; Url_Encoded; diff --git a/modules/openal/ build.bat b/modules/openal/ build.bat index afbba2c2..e6e9f6d5 100644 --- a/modules/openal/ build.bat +++ b/modules/openal/ build.bat @@ -1,3 +1,4 @@ @echo off +onyx run modules/openal/build --generate-foreign-info cl /MT /std:c17 /TC /I include /I lib/common/include /I "C:\Program Files (x86)\OpenAL 1.1 SDK\include" /D_USRDLL /D_WINDLL modules\openal\onyx_openal.c /link "C:\Program Files (x86)\OpenAL 1.1 SDK\libs\Win64\OpenAL32.lib" /DLL /OUT:onyx_openal.dll \ No newline at end of file diff --git a/modules/openal/build.onyx b/modules/openal/build.onyx new file mode 100644 index 00000000..390cfbe4 --- /dev/null +++ b/modules/openal/build.onyx @@ -0,0 +1,32 @@ +#load "core/std" +#load "scripts/c_binding" +#load "./module" + +use package core +use package c_binding + +main :: () { + result := build_c_binding(.{ + output_file = "modules/openal/onyx_openal.c", + foreign_block = (package openal).foreign_block, + + cast_map = .[ + .{ (package openal).ALCdevice, "ALCdevice *" }, + .{ (package openal).ALCcontext, "ALCcontext *" }, + ], + + preamble = .[ +""" +#include +#include +""" + ], + }); + + if !result { + println("Failed to make c-file."); + os.exit(1); + } else { + println("Sucessfully made openal.c"); + } +} \ No newline at end of file diff --git a/modules/openal/build.sh b/modules/openal/build.sh index 32d64a11..18c95210 100755 --- a/modules/openal/build.sh +++ b/modules/openal/build.sh @@ -1,3 +1,4 @@ #/bin/sh +onyx run modules/openal/build --generate-foreign-info gcc -shared -fPIC modules/openal/onyx_openal.c -lopenal -I include -I lib/common/include -o ./modules/openal/onyx_openal.so \ No newline at end of file diff --git a/modules/openal/module.onyx b/modules/openal/module.onyx index ad5bfa50..1718bcc4 100644 --- a/modules/openal/module.onyx +++ b/modules/openal/module.onyx @@ -2,13 +2,17 @@ package openal use package core { cptr } -#library "onyx_openal" +#if ((package runtime).Generated_Foreign_Info) { + foreign_block :: __foreign_block +} else { + #library "onyx_openal" +} ALCdevice :: #distinct u64 ALCcontext :: #distinct u64 ALCextfunc :: #distinct u64 -#foreign "onyx_openal" { +#local __foreign_block :: #foreign "onyx_openal" { alGenBuffers :: (n: i32, buffers: ^u32) -> void --- alDeleteBuffers :: (n: i32, buffers: ^u32) -> void --- alIsBuffer :: (buffer: u32) -> bool --- @@ -106,7 +110,7 @@ ALCextfunc :: #distinct u64 alcCaptureSamples :: (device: ALCdevice, buf: rawptr, samples: i32) -> void --- // This returns a C-allocated string, which is not supported at the moment. - alGetString :: (device: ALCdevice, param: i32) -> cptr(u8) --- + alGetString :: (param: i32) -> cptr(u8) --- alcGetString :: (device: ALCdevice, param: i32) -> cptr(u8) --- } diff --git a/modules/openal/onyx_openal.c b/modules/openal/onyx_openal.c index 79d49249..135f4b6e 100644 --- a/modules/openal/onyx_openal.c +++ b/modules/openal/onyx_openal.c @@ -1,151 +1,463 @@ -#define ONYX_LIBRARY_NAME onyx_openal -#include "onyx_library.h" +// +// THIS FILE WAS AUTOMATICALLY GENERATED. +// + #include #include + +#define ONYX_LIBRARY_NAME onyx_openal +#include "onyx_library.h" + #define P(i, k) (params->data[i].of.k) -ONYX_DEF(alGenBuffers, (INT, PTR), ()) { - alGenBuffers(params->data[0].of.i32, ONYX_PTR(params->data[1].of.i32)); +ONYX_DEF(alGenBuffers, (WASM_I32, WASM_I32), ()) { + alGenBuffers(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alDeleteBuffers, (WASM_I32, WASM_I32), ()) { + alDeleteBuffers(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alIsBuffer, (WASM_I32), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alIsBuffer(P(0, i32))); + return NULL; +} + +ONYX_DEF(alBufferData, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alBufferData(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32), P(4, i32)); + return NULL; +} + +ONYX_DEF(alBufferf, (WASM_I32, WASM_I32, WASM_F32), ()) { + alBufferf(P(0, i32), P(1, i32), P(2, f32)); + return NULL; +} + +ONYX_DEF(alBuffer3f, (WASM_I32, WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { + alBuffer3f(P(0, i32), P(1, i32), P(2, f32), P(3, f32), P(4, f32)); + return NULL; +} + +ONYX_DEF(alBufferfv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alBufferfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alBufferi, (WASM_I32, WASM_I32, WASM_I32), ()) { + alBufferi(P(0, i32), P(1, i32), P(2, i32)); + return NULL; +} + +ONYX_DEF(alBuffer3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alBuffer3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); + return NULL; +} + +ONYX_DEF(alBufferiv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alBufferiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetBufferf, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetBufferf(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetBuffer3f, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alGetBuffer3f(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); + return NULL; +} + +ONYX_DEF(alGetBufferfv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetBufferfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetBufferi, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetBufferi(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetBuffer3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alGetBuffer3i(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); + return NULL; +} + +ONYX_DEF(alGetBufferiv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetBufferiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGenSources, (WASM_I32, WASM_I32), ()) { + alGenSources(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alDeleteSources, (WASM_I32, WASM_I32), ()) { + alDeleteSources(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alIsSource, (WASM_I32), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alIsSource(P(0, i32))); + return NULL; +} + +ONYX_DEF(alSourcef, (WASM_I32, WASM_I32, WASM_F32), ()) { + alSourcef(P(0, i32), P(1, i32), P(2, f32)); return NULL; } -ONYX_DEF(alDeleteBuffers, (INT, PTR), ()) { - alDeleteBuffers(params->data[0].of.i32, ONYX_PTR(params->data[1].of.i32)); +ONYX_DEF(alSource3f, (WASM_I32, WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { + alSource3f(P(0, i32), P(1, i32), P(2, f32), P(3, f32), P(4, f32)); return NULL; } -ONYX_DEF(alIsBuffer, (INT), (BOOL)) { - results->data[0] = WASM_I32_VAL(alIsBuffer(params->data[0].of.i32)); +ONYX_DEF(alSourcefv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alSourcefv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alBufferData, (INT, INT, PTR, INT, INT), ()) { - alBufferData( - params->data[0].of.i32, - params->data[1].of.i32, - ONYX_PTR(params->data[2].of.i32), - params->data[3].of.i32, - params->data[4].of.i32); +ONYX_DEF(alSourcei, (WASM_I32, WASM_I32, WASM_I32), ()) { + alSourcei(P(0, i32), P(1, i32), P(2, i32)); return NULL; } -ONYX_DEF(alBufferf, (INT, INT, FLOAT), ()) { alBufferf(P(0, i32), P(1, i32), P(2, f32)); return NULL; } -ONYX_DEF(alBuffer3f, (INT, INT, FLOAT, FLOAT, FLOAT), ()) { alBuffer3f(P(0, i32), P(1, i32), P(2, f32), P(3, f32), P(4, f32)); return NULL; } -ONYX_DEF(alBufferfv, (INT, INT, PTR), ()) { alBufferfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alBufferi, (INT, INT, INT), ()) { alBufferi(P(0, i32), P(1, i32), P(2, i32)); return NULL; } -ONYX_DEF(alBuffer3i, (INT, INT, INT, INT, INT), ()) { alBuffer3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); return NULL; } -ONYX_DEF(alBufferiv, (INT, INT, PTR), ()) { alBufferiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetBufferf, (INT, INT, PTR), ()) { alGetBufferf(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetBuffer3f, (INT, INT, PTR, PTR, PTR), ()) { alGetBuffer3f(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); return NULL; } -ONYX_DEF(alGetBufferfv, (INT, INT, PTR), ()) { alGetBufferfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetBufferi, (INT, INT, PTR), ()) { alGetBufferi(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetBuffer3i, (INT, INT, PTR, PTR, PTR), ()) { alGetBuffer3i(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); return NULL; } -ONYX_DEF(alGetBufferiv, (INT, INT, PTR), ()) { alGetBufferiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } +ONYX_DEF(alSource3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alSource3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); + return NULL; +} + +ONYX_DEF(alSourceiv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alSourceiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetSourcef, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetSourcef(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetSource3f, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alGetSource3f(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); + return NULL; +} + +ONYX_DEF(alGetSourcefv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetSourcefv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetSourcei, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetSourcei(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alGetSource3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alGetSource3i(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); + return NULL; +} + +ONYX_DEF(alGetSourceiv, (WASM_I32, WASM_I32, WASM_I32), ()) { + alGetSourceiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alSourcePlay, (WASM_I32), ()) { + alSourcePlay(P(0, i32)); + return NULL; +} + +ONYX_DEF(alSourcePlayv, (WASM_I32, WASM_I32), ()) { + alSourcePlayv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alSourcePause, (WASM_I32), ()) { + alSourcePause(P(0, i32)); + return NULL; +} -ONYX_DEF(alGenSources, (INT, PTR), ()) { - alGenSources(params->data[0].of.i32, ONYX_PTR(params->data[1].of.i32)); +ONYX_DEF(alSourcePausev, (WASM_I32, WASM_I32), ()) { + alSourcePausev(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alDeleteSources, (INT, PTR), ()) { - alDeleteSources(params->data[0].of.i32, ONYX_PTR(params->data[1].of.i32)); +ONYX_DEF(alSourceStop, (WASM_I32), ()) { + alSourceStop(P(0, i32)); return NULL; } -ONYX_DEF(alIsSource, (INT), (BOOL)) { - results->data[0] = WASM_I32_VAL(alIsSource(params->data[0].of.i32)); +ONYX_DEF(alSourceStopv, (WASM_I32, WASM_I32), ()) { + alSourceStopv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alSourcef, (INT, INT, FLOAT), ()) { alSourcef(P(0, i32), P(1, i32), P(2, f32)); return NULL; } -ONYX_DEF(alSource3f, (INT, INT, FLOAT, FLOAT, FLOAT), ()) { alSource3f(P(0, i32), P(1, i32), P(2, f32), P(3, f32), P(4, f32)); return NULL; } -ONYX_DEF(alSourcefv, (INT, INT, PTR), ()) { alSourcefv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alSourcei, (INT, INT, INT), ()) { alSourcei(P(0, i32), P(1, i32), P(2, i32)); return NULL; } -ONYX_DEF(alSource3i, (INT, INT, INT, INT, INT), ()) { alSource3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); return NULL; } -ONYX_DEF(alSourceiv, (INT, INT, PTR), ()) { alSourceiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetSourcef, (INT, INT, PTR), ()) { alGetSourcef(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetSource3f, (INT, INT, PTR, PTR, PTR), ()) { alGetSource3f(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); return NULL; } -ONYX_DEF(alGetSourcefv, (INT, INT, PTR), ()) { alGetSourcefv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetSourcei, (INT, INT, PTR), ()) { alGetSourcei(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alGetSource3i, (INT, INT, PTR, PTR, PTR), ()) { alGetSource3i(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); return NULL; } -ONYX_DEF(alGetSourceiv, (INT, INT, PTR), ()) { alGetSourceiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } +ONYX_DEF(alSourceRewind, (WASM_I32), ()) { + alSourceRewind(P(0, i32)); + return NULL; +} + +ONYX_DEF(alSourceRewindv, (WASM_I32, WASM_I32), ()) { + alSourceRewindv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alSourceQueueBuffers, (WASM_I32, WASM_I32, WASM_I32), ()) { + alSourceQueueBuffers(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alSourceUnqueueBuffers, (WASM_I32, WASM_I32, WASM_I32), ()) { + alSourceUnqueueBuffers(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); + return NULL; +} + +ONYX_DEF(alListenerf, (WASM_I32, WASM_F32), ()) { + alListenerf(P(0, i32), P(1, f32)); + return NULL; +} + +ONYX_DEF(alListener3f, (WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { + alListener3f(P(0, i32), P(1, f32), P(2, f32), P(3, f32)); + return NULL; +} + +ONYX_DEF(alListenerfv, (WASM_I32, WASM_I32), ()) { + alListenerfv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} -ONYX_DEF(alSourcePlay, (INT), ()) { alSourcePlay(P(0, i32)); return NULL; } -ONYX_DEF(alSourcePlayv, (INT, PTR), ()) { alSourcePlayv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alSourcePause, (INT), ()) { alSourcePause(P(0, i32)); return NULL; } -ONYX_DEF(alSourcePausev, (INT, PTR), ()) { alSourcePausev(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alSourceStop, (INT), ()) { alSourceStop(P(0, i32)); return NULL; } -ONYX_DEF(alSourceStopv, (INT, PTR), ()) { alSourceStopv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alSourceRewind, (INT), ()) { alSourceRewind(P(0, i32)); return NULL; } -ONYX_DEF(alSourceRewindv, (INT, PTR), ()) { alSourceRewindv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alSourceQueueBuffers, (INT, INT, PTR), ()) { alSourceQueueBuffers(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } -ONYX_DEF(alSourceUnqueueBuffers, (INT, INT, PTR), ()) { alSourceUnqueueBuffers(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); return NULL; } +ONYX_DEF(alListeneri, (WASM_I32, WASM_I32), ()) { + alListeneri(P(0, i32), P(1, i32)); + return NULL; +} + +ONYX_DEF(alListener3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alListener3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); + return NULL; +} -ONYX_DEF(alListenerf, (INT, FLOAT), ()) { alListenerf(P(0, i32), P(1, f32)); return NULL; } -ONYX_DEF(alListener3f, (INT, FLOAT, FLOAT, FLOAT), ()) { alListener3f(P(0, i32), P(1, f32), P(2, f32), P(3, f32)); return NULL; } -ONYX_DEF(alListenerfv, (INT, PTR), ()) { alListenerfv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alListeneri, (INT, INT), ()) { alListeneri(P(0, i32), P(1, i32)); return NULL; } -ONYX_DEF(alListener3i, (INT, INT, INT, INT), ()) { alListener3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); return NULL; } -ONYX_DEF(alListeneriv, (INT, PTR), ()) { alListeneriv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } +ONYX_DEF(alListeneriv, (WASM_I32, WASM_I32), ()) { + alListeneriv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} -ONYX_DEF(alGetListenerf, (INT, PTR), ()) { alGetListenerf(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alGetListener3f, (INT, PTR, PTR, PTR), ()) { alGetListener3f(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); return NULL; } -ONYX_DEF(alGetListenerfv, (INT, PTR), ()) { alGetListenerfv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alGetListeneri, (INT, PTR), ()) { alGetListeneri(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alGetListener3i, (INT, PTR, PTR, PTR), ()) { alGetListener3i(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); return NULL; } -ONYX_DEF(alGetListeneriv, (INT, PTR), ()) { alGetListeneriv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } +ONYX_DEF(alGetListenerf, (WASM_I32, WASM_I32), ()) { + alGetListenerf(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} -ONYX_DEF(alEnable, (INT), ()) { alEnable(P(0, i32)); return NULL; } -ONYX_DEF(alDisable, (INT), ()) { alDisable(P(0, i32)); return NULL; } -ONYX_DEF(alIsEnabled, (INT), (BOOL)) { results->data[0] = WASM_I32_VAL(alIsEnabled(P(0, i32))); return NULL; } -ONYX_DEF(alGetBoolean, (INT), (BOOL)) { results->data[0] = WASM_I32_VAL(alGetBoolean(P(0, i32))); return NULL; } -ONYX_DEF(alGetDouble, (INT), (DOUBLE)) { results->data[0] = WASM_F64_VAL(alGetDouble(P(0, i32))); return NULL; } -ONYX_DEF(alGetFloat, (INT), (FLOAT)) { results->data[0] = WASM_F32_VAL(alGetFloat(P(0, i32))); return NULL; } -ONYX_DEF(alGetInteger, (INT), (INT)) { results->data[0] = WASM_I32_VAL(alGetInteger(P(0, i32))); return NULL; } -ONYX_DEF(alGetBooleanv, (INT, PTR), ()) { alGetBooleanv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alGetDoublev, (INT, PTR), ()) { alGetDoublev(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alGetFloatv, (INT, PTR), ()) { alGetFloatv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alGetIntegerv, (INT, PTR), ()) { alGetIntegerv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } -ONYX_DEF(alDistanceModel, (INT), ()) { alDistanceModel(P(0, i32)); return NULL; } -ONYX_DEF(alDopplerFactor, (FLOAT), ()) { alDistanceModel(P(0, f32)); return NULL; } -ONYX_DEF(alSpeedOfSound, (FLOAT), ()) { alDistanceModel(P(0, f32)); return NULL; } +ONYX_DEF(alGetListener3f, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alGetListener3f(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); + return NULL; +} -ONYX_DEF(alGetError, (), (INT)) { results->data[0] = WASM_I32_VAL(alGetError()); return NULL; } -ONYX_DEF(alGetString, (INT), (LONG)) { - wasm_val_init_ptr(&results->data[0], (void *) alGetString(P(0, i32))); - return NULL; -} - -ONYX_DEF(alcCreateContext, (LONG, PTR), (LONG)) { wasm_val_init_ptr(&results->data[0], alcCreateContext((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); return NULL; } -ONYX_DEF(alcMakeContextCurrent, (LONG), (BOOL)) { results->data[0] = WASM_I32_VAL(alcMakeContextCurrent((ALCcontext *) P(0, i64))); return NULL; } -ONYX_DEF(alcProcessContext, (LONG), ()) { alcProcessContext((ALCcontext *) P(0, i64)); return NULL; } -ONYX_DEF(alcSuspendContext, (LONG), ()) { alcSuspendContext((ALCcontext *) P(0, i64)); return NULL; } -ONYX_DEF(alcDestroyContext, (LONG), ()) { alcDestroyContext((ALCcontext *) P(0, i64)); return NULL; } -ONYX_DEF(alcGetCurrentContext, (), (LONG)) { wasm_val_init_ptr(&results->data[0], alcGetCurrentContext()); return NULL; } -ONYX_DEF(alcGetContextsDevice, (LONG), (LONG)) { wasm_val_init_ptr(&results->data[0], alcGetContextsDevice((ALCcontext *) P(0, i64))); return NULL; } -ONYX_DEF(alcGetError, (LONG), (INT)) { results->data[0] = WASM_I32_VAL(alcGetError((ALCdevice *) P(0, i64))); return NULL; } -ONYX_DEF(alcOpenDevice, (PTR), (LONG)) { wasm_val_init_ptr(&results->data[0], alcOpenDevice(ONYX_PTR(P(0, i32)))); return NULL; } -ONYX_DEF(alcCloseDevice, (LONG), (BOOL)) { results->data[0] = WASM_I32_VAL(alcCloseDevice((ALCdevice *) P(0, i64))); return NULL; } - -ONYX_DEF(alcIsExtensionPresent, (LONG, PTR), (BOOL)) { results->data[0] = WASM_I32_VAL(alcIsExtensionPresent((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); return NULL; } -ONYX_DEF(alcGetProcAddress, (LONG, PTR), (LONG)) { wasm_val_init_ptr(&results->data[0], alcGetProcAddress((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); return NULL; } -ONYX_DEF(alcGetEnumValue, (LONG, PTR), (INT)) { results->data[0] = WASM_I32_VAL(alcGetEnumValue((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); return NULL; } -ONYX_DEF(alcGetIntegerv, (LONG, INT, INT, PTR), ()) { alcGetIntegerv((ALCdevice *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); return NULL; } - -ONYX_DEF(alcCaptureOpenDevice, (PTR, INT, INT, INT), (LONG)) { - wasm_val_init_ptr(&results->data[0], alcCaptureOpenDevice(ONYX_PTR(P(0, i32)), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} -ONYX_DEF(alcCaptureCloseDevice, (LONG), (BOOL)) { results->data[0] = WASM_I32_VAL(alcCaptureCloseDevice((ALCdevice *) P(0, i64))); return NULL; } -ONYX_DEF(alcCaptureStart, (LONG), ()) { alcCaptureStart((ALCdevice *) P(0, i64)); return NULL; } -ONYX_DEF(alcCaptureStop, (LONG), ()) { alcCaptureStop((ALCdevice *) P(0, i64)); return NULL; } -ONYX_DEF(alcCaptureSamples, (LONG, PTR, INT), ()) { alcCaptureSamples((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32)); return NULL; } -ONYX_DEF(alcGetString, (LONG, INT), (LONG)) { - wasm_val_init_ptr(&results->data[0], (void *) alcGetString((ALCdevice *) P(0, i64), P(1, i32))); +ONYX_DEF(alGetListenerfv, (WASM_I32, WASM_I32), ()) { + alGetListenerfv(P(0, i32), ONYX_PTR(P(1, i32))); return NULL; } +ONYX_DEF(alGetListeneri, (WASM_I32, WASM_I32), ()) { + alGetListeneri(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alGetListener3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { + alGetListener3i(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); + return NULL; +} + +ONYX_DEF(alGetListeneriv, (WASM_I32, WASM_I32), ()) { + alGetListeneriv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alEnable, (WASM_I32), ()) { + alEnable(P(0, i32)); + return NULL; +} + +ONYX_DEF(alDisable, (WASM_I32), ()) { + alDisable(P(0, i32)); + return NULL; +} + +ONYX_DEF(alIsEnabled, (WASM_I32), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alIsEnabled(P(0, i32))); + return NULL; +} + +ONYX_DEF(alGetBoolean, (WASM_I32), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alGetBoolean(P(0, i32))); + return NULL; +} + +ONYX_DEF(alGetDouble, (WASM_I32), (WASM_F64)) { + results->data[0] = WASM_F64_VAL(alGetDouble(P(0, i32))); + return NULL; +} + +ONYX_DEF(alGetFloat, (WASM_I32), (WASM_F32)) { + results->data[0] = WASM_F32_VAL(alGetFloat(P(0, i32))); + return NULL; +} + +ONYX_DEF(alGetInteger, (WASM_I32), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alGetInteger(P(0, i32))); + return NULL; +} + +ONYX_DEF(alGetBooleanv, (WASM_I32, WASM_I32), ()) { + alGetBooleanv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alGetDoublev, (WASM_I32, WASM_I32), ()) { + alGetDoublev(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alGetFloatv, (WASM_I32, WASM_I32), ()) { + alGetFloatv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alGetIntegerv, (WASM_I32, WASM_I32), ()) { + alGetIntegerv(P(0, i32), ONYX_PTR(P(1, i32))); + return NULL; +} + +ONYX_DEF(alDistanceModel, (WASM_I32), ()) { + alDistanceModel(P(0, i32)); + return NULL; +} + +ONYX_DEF(alDopplerFactor, (WASM_F32), ()) { + alDopplerFactor(P(0, f32)); + return NULL; +} + +ONYX_DEF(alSpeedOfSound, (WASM_F32), ()) { + alSpeedOfSound(P(0, f32)); + return NULL; +} + +ONYX_DEF(alGetError, (), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alGetError()); + return NULL; +} + +ONYX_DEF(alcCreateContext, (WASM_I64, WASM_I32), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alcCreateContext((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); + return NULL; +} + +ONYX_DEF(alcMakeContextCurrent, (WASM_I64), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alcMakeContextCurrent((ALCcontext *) P(0, i64))); + return NULL; +} + +ONYX_DEF(alcProcessContext, (WASM_I64), ()) { + alcProcessContext((ALCcontext *) P(0, i64)); + return NULL; +} + +ONYX_DEF(alcSuspendContext, (WASM_I64), ()) { + alcSuspendContext((ALCcontext *) P(0, i64)); + return NULL; +} + +ONYX_DEF(alcDestroyContext, (WASM_I64), ()) { + alcDestroyContext((ALCcontext *) P(0, i64)); + return NULL; +} + +ONYX_DEF(alcGetCurrentContext, (), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alcGetCurrentContext()); + return NULL; +} + +ONYX_DEF(alcGetContextsDevice, (WASM_I64), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alcGetContextsDevice((ALCcontext *) P(0, i64))); + return NULL; +} + +ONYX_DEF(alcGetError, (WASM_I64), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alcGetError((ALCdevice *) P(0, i64))); + return NULL; +} + +ONYX_DEF(alcOpenDevice, (WASM_I32), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alcOpenDevice(ONYX_PTR(P(0, i32)))); + return NULL; +} + +ONYX_DEF(alcCloseDevice, (WASM_I64), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alcCloseDevice((ALCdevice *) P(0, i64))); + return NULL; +} + +ONYX_DEF(alcIsExtensionPresent, (WASM_I64, WASM_I32), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alcIsExtensionPresent((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); + return NULL; +} + +ONYX_DEF(alcGetProcAddress, (WASM_I64, WASM_I32), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alcGetProcAddress((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); + return NULL; +} + +ONYX_DEF(alcGetEnumValue, (WASM_I64, WASM_I32), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alcGetEnumValue((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); + return NULL; +} + +ONYX_DEF(alcGetIntegerv, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), ()) { + alcGetIntegerv((ALCdevice *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); + return NULL; +} + +ONYX_DEF(alcCaptureOpenDevice, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alcCaptureOpenDevice(ONYX_PTR(P(0, i32)), P(1, i32), P(2, i32), P(3, i32))); + return NULL; +} + +ONYX_DEF(alcCaptureCloseDevice, (WASM_I64), (WASM_I32)) { + results->data[0] = WASM_I32_VAL(alcCaptureCloseDevice((ALCdevice *) P(0, i64))); + return NULL; +} + +ONYX_DEF(alcCaptureStart, (WASM_I64), ()) { + alcCaptureStart((ALCdevice *) P(0, i64)); + return NULL; +} + +ONYX_DEF(alcCaptureStop, (WASM_I64), ()) { + alcCaptureStop((ALCdevice *) P(0, i64)); + return NULL; +} + +ONYX_DEF(alcCaptureSamples, (WASM_I64, WASM_I32, WASM_I32), ()) { + alcCaptureSamples((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32)); + return NULL; +} + +ONYX_DEF(alGetString, (WASM_I32), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alGetString(P(0, i32))); + return NULL; +} + +ONYX_DEF(alcGetString, (WASM_I64, WASM_I32), (WASM_I64)) { + results->data[0] = WASM_I64_VAL(alcGetString((ALCdevice *) P(0, i64), P(1, i32))); + return NULL; +} + + + ONYX_LIBRARY { ONYX_FUNC(alGenBuffers) ONYX_FUNC(alDeleteBuffers) @@ -163,7 +475,6 @@ ONYX_LIBRARY { ONYX_FUNC(alGetBufferi) ONYX_FUNC(alGetBuffer3i) ONYX_FUNC(alGetBufferiv) - ONYX_FUNC(alGenSources) ONYX_FUNC(alDeleteSources) ONYX_FUNC(alIsSource) @@ -189,7 +500,6 @@ ONYX_LIBRARY { ONYX_FUNC(alSourceRewindv) ONYX_FUNC(alSourceQueueBuffers) ONYX_FUNC(alSourceUnqueueBuffers) - ONYX_FUNC(alListenerf) ONYX_FUNC(alListener3f) ONYX_FUNC(alListenerfv) @@ -202,7 +512,6 @@ ONYX_LIBRARY { ONYX_FUNC(alGetListeneri) ONYX_FUNC(alGetListener3i) ONYX_FUNC(alGetListeneriv) - ONYX_FUNC(alEnable) ONYX_FUNC(alDisable) ONYX_FUNC(alIsEnabled) @@ -217,9 +526,7 @@ ONYX_LIBRARY { ONYX_FUNC(alDistanceModel) ONYX_FUNC(alDopplerFactor) ONYX_FUNC(alSpeedOfSound) - ONYX_FUNC(alGetError) - ONYX_FUNC(alcCreateContext) ONYX_FUNC(alcMakeContextCurrent) ONYX_FUNC(alcProcessContext) @@ -228,20 +535,18 @@ ONYX_LIBRARY { ONYX_FUNC(alcGetCurrentContext) ONYX_FUNC(alcGetContextsDevice) ONYX_FUNC(alcGetError) - ONYX_FUNC(alcOpenDevice) ONYX_FUNC(alcCloseDevice) - ONYX_FUNC(alcIsExtensionPresent) ONYX_FUNC(alcGetProcAddress) ONYX_FUNC(alcGetEnumValue) ONYX_FUNC(alcGetIntegerv) - ONYX_FUNC(alcCaptureOpenDevice) ONYX_FUNC(alcCaptureCloseDevice) ONYX_FUNC(alcCaptureStart) ONYX_FUNC(alcCaptureStop) ONYX_FUNC(alcCaptureSamples) - + ONYX_FUNC(alGetString) + ONYX_FUNC(alcGetString) NULL }; \ No newline at end of file diff --git a/modules/openal/onyx_openal.so b/modules/openal/onyx_openal.so index 7b8357933ac60f375b03645015e14b1993fca5ee..d853604de658d67dda22d0fce54c4c217c849cf3 100755 GIT binary patch delta 16518 zcmaKT33yXQ_kJdAO2gJ0w%bskEnC@>vKLtzwzMvg3Mf0Rpd#{V$|4{jR6wn`q#iLK zAg$Y{elD%J;U|8rB0G`_A|Psuh#;sbpio8gf9K9jY3|SGp9gx*yzhC>oS8fKX6{XL z^flX=*KC1Ahef_JrJY^Wb%6cKjiPm>=q{JNZGX{dTU6q*r?e1_l%iuU`^xU3F>tGc zB{2IXt7u-LuGY6Q=63vk?T?Yh;qjtWxpFt zian8SH!z>w%?9#fXuUnm8W>)2LpS>mRW_W#exUS5UZxvpppiRc9LCkm(%ACT8jK3B z4#HS+fIBR$ELEok5R%h20ZoTRx0G+KZL~jzmQlB@Z__wt_ujr>+=6*`-E$}Pa18Ed zaepji@iLt@RX77pc!-J|Gpx?3bivV!g($U|mu;lGnz>k*HZ=2E+fJjC&F;e#O=|99 z8WlG8vTjrf-%YHAmo2627B1$aCGam%1$;l%z+X)nEnO@?ceV7gN-Be2O4aa3P}f#2 zbTg@ymmQ)K_+hGqKa-p~&!4S(*=tk;-%S3vJ%R7@(xPicc8QIL*#7jWiL@)>qRK*SZm&mJ;}>PQBD%?rU3rOv!}8QfKpSv*4FpZoYY?E zVMD5yd8s;;_uy#nWqW8+d)`AK{NJe(zDBHr7Yi}F1Mgr7{FkT#zK?3)r%^^n-oafR zz3hD|gCC%3_+IMTiH~4XCog-LO5lg668^8`?9B6LclNS;DuS<31^l>Sa4AuPg7N2!0kFgO7vI z&C6C$PB-Hqbn{x-6589X7e5LhdXcBQaTL0H*%aE=eG!&IdXGh{mR`l*VU*f)5qpX@ z;P1EO=*9c@^zyP?Duf@PZSYSLbMfxeU0ybemcS3utME@#4g4^ry1mxs%W00AAEFIz zFRlvJZazXsy4RV%T$~|`tE0~xEQ|CRNLq=%?^1ei-J10PUEh1Ub03L7_sM9%2CC@o zvioZUno9+}ab4-7v2Q4~kBh>+;~gta3Y;i?TsRCH!29~dJIYNwPM$t4D;89CeMhtI#QN!2(awI0*f}cdHv^|e4UoBH z??1yiUZpq{-NSY&=s$zaq3Zs+b!Gwm(SN#gnG7v8h5kwT17@(tsB(bLo};q^T-I<6 zwI0|jXQRsfLv-%URiZu6gu4$4Jkx~xB%VvD19d7LsNo1z4Aiam)pUH|bmvZ0mq|96 zaxz?Y?Se>JWr&M2G@t-gX2Kegd9f)*qsl=#g$Bh_cu*#LW^4L&|Bg#7Rx9wV5UK8}B(71lM|UKe zSj@z5ol=I!JG+>eD!H88LG%~u+ccu_)|8Rw8Ed(<$>=mIuK4}3esvD4r`cU08Vz7F zwhqZ|6w@j6$u($7z0jle@TprpH#U!X+xMca&FotdbKz|MACXAlVnVw=W=}NQdAv=& zTlB4$Cv>%~;LL?crJvKn^uCbthM;(%S4AXlPdf} ztZn|L{CoOn$x)m`aIe+U19$Ybw)m4mE4z_CCyDZ>b=7*@RzFR<+mNOO<<5zxgu8n* z9939Vc&u>enNxpK&SDpho!zd{9SQe*Qn<75;F%k*qN^^nZ2DO1)>^~;-<^%Low@bX zeUOWEZD>Zm%ev}!BWCRE4%TNx_@>!e)>D`3l#8%0y*8e^X4EOi3nj8A{D?j6wU}d6 zkk^s|OXH0WR@YMMqVDwh%ti_0qryfbY?Q{gzSpD|rWxbRT-cOm%u3bXm{yd6IjREOu=)HwScLrd^wru&1-0NoL)aTU!0P@9 zgXyEq_tj5xyU&RDm`d*LVXgj=M zyn5@-AHa3vx(0U5S-?pu_yXn=Na6qUy*QBqPA(L@mSO44?F>nHutYbbdDYGMb; zxA;2kx~PzzJY?k$3e-wM0Zo2q^nFzvz#*{=LKMm-f*xS(+^ggUec<#X{$7A7Dp; zEyb=gFaJ}@5ntlSOh~viw0@q`R9T>wV%-R>O+@IJsL;%R3XT8K+!de3_lDH(z6_Utx$tlia8uL%a?{Y!fAG%4Kb+`zp_hTfdA%jKS^slyB@NVB6%m#WTS(eq7e7 z^IBHn@}pUW3qx6JN8$g(c-W&^d{$PKyGO2_UB8_&a&2z?wuUfI;ZCIxrSRDvGPvFd zVr;I##t<&AYL#|&WZ}t?g}?J@EJ<~kXr%}zyG}`ZKZ8bc31gjyH;@7m-E)1&IjqTJR(?q3O?>Iy&*R;ec>kvQpaP&G!#rSyrS!*Yp z$y$3e?9K5QO5s;$CWd6Bwo*?jTz&=PIhVmZns6nnP($l8w5EM(*&6rI1^e59mt%~F zV=L+&j#={N&b-!ONio;)$C20+S+xH~B3g{aQd%B~41_I*^}*VAMIy6d*TOym+hlhn z@(S!!*!{4r_e3IL*t=o1Sc~NptQ&U0Ug%*fU|0Cz^x21PJ?y8jrLg1nMO|Ng*u}8TD!Ol7oiB!Q}g0(cTSXSc{PJ!Krbw3hz%CSgf z7VIOit6>`+k3?RC9RRxnb{p&|*we7FxJRA+btKXeb{*_USREIWS+M^;u>uL;4EP2K zU>Cvefc*~k6l~tNNMN^Ew!n6Tt%V&4yYxFGfc*=0HEiE%Og-#-u)ARgp2S@R?7iPd zB8?kbEH$t_VB4LFL~ew=0d_9zvn${P;GBhh2iEmNByt$`LD(y>pTj0LvRHhlaqMBg zfSm|C{zptb>=D@YurX&a^{~BRkHY4`UV$x!O>B&U&SL6e3t@9%KY(2cyW&SU#c*2v z6p56>UJqLZ`#7wniN*3YY)9Cs=OU3T*f(J3!j3zS!eP(Bz61Nj&*&J|{R=vVt%Xf# zihRFf#$cDg&Vqdfb~Ws%FlMZ&CBgC#oZSG9!=7(S4cB+JU3nihQNQ&adi%Fy>GBJ# ze6@h(kBesm4`5}fR~tAB@PEUnG-gZdxToR%$=y~|wLUiP9W~p(m`o`9ADR7(a;e1>s+z0m1-y7S-&4OF9*9ce**Rjv2_C>h! zxhtyOf##R{P;Kjmd{}4DwCv|~#>L}gPTx;M(P z5cvq)B?ov%wpZYurEd_q8{Q=PYh$wQJiKL;x+%%l7^nAn^1$l>Zz|<&N{;ivTTy9L z>4*DkCEbHL4ZyuxX%t)vcls9w8iITG7X})JdqAKX4$X0ay5SB!WW@U5W*;(Q{c!(t z$mk*fH|a2UseE(n@U^%UWMagYQBAdntRtGlEo$5VC!&QwN!5K^TFeG?HX^*sY~Sp|HhZ1R=5dA;EKZ&Kr{acb=%S| z?j5+RzcPXj!#&MiBgl3M%`ED=CE1pU%g_|MX-krAAiVALFL)E-?WM=zEr$0MRc=XY zn1VVsp=CYJk9=1?oN_dK;tDnze%*A8S{1VxRi*%{0zZyg7AMZSJ^c*?fImhyyZsgEkqZ@OtSPQiPVdcKgxr}9voWOx$7U%09nuep@{W->mM zxa-Xs`0Q{G{H1jEO&6O;&bN|Ni${tmEJfq>fkRjuw)pkZPaF8&!{ z?~0+0xqO#|mtT_j7_GwP=!U0K{1uR>n<{`Vm1wC%eZ)R-IW9>wBvE{T19UYWoAFmz zq5&!ZS}9R&hhXt^ALxi&(Q->PMC?z63%1^U`;0u4wM^#UC< zQ=p|1MZG&*j=d5MNfh-0b=)pu!xBZkKuaX5eI_$e1<($6h?ZNTsP{7$KC4UrY?$Mc z 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 LY*8?M0!#aU4oaf+ literal 87384 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 diff --git a/modules/stb_image/build.onyx b/modules/stb_image/build.onyx index 9efc23a9..feda8a67 100644 --- a/modules/stb_image/build.onyx +++ b/modules/stb_image/build.onyx @@ -1,7 +1,7 @@ #load "scripts/c_library" use package core -main :: (args) => { +main :: () { path := module_path(#file); compile_c_file( diff --git a/modules/stb_image/stb_image.so b/modules/stb_image/stb_image.so index f3e460cde2a737a073c23ac9e6027644b532dacc..a33bd17e943d60af2729540f6503a2832c62e07b 100755 GIT binary patch delta 88 zcmV-e0H^=(?g{Yj36K~9006NX_5u{8uEAg!QU)UV!vrR7TD$o}O%x`BBm;*e0|B=r u0|FQ^5ivP+Vs&nGbulR*F)=POE-;gU0vnSM1_ZZkGy)_-0VbD`b^_m8vm5^a delta 87 zcmV-d0I2`)?g{Yj36K~9ASAIG_5u{J88aje@Jx bool { @@ -27,6 +33,14 @@ build_c_binding :: (use binding_config: Binding_Config) -> bool { write_file_introduction(^writer, preamble, fb.module_name); for fb.funcs { + for impl: custom_implementations { + if impl.name == it.name { + io.write(^writer, impl.impl); + io.write(^writer, "\n"); + continue continue; + } + } + write_function_body(^writer, it, cast_map); } @@ -37,6 +51,10 @@ build_c_binding :: (use binding_config: Binding_Config) -> bool { } write_file_introduction :: (writer: ^io.Writer, preamble: [] str, name: str) { + io.write_format(writer, "//\n"); + io.write_format(writer, "// THIS FILE WAS AUTOMATICALLY GENERATED.\n"); + io.write_format(writer, "//\n"); + for text: preamble { io.write_format(writer, "{}\n", text); } diff --git a/scripts/c_library.onyx b/scripts/c_library.onyx index f42d4311..33c84a57 100644 --- a/scripts/c_library.onyx +++ b/scripts/c_library.onyx @@ -11,7 +11,8 @@ Linux_Compiler :: "/usr/bin/gcc" // Call as module_path(#file) module_path :: (file_path: str) -> str { out := file_path; - while out.count > 0 && (out[out.count - 1] != #char "/" && out[out.count - 1] != #char "\\") { + while out.count > 0 { + if out[out.count - 1] == #char "/" || out[out.count - 1] == #char "\\" do break; out.count -= 1; } -- 2.25.1