diff --git a/lib/c.zig b/lib/c.zig index 2e21581588..63597e3022 100644 --- a/lib/c.zig +++ b/lib/c.zig @@ -68,6 +68,7 @@ comptime { _ = @import("c/malloc.zig"); } _ = @import("c/math.zig"); + _ = @import("c/search.zig"); _ = @import("c/stdlib.zig"); _ = @import("c/string.zig"); _ = @import("c/strings.zig"); diff --git a/lib/c/search.zig b/lib/c/search.zig new file mode 100644 index 0000000000..271aec873e --- /dev/null +++ b/lib/c/search.zig @@ -0,0 +1,67 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const symbol = @import("../c.zig").symbol; + +comptime { + if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { + symbol(&insque, "insque"); + symbol(&remque, "remque"); + } +} + +const Node = extern struct { + next: ?*Node, + prev: ?*Node, +}; + +fn insque(element: *anyopaque, pred: ?*anyopaque) callconv(.c) void { + const e: *Node = @ptrCast(@alignCast(element)); + + if (pred) |p_ptr| { + const p: *Node = @ptrCast(@alignCast(p_ptr)); + e.next = p.next; + e.prev = p; + p.next = e; + + if (e.next) |next| { + next.prev = e; + } + } else { + e.next = null; + e.prev = null; + } +} + +fn remque(element: *anyopaque) callconv(.c) void { + const e: *Node = @ptrCast(@alignCast(element)); + + if (e.next) |next| next.prev = e.prev; + if (e.prev) |prev| prev.next = e.next; +} + +test "insque and remque" { + var first = Node{ .next = null, .prev = null }; + var second = Node{ .next = null, .prev = null }; + var third = Node{ .next = null, .prev = null }; + + insque(&first, null); + try std.testing.expectEqual(@as(?*Node, null), first.next); + try std.testing.expectEqual(@as(?*Node, null), first.prev); + + insque(&second, &first); + try std.testing.expectEqual(@as(?*Node, &second), first.next); + try std.testing.expectEqual(@as(?*Node, &first), second.prev); + + insque(&third, &first); + try std.testing.expectEqual(@as(?*Node, &third), first.next); + try std.testing.expectEqual(@as(?*Node, &second), third.next); + try std.testing.expectEqual(@as(?*Node, &first), third.prev); + try std.testing.expectEqual(@as(?*Node, &third), second.prev); + + remque(&third); + try std.testing.expectEqual(@as(?*Node, &second), first.next); + try std.testing.expectEqual(@as(?*Node, &first), second.prev); + + remque(&second); + try std.testing.expectEqual(@as(?*Node, null), first.next); +} diff --git a/lib/libc/musl/src/search/insque.c b/lib/libc/musl/src/search/insque.c deleted file mode 100644 index b7475d84f3..0000000000 --- a/lib/libc/musl/src/search/insque.c +++ /dev/null @@ -1,32 +0,0 @@ -#include - -struct node { - struct node *next; - struct node *prev; -}; - -void insque(void *element, void *pred) -{ - struct node *e = element; - struct node *p = pred; - - if (!p) { - e->next = e->prev = 0; - return; - } - e->next = p->next; - e->prev = p; - p->next = e; - if (e->next) - e->next->prev = e; -} - -void remque(void *element) -{ - struct node *e = element; - - if (e->next) - e->next->prev = e->prev; - if (e->prev) - e->prev->next = e->next; -} diff --git a/src/libs/musl.zig b/src/libs/musl.zig index 54fa1aed85..b201c1b7ff 100644 --- a/src/libs/musl.zig +++ b/src/libs/musl.zig @@ -1296,7 +1296,6 @@ const src_files = [_][]const u8{ "musl/src/sched/sched_setscheduler.c", "musl/src/sched/sched_yield.c", "musl/src/search/hsearch.c", - "musl/src/search/insque.c", "musl/src/search/lsearch.c", "musl/src/search/tdelete.c", "musl/src/search/tdestroy.c", diff --git a/src/libs/wasi_libc.zig b/src/libs/wasi_libc.zig index 2809f5c9f3..869c4d52da 100644 --- a/src/libs/wasi_libc.zig +++ b/src/libs/wasi_libc.zig @@ -848,7 +848,6 @@ const libc_top_half_src_files = [_][]const u8{ "musl/src/regex/fnmatch.c", "musl/src/regex/regerror.c", "musl/src/search/hsearch.c", - "musl/src/search/insque.c", "musl/src/search/lsearch.c", "musl/src/search/tdelete.c", "musl/src/search/tdestroy.c",