Implement magiskinit logging in Rust

This commit is contained in:
topjohnwu
2023-05-02 16:49:43 -07:00
parent 0d84f80b3c
commit b136aba1e2
8 changed files with 84 additions and 83 deletions

View File

@@ -3,6 +3,13 @@ use std::ffi::CStr;
use std::fmt::Arguments;
use std::{fmt, slice};
pub fn copy_str(dest: &mut [u8], src: &[u8]) -> usize {
let len = min(src.len(), dest.len() - 1);
dest[..len].copy_from_slice(&src[..len]);
dest[len] = b'\0';
len
}
struct BufFmtWriter<'a> {
buf: &'a mut [u8],
used: usize,
@@ -21,12 +28,7 @@ impl<'a> fmt::Write for BufFmtWriter<'a> {
// Silent truncate
return Ok(());
}
let remain = &mut self.buf[self.used..];
let s_bytes = s.as_bytes();
let copied = min(s_bytes.len(), remain.len() - 1);
remain[..copied].copy_from_slice(&s_bytes[..copied]);
self.used += copied;
self.buf[self.used] = b'\0';
self.used += copy_str(&mut self.buf[self.used..], s.as_bytes());
// Silent truncate
Ok(())
}
@@ -107,6 +109,13 @@ macro_rules! cstr {
}};
}
#[macro_export]
macro_rules! str_ptr {
($s:literal) => {{
cstr!($s).as_ptr()
}};
}
pub fn ptr_to_str<'a, T>(ptr: *const T) -> &'a str {
if ptr.is_null() {
"(null)"