Skip to content
Snippets Groups Projects
Commit 12056148 authored by Per Lindgren's avatar Per Lindgren
Browse files

added &str

parent a3c0243e
No related branches found
No related tags found
No related merge requests found
......@@ -21,6 +21,32 @@ fn log<T: Sized + Any>(s: &T, v: &mut [u8], p: &mut usize) {
*p += size;
}
// log str and move write pointer forward
// notice, to work towards a real target the pointer
// len and ptr fields will be on u32
fn log_str(s: &'static str, v: &mut [u8], p: &mut usize) {
let type_id = TypeId::of::<str>();
let size = s.len();
// store type_id
let bytes: [u8; 8] = unsafe { transmute(type_id) };
v[*p..*p + 8].copy_from_slice(&bytes);
*p += 8;
// store len
let bytes: [u8; 8] = unsafe { transmute(s.len()) };
v[*p..*p + 8].copy_from_slice(&bytes);
*p += 8;
println!("len {}", s.len());
// store ptr
let bytes: [u8; 8] = unsafe { transmute(s.as_ptr()) };
v[*p..*p + 8].copy_from_slice(&bytes);
println!("ptr {:?}", s.as_ptr());
*p += 8;
}
// helper to expand data and move read pointer forward
fn exp2<T>(v: &[u8], p: &mut usize)
where
......@@ -32,6 +58,29 @@ where
*p += size;
}
use std::slice;
use std::str;
// helper to expand str and move read pointer forward
// notice, to work towards a real target we need to adjust
// the pointer to the pointer in the elf
fn exp_str(v: &[u8], p: &mut usize) {
// get length
let bytes: &[u8; 8] = v[*p..*p + 8].try_into().unwrap();
let len: usize = unsafe { transmute(*bytes) };
*p += 8;
println!("len {}", len);
// get pointer
let bytes: &[u8; 8] = v[*p..*p + 8].try_into().unwrap();
let ptr: *const u8 = unsafe { transmute(*bytes) };
*p += 8;
println!("ptr {:?}", ptr);
let s = str::from_utf8(unsafe { slice::from_raw_parts(ptr, len) }).unwrap();
println!("{:?}", s);
}
// expand data and move read pointer forward
fn exp(v: &[u8], p: &mut usize) {
let bytes: &[u8; 8] = v[*p..*p + 8].try_into().unwrap();
......@@ -43,6 +92,8 @@ fn exp(v: &[u8], p: &mut usize) {
exp2::<T1>(v, p);
} else if *type_id == TypeId::of::<T2>() {
exp2::<T2>(v, p);
} else if *type_id == TypeId::of::<str>() {
exp_str(v, p);
} else {
unreachable!();
}
......@@ -72,9 +123,11 @@ fn main() {
println!("{:?}", t2);
log(&t1, &mut v, &mut w);
log(&t2, &mut v, &mut w);
log_str(&"hello", &mut v, &mut w);
// example expand the logged data
let mut r = 0;
exp(&v, &mut r);
exp(&v, &mut r);
exp(&v, &mut r);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment