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!("}}");
+    }
+}