quake_util/common/
mod.rs

1use std::ffi::CString;
2
3mod ext_traits;
4
5pub use ext_traits::CellOptionExt;
6
7pub type Palette = [[u8; 3]; 256];
8
9pub const QUAKE_PALETTE: Palette = include_palette();
10
11const fn include_palette() -> Palette {
12    let bytes = *include_bytes!("palette.lmp");
13    assert!(bytes.len() == std::mem::size_of::<Palette>());
14    unsafe { std::mem::transmute(bytes) }
15}
16
17#[derive(Clone, Copy)]
18pub struct Junk<T: Copy + Default + Sized> {
19    _value: T,
20}
21
22impl<T: Copy + Default> PartialEq<Junk<T>> for Junk<T> {
23    fn eq(&self, _: &Junk<T>) -> bool {
24        true
25    }
26}
27
28impl<T: Copy + Default> Eq for Junk<T> {}
29
30impl<T: Copy + Default> Default for Junk<T> {
31    fn default() -> Self {
32        Self {
33            _value: T::default(),
34        }
35    }
36}
37
38impl<T: Copy + Default> core::fmt::Debug for Junk<T> {
39    fn fmt(
40        &self,
41        _formatter: &mut core::fmt::Formatter,
42    ) -> Result<(), core::fmt::Error> {
43        Ok(())
44    }
45}
46
47pub fn slice_to_cstring(slice: &[u8]) -> std::ffi::CString {
48    let mut len = 0;
49
50    while len < slice.len() {
51        if slice[len] == 0u8 {
52            break;
53        }
54
55        len += 1;
56    }
57
58    CString::new(&slice[..len]).unwrap()
59}