mirror of
https://codeberg.org/ziglang/zig.git
synced 2026-10-28 19:00:52 +08:00
closes https://github.com/ziglang/zig/issues/9342 closes https://github.com/ziglang/zig/issues/15005 closes https://github.com/ziglang/zig/issues/20747 closes https://github.com/ziglang/zig/issues/22570 closes https://codeberg.org/ziglang/zig/issues/30977
42 lines
958 B
Zig
42 lines
958 B
Zig
const std = @import("std");
|
|
const builtin = @import("builtin");
|
|
const symbol = @import("../c.zig").symbol;
|
|
|
|
comptime {
|
|
if (builtin.target.isMuslLibC()) {
|
|
symbol(&insque, "insque");
|
|
symbol(&remque, "remque");
|
|
}
|
|
}
|
|
|
|
/// Not defined in `std.c` because C headers don't either.
|
|
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;
|
|
}
|