libc: strdup, strndup, wcsdup (#31935)

Contributes to: #30978

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31935
Reviewed-by: Andrew Kelley <andrew@ziglang.org>
This commit is contained in:
Chris Boesch
2026-04-22 01:57:58 +02:00
committed by Andrew Kelley
parent 22945fbbdc
commit 3ea77badf9
11 changed files with 108 additions and 38 deletions
+20
View File
@@ -1,6 +1,7 @@
const builtin = @import("builtin");
const std = @import("std");
const symbol = @import("../c.zig").symbol;
const c = std.c;
comptime {
if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) {
@@ -24,6 +25,8 @@ comptime {
symbol(&strpbrk, "strpbrk");
symbol(&strstr, "strstr");
symbol(&strtok, "strtok");
symbol(&strdup, "strdup");
symbol(&strndup, "strndup");
// strlen is in compiler_rt
symbol(&strtok_r, "strtok_r");
@@ -164,6 +167,23 @@ fn strtok(noalias maybe_str: ?[*:0]c_char, noalias values: [*:0]const c_char) ca
return strtok_r(maybe_str, values, &state.str);
}
fn strdup(str: [*:0]const c_char) callconv(.c) ?[*:0]c_char {
const len = std.mem.len(str);
const d_opaque = c.malloc(len + 1) orelse return null;
const d: [*]c_char = @ptrCast(d_opaque);
@memcpy(d[0 .. len + 1], str[0 .. len + 1]);
return @ptrCast(d);
}
fn strndup(str: [*:0]const c_char, n: usize) callconv(.c) ?[*:0]c_char {
const len = strnlen(str, n);
const d_opaque = c.malloc(len + 1) orelse return null;
const d: [*]c_char = @ptrCast(d_opaque);
@memcpy(d[0..len], str[0..len]);
d[len] = 0;
return @ptrCast(d);
}
// strlen is in compiler_rt
fn strtok_r(noalias maybe_str: ?[*:0]c_char, noalias values: [*:0]const c_char, noalias state: *?[*:0]c_char) callconv(.c) ?[*:0]c_char {