mirror of
https://codeberg.org/ziglang/zig.git
synced 2026-04-27 19:09:47 +03:00
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:
committed by
Andrew Kelley
parent
22945fbbdc
commit
3ea77badf9
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user