From 7e8c28b6ca674d4df15e19044983935f56374036 Mon Sep 17 00:00:00 2001 From: Marrub Date: Tue, 11 Sep 2018 04:20:54 -0400 Subject: [PATCH] Get rid of magic numbers --- src/durandal/pict.rs | 10 ++++-- src/durandal/text.rs | 72 ++++++++++++++++++++++---------------------- src/marathon/wad.rs | 32 ++++++++++++-------- 3 files changed, 63 insertions(+), 51 deletions(-) diff --git a/src/durandal/pict.rs b/src/durandal/pict.rs index a967f2f..ca0f878 100644 --- a/src/durandal/pict.rs +++ b/src/durandal/pict.rs @@ -100,6 +100,8 @@ fn expand_data(b: Vec, depth: u16) -> Result, &'static str> /// Process a CopyBits operation. fn read_bitmap_area(mut im: Image, b: &[u8], packed: bool, clip: bool) -> Result { + const SIZE_HEAD: usize = 46; + let mut p = if !packed {4} else {0}; // baseAddr let (w, h) = (im.w(), im.h()); @@ -122,7 +124,7 @@ fn read_bitmap_area(mut im: Image, b: &[u8], packed: bool, clip: bool) -> Result // = b_u32b(&b[p+38..p+42]); pmTable // = b_u32b(&b[p+42..p+46]); pmReserved - p += 46; + p += SIZE_HEAD; if pf & 0x8000 == 0 {return Err("PICT1 not supported")} if xe - xb != w || ye - yb != h {return Err("image bounds are incorrect")} @@ -248,13 +250,15 @@ fn read_quicktime_c(_im: Image, _b: &[u8]) -> Result /// Load a PICT image. pub fn load_pict(b: &[u8]) -> Result { + const SIZE_HEAD: usize = 10; + // size = b_u16b(&b[0.. 2]); // top = b_u16b(&b[2.. 4]); // left = b_u16b(&b[4.. 6]); let h = b_u16b(&b[6.. 8]) as usize; let w = b_u16b(&b[8..10]) as usize; let im = Image::new(w, h); - let mut p = 10; + let mut p = SIZE_HEAD; while p < b.len() { @@ -322,3 +326,5 @@ pub fn load_pict(b: &[u8]) -> Result Err("no image in data") } + +// EOF diff --git a/src/durandal/text.rs b/src/durandal/text.rs index faac982..bf104db 100644 --- a/src/durandal/text.rs +++ b/src/durandal/text.rs @@ -38,41 +38,6 @@ pub fn fuck_string(s: &[u8]) -> Vec /// Converts input from Mac Roman to a Unicode string. pub fn mac_roman_conv(s: &[u8]) -> String { - let tr = [ - '\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{00e5}', '\u{00e7}', '\u{00e9}', '\u{00e8}', - '\u{00ea}', '\u{00eb}', '\u{00ed}', '\u{00ec}', - '\u{00ee}', '\u{00ef}', '\u{00f1}', '\u{00f3}', - '\u{00f2}', '\u{00f4}', '\u{00f6}', '\u{00f5}', - '\u{00fa}', '\u{00f9}', '\u{00fb}', '\u{00fc}', - '\u{2020}', '\u{00b0}', '\u{00a2}', '\u{00a3}', - '\u{00a7}', '\u{2022}', '\u{00b6}', '\u{00df}', - '\u{00ae}', '\u{00a9}', '\u{2122}', '\u{00b4}', - '\u{00a8}', '\u{2260}', '\u{00c6}', '\u{00d8}', - '\u{221e}', '\u{00b1}', '\u{2264}', '\u{2265}', - '\u{00a5}', '\u{00b5}', '\u{2202}', '\u{2211}', - '\u{220f}', '\u{03c0}', '\u{222b}', '\u{00aa}', - '\u{00ba}', '\u{03a9}', '\u{00e6}', '\u{00f8}', - '\u{00bf}', '\u{00a1}', '\u{00ac}', '\u{221a}', - '\u{0192}', '\u{2248}', '\u{2206}', '\u{00ab}', - '\u{00bb}', '\u{2026}', '\u{00a0}', '\u{00c0}', - '\u{00c3}', '\u{00d5}', '\u{0152}', '\u{0153}', - '\u{2013}', '\u{2014}', '\u{201c}', '\u{201d}', - '\u{2018}', '\u{2019}', '\u{00f7}', '\u{25ca}', - '\u{00ff}', '\u{0178}', '\u{2044}', '\u{20ac}', - '\u{2039}', '\u{203a}', '\u{fb01}', '\u{fb02}', - '\u{2021}', '\u{00b7}', '\u{201a}', '\u{201e}', - '\u{2030}', '\u{00c2}', '\u{00ca}', '\u{00c1}', - '\u{00cb}', '\u{00c8}', '\u{00cd}', '\u{00ce}', - '\u{00cf}', '\u{00cc}', '\u{00d3}', '\u{00d4}', - '\u{f8ff}', '\u{00d2}', '\u{00da}', '\u{00db}', - '\u{00d9}', '\u{0131}', '\u{02c6}', '\u{02dc}', - '\u{00af}', '\u{02d8}', '\u{02d9}', '\u{02da}', - '\u{00b8}', '\u{02dd}', '\u{02db}', '\u{02c7}' - ]; - let l = s.len(); let mut v = String::with_capacity(l); @@ -80,7 +45,7 @@ pub fn mac_roman_conv(s: &[u8]) -> String { if s[i] == 0 {break} - if s[i] & 0x80 != 0 {v.push(tr[s[i] as usize & 0x7f])} + if s[i] & 0x80 != 0 {v.push(TR[s[i] as usize & 0x7f])} else if s[i] == b'\r' {v.push('\n')} else {v.push(s[i] as char)} } @@ -88,4 +53,39 @@ pub fn mac_roman_conv(s: &[u8]) -> String v } +const TR: [char; 128] = [ + '\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{00e5}', '\u{00e7}', '\u{00e9}', '\u{00e8}', + '\u{00ea}', '\u{00eb}', '\u{00ed}', '\u{00ec}', + '\u{00ee}', '\u{00ef}', '\u{00f1}', '\u{00f3}', + '\u{00f2}', '\u{00f4}', '\u{00f6}', '\u{00f5}', + '\u{00fa}', '\u{00f9}', '\u{00fb}', '\u{00fc}', + '\u{2020}', '\u{00b0}', '\u{00a2}', '\u{00a3}', + '\u{00a7}', '\u{2022}', '\u{00b6}', '\u{00df}', + '\u{00ae}', '\u{00a9}', '\u{2122}', '\u{00b4}', + '\u{00a8}', '\u{2260}', '\u{00c6}', '\u{00d8}', + '\u{221e}', '\u{00b1}', '\u{2264}', '\u{2265}', + '\u{00a5}', '\u{00b5}', '\u{2202}', '\u{2211}', + '\u{220f}', '\u{03c0}', '\u{222b}', '\u{00aa}', + '\u{00ba}', '\u{03a9}', '\u{00e6}', '\u{00f8}', + '\u{00bf}', '\u{00a1}', '\u{00ac}', '\u{221a}', + '\u{0192}', '\u{2248}', '\u{2206}', '\u{00ab}', + '\u{00bb}', '\u{2026}', '\u{00a0}', '\u{00c0}', + '\u{00c3}', '\u{00d5}', '\u{0152}', '\u{0153}', + '\u{2013}', '\u{2014}', '\u{201c}', '\u{201d}', + '\u{2018}', '\u{2019}', '\u{00f7}', '\u{25ca}', + '\u{00ff}', '\u{0178}', '\u{2044}', '\u{20ac}', + '\u{2039}', '\u{203a}', '\u{fb01}', '\u{fb02}', + '\u{2021}', '\u{00b7}', '\u{201a}', '\u{201e}', + '\u{2030}', '\u{00c2}', '\u{00ca}', '\u{00c1}', + '\u{00cb}', '\u{00c8}', '\u{00cd}', '\u{00ce}', + '\u{00cf}', '\u{00cc}', '\u{00d3}', '\u{00d4}', + '\u{f8ff}', '\u{00d2}', '\u{00da}', '\u{00db}', + '\u{00d9}', '\u{0131}', '\u{02c6}', '\u{02dc}', + '\u{00af}', '\u{02d8}', '\u{02d9}', '\u{02da}', + '\u{00b8}', '\u{02dd}', '\u{02db}', '\u{02c7}' +]; + // EOF diff --git a/src/marathon/wad.rs b/src/marathon/wad.rs index d317b3c..2c7b6fa 100644 --- a/src/marathon/wad.rs +++ b/src/marathon/wad.rs @@ -31,8 +31,8 @@ pub struct Wad<'a> pub enum Ver { MI, - M2HasOvr, - M2HasDir, + M2, + M1Dir, M1 } @@ -40,7 +40,7 @@ impl<'a> fmt::Debug for Entry<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Entry {{ ")?; + write!(f, "Entry{{ ")?; for (k, _) in &self.map {write!(f, "{} ", mac_roman_conv(&k[..]))?} write!(f, "}}") } @@ -50,6 +50,9 @@ impl<'a> Wad<'a> { pub fn new(b: &[u8]) -> Wad { + const SIZE_ENTRY_NEW: usize = 10; + const SIZE_ENTRY_OLD: usize = 8; + let b = &b[try_mac_header(b)..]; let ver = b_u16b(&b[ .. 2]); let dvr = b_u16b(&b[ 2.. 4]); @@ -64,24 +67,24 @@ impl<'a> Wad<'a> let ver = match ver { 4 => Ver::MI, - 2 => Ver::M2HasOvr, - 1 => Ver::M2HasDir, + 2 => Ver::M2, + 1 => Ver::M1Dir, 0 => Ver::M1, - _ => panic!("invalid wad version"), + _ => panic!("invalid wad version {}", ver), }; let mut map = EntryMap::new(); let mut p = dir; - let n = match ver {Ver::M1 | Ver::M2HasDir => true, _ => false}; - let h = if n {8} else {10}; + let o = match ver {Ver::M1 | Ver::M1Dir => true, _ => false}; + let h = if o {SIZE_ENTRY_OLD} else {SIZE_ENTRY_NEW}; for i in 0..num { let ofs = b_u32b(&b[p ..p+ 4]) as usize; let len = b_u32b(&b[p+4..p+ 8]) as usize; - let ind = if n {i as u16} + let ind = if o {i as u16} else {b_u16b(&b[p+8..p+10])}; - let ent = Entry{map: get_chunks(&b[ofs..ofs+len], n), + let ent = Entry{map: get_chunks(&b[ofs..ofs+len], o), ext: &b[p+h..p+h+ext]}; map.insert(ind, ent); @@ -95,11 +98,14 @@ impl<'a> Wad<'a> } } -fn get_chunks(b: &[u8], n: bool) -> ChunkMap +fn get_chunks(b: &[u8], o: bool) -> ChunkMap { - let mut p = 0; + const SIZE_CHUNK_NEW: usize = 16; + const SIZE_CHUNK_OLD: usize = 12; + let mut map = ChunkMap::new(); - let h = if n {12} else {16}; + let mut p = 0; + let h = if o {SIZE_CHUNK_OLD} else {SIZE_CHUNK_NEW}; while p < b.len() {