Mercurial > touhou
diff examples/dump_ecl.rs @ 719:28e6332b088d
Add a dump_ecl example.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Wed, 30 Oct 2019 10:28:52 +0100 |
parents | |
children | eea03c9ca604 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/examples/dump_ecl.rs @@ -0,0 +1,54 @@ +use touhou::th06::ecl::{Ecl, CallMain, CallSub, Rank}; +use std::env; +use std::path::Path; + +#[path = "common.rs"] +mod common; +use common::{load_file_into_vec}; + +fn format_rank(rank: &Rank) -> String { + format!("{}{}{}{}", if rank.contains(Rank::EASY) { 'E' } else { ' ' }, + if rank.contains(Rank::NORMAL) { 'N' } else { ' ' }, + if rank.contains(Rank::HARD) { 'H' } else { ' ' }, + if rank.contains(Rank::LUNATIC) { 'L' } else { ' ' }) +} + +fn print_sub_instruction(call: &CallSub) { + let CallSub { time, rank_mask, param_mask: _, instr } = call; + println!(" {:>5}: {}: {:?}", time, format_rank(rank_mask), instr); +} + +fn print_main_instruction(call: &CallMain) { + let CallMain { time, sub, instr } = call; + println!(" {:>5}: sub {:>2}: {:?}", time, sub, instr); +} + +fn main() { + // Parse arguments. + let args: Vec<_> = env::args().collect(); + if args.len() != 2 { + eprintln!("Usage: {} <ECL file>", args[0]); + return; + } + let ecl_filename = Path::new(&args[1]); + + // Open the ECL file. + let buf = load_file_into_vec(ecl_filename); + let (_, ecl) = Ecl::from_slice(&buf).unwrap(); + + for (i, main) in ecl.mains.iter().enumerate() { + println!("Main {} {{", i); + for call in main.instructions.iter() { + print_main_instruction(call); + } + println!("}}"); + } + + for (i, sub) in ecl.subs.iter().enumerate() { + println!("Sub {} {{", i); + for call in sub.instructions.iter() { + print_sub_instruction(call); + } + println!("}}"); + } +}