raw-cstr 0.1.4

Keep raw-cstrings in thread local storage for reuse
Documentation
// Copyright (C) 2023 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

use std::ffi::CStr;

use anyhow::Result;
use raw_cstr::raw_cstr;

#[test]
fn test_string_eq() -> Result<()> {
    const ORIG_STR: &str = "Hello, world!";
    let c_str = raw_cstr(ORIG_STR)?;

    let rust_str = unsafe { CStr::from_ptr(c_str as *mut u8) }
        .to_str()
        .expect("Couldn't get CStr")
        .to_owned();

    assert_eq!(rust_str, ORIG_STR, "Raw C String doesn't match");

    Ok(())
}

#[test]
fn test_strings_reused() -> Result<()> {
    const ORIG_STR: &str = "Hello, world!";
    let c_str = raw_cstr(ORIG_STR)?;
    let o_c_str = raw_cstr(ORIG_STR)?;

    assert_eq!(
        c_str as usize, o_c_str as usize,
        "String pointers are different"
    );

    let rust_str = unsafe { CStr::from_ptr(c_str as *mut u8) }
        .to_str()
        .expect("Couldn't get CStr")
        .to_owned();
    let o_rust_str = unsafe { CStr::from_ptr(o_c_str as *mut u8) }
        .to_str()
        .expect("Couldn't get CStr")
        .to_owned();

    assert_ne!(rust_str.as_ptr(), c_str as *const u8);
    assert_ne!(o_rust_str.as_ptr(), c_str as *const u8);
    assert_ne!(rust_str.as_ptr(), o_rust_str.as_ptr());

    assert_eq!(rust_str, ORIG_STR, "Raw C String doesn't match rust string");
    assert_eq!(
        o_rust_str, ORIG_STR,
        "Other Raw C String doesn't match rust string"
    );
    assert_eq!(rust_str, o_rust_str, "Raw C strings don't match each other");

    Ok(())
}