Skip to content

Implement some string functions for libzigc #23847

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from

Conversation

RcCreeperTech
Copy link

@RcCreeperTech RcCreeperTech commented May 10, 2025

Progress towards #2879.

  • Add memchr, memrchr, strchr, strchrnul, strrchr, index, rindex, memset, memccpy, memmem, mempcpy, stpcpy, stpncpy, strcat, strcpy, strncpy, strnlen
  • Remove memcmp and depend on compiler_rt implementation

Copy link
Contributor

@rpkak rpkak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought about creating a PR with functions like this a few weeks ago but decided not to start working on it until #23538 is resolved because I don't want to make a nearly unnoticeable diversion between libzigc and libc. Since this PR exists now, I tested it against "libc-test/src/functional/string*.c" and found the following error:

src/functional/string_strchr.c:73: strchr(s,128) with align=0 returned 0, wanted str+127
src/functional/string_strchr.c:73: strchr(s,128) with align=1 returned 0, wanted str+127
src/functional/string_strchr.c:73: strchr(s,128) with align=2 returned 0, wanted str+127
src/functional/string_strchr.c:73: strchr(s,128) with align=3 returned 0, wanted str+127
src/functional/string_strchr.c:73: strchr(s,128) with align=4 returned 0, wanted str+127
src/functional/string_strchr.c:73: strchr(s,128) with align=5 returned 0, wanted str+127
src/functional/string_strchr.c:73: strchr(s,128) with align=6 returned 0, wanted str+127
src/functional/string_strchr.c:73: strchr(s,128) with align=7 returned 0, wanted str+127
src/functional/string_strchr.c:74: strchr(s,255) with align=0 returned 0, wanted str+254
src/functional/string_strchr.c:74: strchr(s,255) with align=1 returned 0, wanted str+254
src/functional/string_strchr.c:74: strchr(s,255) with align=2 returned 0, wanted str+254
src/functional/string_strchr.c:74: strchr(s,255) with align=3 returned 0, wanted str+254
src/functional/string_strchr.c:74: strchr(s,255) with align=4 returned 0, wanted str+254
src/functional/string_strchr.c:74: strchr(s,255) with align=5 returned 0, wanted str+254
src/functional/string_strchr.c:74: strchr(s,255) with align=6 returned 0, wanted str+254
src/functional/string_strchr.c:74: strchr(s,255) with align=7 returned 0, wanted str+254

It is caused by @as(c_char, @bitCast(@as(u8, 128))) == -128 != 128.

@alexrp
Copy link
Member

alexrp commented May 12, 2025

Has conflicts after #23835 due to files being moved; a rebase should be enough to deal with it automatically.

@alexrp
Copy link
Member

alexrp commented May 12, 2025

In hindsight, the way I set things up in lib/c.zig didn't really make sense:

zig/lib/c.zig

Lines 16 to 34 in 833d4c9

comptime {
if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) {
// Files specific to musl and wasi-libc.
_ = @import("c/string.zig");
_ = @import("c/strings.zig");
}
if (builtin.target.isMuslLibC()) {
// Files specific to musl.
}
if (builtin.target.isWasiLibC()) {
// Files specific to wasi-libc.
}
if (builtin.target.isMinGW()) {
// Files specific to MinGW-w64.
}
}

I suggest you move those two @imports above any of the libc-specific blocks, and instead cover the @exports with appropriate builtin.target.is*LibC() checks in lib/c/string[s].zig. In particular, most of the exports aren't needed for MinGW - only mempcpy and strnlen at this time, AFAICT.

- Add memchr, memrchr, strchr, strchrnul, strrchr
- Remove memcmp and depend on compiler_rt implementation
Add index, rindex, memset
strrchr will return the address of the null terminator it c == 0
- add memccpy, memmem, mempcpy, stpcpy, stpncpy, strcat, strcpy, strncpy, strnlen
- Correct pointer types for alignment
- Use stdlib functions for `memchr` and `memrchr`
- Remove `mempcpy` and `strnlen` implementaitons from `lib/libc/mingw`
- Remove duplicate `__aeabi_mem*` symbols
- fix tests for `strchr` and `strrchr`
@alexrp
Copy link
Member

alexrp commented May 15, 2025

This'll need a rebase due to #23840 being merged, but feel free to wait until I actually review the function implementations here.

fn stpcpy(noalias dest: [*:0]c_char, noalias src: [*:0]const c_char) callconv(.c) [*:0]c_char {
var d: [*:0]c_char = dest;
var s: [*:0]const c_char = src;
// QUESTION: is std.mem.span -> @memset more efficient here?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you'd have to just measure this with a few different array sizes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants