13 releases
Uses old Rust 2015
0.6.0 | Mar 31, 2021 |
---|---|
0.5.0 | Apr 10, 2018 |
0.4.4 | May 17, 2018 |
0.4.3 | Feb 5, 2018 |
0.1.2 | Jul 5, 2016 |
#560 in Rust patterns
6,416 downloads per month
Used in 9 crates
(2 directly)
56KB
1.5K
SLoC
mbox
: malloc
-based box
This crate provides structures that wrap pointers returned from malloc
as a Box, and
automatically free
them on drop. These types allow you to interact with pointers and
null-terminated strings and arrays in a Rusty style.
Examples
extern crate libc;
extern crate mbox;
use libc::{c_char, malloc, strcpy};
use mbox::MString;
// Assume we have a C function that returns a malloc'ed string.
unsafe extern "C" fn create_str() -> *mut c_char {
let ptr = malloc(12) as *mut c_char;
strcpy(ptr, b"Hello world\0".as_ptr() as *const c_char);
ptr
}
fn main() {
// we wrap the null-terminated string into an MString.
let string = unsafe { MString::from_raw_unchecked(create_str()) };
// check the content is expected.
assert_eq!(&*string, "Hello world");
// the string will be dropped by `free` after the code is done.
}
Installation
Add this to your Cargo.toml:
[dependencies]
mbox = "0.6"
Usage
This crate provides three main types, all of which uses the system's malloc
/free
as the
allocator.
MBox<T>
— Similar toBox<T>
.MString
— Similar tostd::ffi::CString
.MArray<T>
— A null-terminated array, which can be used to represent e.g. array of C strings terminated by a null pointer.
#![no_std]
You may compile mbox
and disable the std
feature to not link to std
(it will still link to
core
.
[dependencies]
mbox = { version = "0.6", default-features = false }
When #![no_std]
is activated, you cannot convert an MString
into a std::ffi::CStr
, as the
type simply does not exist 🙂.
Migrating from other crates
Note that MBox
does not support custom allocator. If the type requires custom allocation,
MBox
cannot serve you.
-
malloc_buf
—MallocBuffer<T>
is equivalent toMBox<[T]>
. Note however we will not check for null pointers. -
cbox
— When not using a customDisposeRef
, theCSemiBox<'static, T>
type is equivalent toMBox<T>
, andCBox<T>
is equivalent to&'static T
. -
c_vec
— When usingfree
as the destructor,CVec<T>
is equivalent toMBox<[T]>
andCSlice<T>
as[T]
.
Dependencies
~205KB