diff --git a/src/main.rs b/src/main.rs index 0f20477..d3f76fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -180,13 +180,14 @@ fn main() -> ResultS<()> let mut opt: Options = Default::default(); { + let mut ap = ArgumentParser::new(); + macro_rules! arg { - ($name:expr, $ref:expr, $type:expr, $ap:expr, $desc:expr) => { - $ap.refer(&mut $ref).add_option(&[$name], $type, $desc); + ($name:expr, $ref:expr, $type:expr, $desc:expr) => { + ap.refer(&mut $ref).add_option(&[$name], $type, $desc); }; } - let mut ap = ArgumentParser::new(); ap.set_description(env!("CARGO_PKG_DESCRIPTION")); ap.add_option(&["-v", "--version"], @@ -198,43 +199,43 @@ fn main() -> ResultS<()> ap.refer(&mut opt.inputs) .add_argument("inputs", Collect, "Input files"); - arg!("--shp-write-tab", opt.shp_tab, StoreTrue, ap, + arg!("--shp-write-tab", opt.shp_tab, StoreTrue, "shp: Dump all CLUTs as YAML to standard output"); - arg!("--shp-dump-bitmaps", opt.shp_bmp, StoreTrue, ap, + arg!("--shp-dump-bitmaps", opt.shp_bmp, StoreTrue, "shp: Dump bitmaps into a folder"); - arg!("--shp-dump-more-bitmaps", opt.shp_bmp_all, StoreTrue, ap, + arg!("--shp-dump-more-bitmaps", opt.shp_bmp_all, StoreTrue, "shp: Dump all color variations of each bitmap"); - arg!("--shp-write-frm", opt.shp_frm, StoreTrue, ap, + arg!("--shp-write-frm", opt.shp_frm, StoreTrue, "shp: Dump all frames as YAML to standard output"); - arg!("--shp-write-seq", opt.shp_seq, StoreTrue, ap, + arg!("--shp-write-seq", opt.shp_seq, StoreTrue, "shp: Dump all sequences as YAML to standard output"); - arg!("--snd-write", opt.snd_write, StoreTrue, ap, + arg!("--snd-write", opt.snd_write, StoreTrue, "snd: Dump all sound headers as YAML to standard output"); - arg!("--snd-dump", opt.snd_dump, StoreTrue, ap, + arg!("--snd-dump", opt.snd_dump, StoreTrue, "snd: Dump all sounds to WAVE files"); - arg!("--wad-dump-all", opt.wad_all, StoreTrue, ap, + arg!("--wad-dump-all", opt.wad_all, StoreTrue, "wad: Dump all chunks into a folder"); - arg!("--wad-dump-unknown", opt.wad_unknown, StoreTrue, ap, + arg!("--wad-dump-unknown", opt.wad_unknown, StoreTrue, "wad: Dump all unknown chunks into a folder"); - arg!("--wad-write-header", opt.wad_header, StoreTrue, ap, + arg!("--wad-write-header", opt.wad_header, StoreTrue, "wad: Dump header info as YAML to standard output"); - arg!("--wad-write-chunks", opt.wad_c_temp, Store, ap, + arg!("--wad-write-chunks", opt.wad_c_temp, Store, "wad: Dump specified chunks in various formats"); - arg!("--out-dir", opt.out_dir, Store, ap, + arg!("--out-dir", opt.out_dir, Store, "Sets output directory for dump options"); - arg!("--out-debug", opt.out_debug, StoreTrue, ap, + arg!("--out-debug", opt.out_debug, StoreTrue, "Writes debugging output rather than YAML"); ap.parse_args_or_exit(); diff --git a/src/marathon/shp.rs b/src/marathon/shp.rs index 4b542f9..4c7827c 100644 --- a/src/marathon/shp.rs +++ b/src/marathon/shp.rs @@ -23,13 +23,8 @@ fn color(b: &[u8], clut: &mut [ColorShp]) -> ResultS<()> }?; let cr = ColorShp::Opaque{r, g, b, l}; - - if let Some(cl) = clut.get_mut(i as usize) { - *cl = cr; - Ok(()) - } else { - bail!("bad index"); - } + clut[i as usize] = cr; + Ok(()) } fn color_tables(b: &[u8], @@ -40,10 +35,6 @@ fn color_tables(b: &[u8], { let end = tab_num * clr_num * 8; - if b.len() < tab_ofs + end { - bail!("not enough data"); - } - let b = &b[tab_ofs..tab_ofs + end]; let mut v = vec![vec![ColorShp::Translucent; clr_num]; tab_num]; @@ -97,7 +88,7 @@ fn bitmap(b: &[u8]) -> ResultS p += 4; - if lst < fst || fst > pitch || lst > pitch || p + end >= b.len() { + if lst < fst || fst > pitch || lst > pitch || b.len() < p + end { bail!("invalid compressed scanline"); } @@ -115,7 +106,7 @@ fn bitmap(b: &[u8]) -> ResultS } } else { // simple copy - if p + width * height >= b.len() { + if b.len() < p + width * height { bail!("invalid scanline"); } @@ -226,21 +217,13 @@ pub fn read_shapes(b: &[u8]) -> ResultS> } let c_lo = if lo_ofs != u32::max_value() as usize { - if b.len() < lo_ofs + lo_len { - bail!("not enough data"); - } else { - Some(collection(&b[lo_ofs..lo_ofs + lo_len])?) - } + Some(collection(&b[lo_ofs..lo_ofs + lo_len])?) } else { None }; let c_hi = if hi_ofs != u32::max_value() as usize { - if b.len() < hi_ofs + hi_len { - bail!("not enough data"); - } else { - Some(collection(&b[hi_ofs..hi_ofs + hi_len])?) - } + Some(collection(&b[hi_ofs..hi_ofs + hi_len])?) } else { None }; diff --git a/src/marathon/wad.rs b/src/marathon/wad.rs index a277e37..3121692 100644 --- a/src/marathon/wad.rs +++ b/src/marathon/wad.rs @@ -51,10 +51,6 @@ impl Wad<'_> let index = if !is_old {index} else {i as u16}; - if offset + size > b.len() { - bail!("not enough data for entry"); - } - let cnkdata = &b[offset..offset + size]; let chunks = get_chunks(cnkdata, cnksize)?; let appdata = &b[p..p + appsize];