From fe26cb002db4b7bd9a53265690aba19a54ebe50f Mon Sep 17 00:00:00 2001 From: Robby Zambito Date: Sat, 19 Apr 2025 23:56:47 -0400 Subject: Initial C api --- src/c_api.zig | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/c_api.zig (limited to 'src/c_api.zig') diff --git a/src/c_api.zig b/src/c_api.zig new file mode 100644 index 0000000..bb233e0 --- /dev/null +++ b/src/c_api.zig @@ -0,0 +1,56 @@ +// client + +export fn zaprus_init() c_int { + SaprusClient.init() catch return 1; + return 0; +} + +export fn zaprus_deinit() c_int { + SaprusClient.deinit(); + return 0; +} + +export fn zaprus_send_relay(payload: [*]const u8, len: usize, dest: [4]u8) c_int { + SaprusClient.sendRelay(payload[0..len], dest, allocator) catch return 1; + return 0; +} + +export fn zaprus_send_initial_connection(payload: [*]const u8, len: usize, initial_port: u16) c_int { + SaprusClient.sendInitialConnection(payload[0..len], initial_port, allocator) catch return 1; + return 0; +} + +export fn zaprus_connect(payload: [*]const u8, len: usize) ?*SaprusMessage { + return SaprusClient.connect(payload[0..len], allocator) catch null; +} + +// message + +/// ptr should be freed by the caller. +export fn zaprus_message_to_bytes(msg: SaprusMessage, ptr: *[*]u8, len: *usize) c_int { + const bytes = msg.toBytes(allocator) catch return 1; + ptr.* = bytes[0..].*; + len.* = bytes.len; + return 0; +} + +/// Return value should be destroyed with zaprus_message_deinit. +export fn zaprus_message_from_bytes(bytes: [*]const u8, len: usize) ?*SaprusMessage { + return SaprusMessage.fromBytes(bytes[0..len], allocator) catch null; +} + +export fn zaprus_message_deinit(msg: *SaprusMessage) void { + msg.deinit(allocator); +} + +const std = @import("std"); + +const zaprus = @import("./root.zig"); +const SaprusClient = zaprus.Client; +const SaprusMessage = zaprus.Message; + +const allocator = std.heap.c_allocator; + +test { + std.testing.refAllDeclsRecursively(@This()); +} -- cgit