Skip to content

CStr should have a function like from_bytes_with_nul() that reads until the first '\0' #49107

Closed

Description

@Boscop

When dealing with FFI (fixed char buffers in file formats that represent strings and passing fixed char buffers to C code to write chars to them up to a given max len) I often find myself doing this:

let end = s.iter().position(|&b| b == 0).map_or(0, |i| i + 1);
CStr::from_bytes_with_nul(&s[..end])

Because if I pass the whole slice to it, it returns a FromBytesWithNulError.
There should be a function that combines both lines and read until the first '\0' byte in the slice.

Something like:

CStr::from_bytes_until_nul(slice)

And yes, I did write my own function for my use case but I find myself copying these two lines around into different projects dealing with FFI and I think it would make sense to have this (arguably) "basic functionality" in std's CStr :)

Activity

  1. kennytm commented on Mar 17, 2018

    @kennytm
    Member

    This has been proposed before as #20475, and closed because this is already supported by the package c_fixed_string.

  2. added
    T-libs-api[DEPRECATED; DO NOT USE]
    C-feature-requestCategory: A feature request, i.e: not implemented / a PR.
    on Mar 17, 2018
  3. GuillaumeGomez commented on Mar 18, 2018

    @GuillaumeGomez
    Member

    That's a bit sad and problematic that such a basic functionality isn't implemented on CStr directly...

  4. kanekv commented on Aug 16, 2018

    @kanekv

    Why does from_bytes_with_nul accept &[u8], whereas char by default is signed?

  5. czipperz commented on Apr 12, 2019

    @czipperz
    Contributor

    @kanekv are you talking about in C? Because in C char's sign is undefined. We use u8 because we treat them as bytes -- which are treated as unsigned 8 bit numbers.

  6. patrickelectric commented on Oct 7, 2020

    @patrickelectric
    Contributor

    @kennytm is there a possibility to accept such function inside CStr and not rely on a package for that ?
    This is really a basic thing to have for any person that is dealing with fixed size char arrays, I totally agree with @GuillaumeGomez

  7. Boscop commented on Feb 13, 2021

    @Boscop
    Author

    @patrickelectric I agree. The reason that some functionality is offered by a thirdparty crate is not a valid reason to not have it in std.
    Many functions in std could theoretically be factored out into other crates, but they are part of std for good reasons!
    E.g. the boolinator crate provides a function to map a bool to an Option, but bool::then was still added to std, and for the same reason, the proposed CStr::from_bytes_until_nul should be added to std. :)

  8. tgross35 commented on Aug 3, 2023

    @tgross35
    Member

    cstr_from_bytes_until_nul is now stable and available since 1.69.0: #107429

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-feature-requestCategory: A feature request, i.e: not implemented / a PR.T-libs-api[DEPRECATED; DO NOT USE]

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions