diff options
author | Robby Zambito <contact@robbyzambito.me> | 2025-04-26 10:39:07 -0400 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2025-04-27 16:18:48 -0400 |
commit | fe1c735026b08e6985dc267a7487cc58998cbaf5 (patch) | |
tree | 353ac2e12ce019642c1c9a8f03c7c29e38d5ee97 /src | |
parent | 444f4868d53a3faf7edd2eb04d171516b6e505bb (diff) |
Add C to Zig converter
Further simplify struct
Diffstat (limited to 'src')
-rw-r--r-- | src/c_api.zig | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/src/c_api.zig b/src/c_api.zig index 7be260e..d3ad168 100644 --- a/src/c_api.zig +++ b/src/c_api.zig @@ -10,23 +10,19 @@ fn zigToCMessage(msg: ?*zaprus.Message) !?*c.SaprusMessage { switch (m.*) { .relay => |r| { res.headers.relay = .{ - .unnamed_0 = .{ - .dest = r.header.dest, - }, + .dest = r.header.dest, }; res.payload_len = @intCast(r.payload.len); res.payload = (try allocator.alloc(u8, r.payload.len)).ptr; }, .connection => |con| { res.headers.connection = .{ - .unnamed_0 = .{ - .src_port = con.header.src_port, - .dest_port = con.header.dest_port, - .seq_num = con.header.seq_num, - .msg_id = con.header.msg_id, - ._reserved = con.header.reserved, - .options = @bitCast(con.header.options), - }, + .src_port = con.header.src_port, + .dest_port = con.header.dest_port, + .seq_num = con.header.seq_num, + .msg_id = con.header.msg_id, + ._reserved = con.header.reserved, + .options = @bitCast(con.header.options), }; res.payload_len = @intCast(con.payload.len); @@ -39,14 +35,45 @@ fn zigToCMessage(msg: ?*zaprus.Message) !?*c.SaprusMessage { } else return null; } -fn cToZigMessage(msg: ?*c.SaprusMessage) ?*zaprus.Message { - _ = msg; - return @constCast(&zaprus.Message{ - .relay = .{ - .header = .{ .dest = @splat(0) }, - .payload = &.{0}, - }, - }); +fn cToZigMessage(msg: ?*c.SaprusMessage) !?*zaprus.Message { + if (msg) |m| { + const msg_type: zaprus.PacketType = @enumFromInt(m.*.packet_type); + var res: zaprus.Message = switch (msg_type) { + .relay => .{ + .relay = .{ + .header = .{ + .dest = m.*.headers.relay.dest[0..4].*, + }, + .payload = blk: { + const p = try allocator.alloc(u8, m.payload_len); + @memcpy(p, m.payload[0..m.payload_len]); + break :blk p; + }, + }, + }, + .connection => .{ + .connection = .{ + .header = .{ + .src_port = m.*.headers.connection.src_port, + .dest_port = m.*.headers.connection.dest_port, + .seq_num = m.*.headers.connection.seq_num, + .msg_id = m.*.headers.connection.msg_id, + .reserved = m.*.headers.connection._reserved, + .options = @bitCast(m.*.headers.connection.options), + }, + .payload = blk: { + const p = try allocator.alloc(u8, m.payload_len); + @memcpy(p, m.payload[0..m.payload_len]); + break :blk p; + }, + }, + }, + .file_transfer => return zaprus.Error.NotImplementedSaprusType, + else => return zaprus.Error.UnknownSaprusType, + }; + + return &res; + } else return null; } // client @@ -82,7 +109,7 @@ export fn zaprus_connect(payload: [*]const u8, len: usize) ?*c.SaprusMessage { /// ptr should be freed by the caller. export fn zaprus_message_to_bytes(msg: c.SaprusMessage, ptr: *[*]u8, len: *usize) c_int { - if (cToZigMessage(@constCast(&msg))) |m| { + if (cToZigMessage(@constCast(&msg)) catch return 1) |m| { const bytes = m.toBytes(allocator) catch return 1; ptr.* = bytes.ptr; len.* = bytes.len; |