mhgu-forge 1.2.0

Rust API for writing forge plugins for MHGU
Documentation
use core::ffi::c_char;
use core::fmt::{self, Write};

pub struct FixedCStringWriter<'a> {
    buf: &'a mut [u8],
    len: usize,
}

impl<'a> FixedCStringWriter<'a> {
    pub fn new(buf: &'a mut [u8]) -> Self {
        if !buf.is_empty() {
            buf[0] = 0;
        }

        Self { buf, len: 0 }
    }

    pub fn as_c_str_ptr(&self) -> *const c_char {
        self.buf.as_ptr().cast()
    }
}

impl Write for FixedCStringWriter<'_> {
    fn write_str(&mut self, s: &str) -> fmt::Result {
        if self.buf.is_empty() {
            return Ok(());
        }

        let max_len = self.buf.len() - 1;
        let available = max_len.saturating_sub(self.len);
        let bytes = s.as_bytes();
        let to_copy = available.min(bytes.len());

        for (dst, src) in self.buf[self.len..self.len + to_copy]
            .iter_mut()
            .zip(bytes.iter().take(to_copy))
        {
            *dst = if *src == 0 { b'?' } else { *src };
        }

        self.len += to_copy;
        self.buf[self.len] = 0;
        Ok(())
    }
}