shared.rs
1 use cbuffer::{RxBuffer, TxBuffer}; 2 use libc::size_t; 3 4 unsafe fn poke_foo(ptr: *mut u8, len: size_t) { 5 let foo = b"foo\n"; 6 assert!(len >= foo.len()); 7 8 for i in 0..foo.len() { 9 *ptr.add(i) = foo[i]; 10 } 11 } 12 13 unsafe fn assert_foo(ptr: *const u8, len: size_t) { 14 let foo = b"foo\n"; 15 assert!(len >= foo.len()); 16 17 for i in 0..foo.len() { 18 assert_eq!(*ptr.add(i), foo[i]); 19 } 20 } 21 22 #[test] 23 fn foo_test() { 24 let mut ary: [u8; 10] = [0; 10]; 25 unsafe { 26 poke_foo(ary.as_mut_ptr(), 10); 27 assert_foo(ary.as_ptr(), 10); 28 } 29 } 30 31 #[test] 32 #[should_panic] 33 fn foo_fail_test() { 34 let ary: [u8; 10] = [0; 10]; 35 unsafe { 36 assert_foo(ary.as_ptr(), 10); 37 } 38 } 39 40 pub fn write_cbuffer(buf: &dyn TxBuffer) { 41 let (ptr, size) = buf.as_c_char(); 42 unsafe { 43 assert_foo(ptr as *const u8, size); 44 } 45 } 46 47 pub fn read_cbuffer(buf: &mut dyn RxBuffer) -> &[u8] { 48 unsafe { 49 let (ptr, size) = buf.as_c_void(); 50 poke_foo(ptr as *mut u8, size); 51 assert_foo(ptr as *const u8, size); 52 buf.done(4) 53 } 54 } 55 56 pub fn read_cbuffer_resize(buf: &mut dyn RxBuffer) -> &[u8] { 57 unsafe { 58 if let Some(resize) = buf.can_set_capacity() { 59 resize.set_capacity(4); 60 } 61 let (ptr, size) = buf.as_c_void(); 62 poke_foo(ptr as *mut u8, size); 63 assert_foo(ptr as *const u8, size); 64 buf.done(4) 65 } 66 }