# HG changeset patch # User Emmanuel Gil Peyrot # Date 1572427732 -3600 # Node ID 28e6332b088daff8a113233718565c0bd69ed697 # Parent c187e0a6b7517c296d33440ceb8ac26002e9aafb Add a dump_ecl example. diff --git a/examples/dump_ecl.rs b/examples/dump_ecl.rs 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: {} ", 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!("}}"); + } +}