1const std = @import("std");
2const builtin = @import("builtin");
3const symbol = @import("../c.zig").symbol;
4
5comptime {
6 if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) {
7 symbol(&insque, "insque");
8 symbol(&remque, "remque");
9 }
10}
11
12/// Not defined in `std.c` because C headers don't either.
13const Node = extern struct {
14 next: ?*Node,
15 prev: ?*Node,
16};
17
18fn insque(element: *anyopaque, pred: ?*anyopaque) callconv(.c) void {
19 const e: *Node = @ptrCast(@alignCast(element));
20
21 if (pred) |p_ptr| {
22 const p: *Node = @ptrCast(@alignCast(p_ptr));
23 e.next = p.next;
24 e.prev = p;
25 p.next = e;
26
27 if (e.next) |next| {
28 next.prev = e;
29 }
30 } else {
31 e.next = null;
32 e.prev = null;
33 }
34}
35
36fn remque(element: *anyopaque) callconv(.c) void {
37 const e: *Node = @ptrCast(@alignCast(element));
38
39 if (e.next) |next| next.prev = e.prev;
40 if (e.prev) |prev| prev.next = e.next;
41}