actually add the utilities for the write functions
parent
a523d6f8d4
commit
36e11b95e8
|
@ -49,7 +49,7 @@ pub fn read_sidetex(b: &[u8]) -> ResultS<SideTex>
|
||||||
pub fn write_sidetex(v: &SideTex) -> Vec<u8>
|
pub fn write_sidetex(v: &SideTex) -> Vec<u8>
|
||||||
{
|
{
|
||||||
let mut o = Vec::with_capacity(6);
|
let mut o = Vec::with_capacity(6);
|
||||||
o.extend(write_point(&v.offs));
|
o.extend(write_point(v.offs));
|
||||||
o.extend(&v.tex_id.to_be_bytes());
|
o.extend(&v.tex_id.to_be_bytes());
|
||||||
o
|
o
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,7 @@ pub fn read_point(b: &[u8]) -> ResultS<Point>
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Writes a `Point` object.
|
/// Writes a `Point` object.
|
||||||
pub fn write_point(v: &Point) -> Vec<u8>
|
pub fn write_point(v: Point) -> Vec<u8>
|
||||||
{
|
{
|
||||||
let mut o = Vec::with_capacity(4);
|
let mut o = Vec::with_capacity(4);
|
||||||
o.extend(&v.x.to_be_bytes());
|
o.extend(&v.x.to_be_bytes());
|
||||||
|
@ -104,7 +104,7 @@ pub fn write_minf(v: &Minf) -> Vec<u8>
|
||||||
o.extend(&v.skypict_id.to_be_bytes());
|
o.extend(&v.skypict_id.to_be_bytes());
|
||||||
o.extend(&v.miss_flags.bits().to_be_bytes());
|
o.extend(&v.miss_flags.bits().to_be_bytes());
|
||||||
o.extend(&v.envi_flags.bits().to_be_bytes());
|
o.extend(&v.envi_flags.bits().to_be_bytes());
|
||||||
o.extend(&pad_0(to_mac_roman(v.level_name), 66));
|
o.extend(&pad_zero(to_mac_roman(&v.level_name), 66));
|
||||||
o.extend(&v.entr_flags.bits().to_be_bytes());
|
o.extend(&v.entr_flags.bits().to_be_bytes());
|
||||||
o
|
o
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,11 +84,13 @@ pub fn mac_roman_conv(s: &[u8]) -> String
|
||||||
let mut v = String::with_capacity(s.len());
|
let mut v = String::with_capacity(s.len());
|
||||||
|
|
||||||
for &c in s.iter() {
|
for &c in s.iter() {
|
||||||
v.push(match c {
|
let c = match c {
|
||||||
c if c & 0x80 != 0 => TR[usize::from(c) & 0x7F],
|
0x80..=0xFF => TR[usize::from(c) & 0x7F],
|
||||||
b'\r' => '\n',
|
b'\r' => '\n',
|
||||||
c => char::from(c),
|
c => char::from(c),
|
||||||
});
|
};
|
||||||
|
|
||||||
|
v.push(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
v
|
v
|
||||||
|
@ -115,6 +117,67 @@ pub fn mac_roman_cstr(s: &[u8]) -> String
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Converts input from a Unicode string to Mac Roman.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use maraiah::marathon::text::to_mac_roman;
|
||||||
|
///
|
||||||
|
/// assert_eq!(to_mac_roman("påth"), b"p\x8cth".to_vec());
|
||||||
|
/// assert_eq!(to_mac_roman("I’ve\n"), b"I\xd5ve\r".to_vec());
|
||||||
|
/// ```
|
||||||
|
pub fn to_mac_roman(s: &str) -> Vec<u8>
|
||||||
|
{
|
||||||
|
let mut v = Vec::with_capacity(s.len());
|
||||||
|
|
||||||
|
for c in s.chars() {
|
||||||
|
let c = match c {
|
||||||
|
'\n' => {
|
||||||
|
b'\r'
|
||||||
|
}
|
||||||
|
'\0'..='\x7f' => {
|
||||||
|
c as u8
|
||||||
|
}
|
||||||
|
c => {
|
||||||
|
if let Some(c) = TR.iter().position(|&o| o == c) {
|
||||||
|
c as u8 + 0x80
|
||||||
|
} else {
|
||||||
|
0x7f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
v.push(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
v
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Pads the output with zeroes.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use maraiah::marathon::text::{pad_zero, to_mac_roman};
|
||||||
|
///
|
||||||
|
/// let s = to_mac_roman("påth");
|
||||||
|
///
|
||||||
|
/// assert_eq!(pad_zero(s.clone(), 8), b"p\x8cth\0\0\0\0".to_vec());
|
||||||
|
/// assert_eq!(pad_zero(s.clone(), 6), b"p\x8cth\0\0".to_vec());
|
||||||
|
/// assert_eq!(pad_zero(s.clone(), 4), b"p\x8cth".to_vec());
|
||||||
|
/// assert_eq!(pad_zero(s.clone(), 2), b"p\x8cth".to_vec());
|
||||||
|
/// assert_eq!(pad_zero(s.clone(), 0), b"p\x8cth".to_vec());
|
||||||
|
/// ```
|
||||||
|
pub fn pad_zero(mut v: Vec<u8>, n: usize) -> Vec<u8>
|
||||||
|
{
|
||||||
|
for _ in v.len()..n {
|
||||||
|
v.push(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
v
|
||||||
|
}
|
||||||
|
|
||||||
const TR: [char; 128] =
|
const TR: [char; 128] =
|
||||||
['\u{00c4}', '\u{00c5}', '\u{00c7}', '\u{00c9}', '\u{00d1}', '\u{00d6}',
|
['\u{00c4}', '\u{00c5}', '\u{00c7}', '\u{00c9}', '\u{00d1}', '\u{00d6}',
|
||||||
'\u{00dc}', '\u{00e1}', '\u{00e0}', '\u{00e2}', '\u{00e4}', '\u{00e3}',
|
'\u{00dc}', '\u{00e1}', '\u{00e0}', '\u{00e2}', '\u{00e4}', '\u{00e3}',
|
||||||
|
|
Loading…
Reference in New Issue