use std::ffi::CStr;
use std::ffi::c_char;

#[cfg(target_family = "unix")]
extern "C" {
    fn _2_c_func() -> *const c_char;
}

fn main() -> Result<(), String> {
    let raw_string_pointer: *const c_char = unsafe { _2_c_func() };
    if raw_string_pointer.is_null() {
        return Err(String::from("pointer is null"));
    };
    let c_string = unsafe { CStr::from_ptr(raw_string_pointer) }; // SAFETY: we are assuming the
    // string is null terminated since we created it ourselves in a previous program. However, if
    // it is not, it is UB.

    let Some(string) = c_string.to_str() else {
        return Err(String::from("string should be null terminated"))
    };
    
    println!("{}", string);
    Ok(())
}

