annotate formats/src/bin/dump_ecl.rs @ 769:cae5f15ca5ed

formats: Fix possible panic in PBG3 checksum check
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 30 Aug 2022 18:22:53 +0200
parents 21b186be2590
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
757
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
1 use touhou_formats::th06::ecl::{Ecl, CallMain, CallSub, Rank};
719
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2 use std::env;
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use std::path::Path;
757
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
4 use std::fs::File;
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
5 use std::io::{self, BufReader, Read};
719
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
6
757
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
7 pub fn load_file_into_vec<P: AsRef<Path>>(filename: P) -> io::Result<Vec<u8>> {
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
8 let file = File::open(filename)?;
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
9 let mut file = BufReader::new(file);
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
10 let mut buf = Vec::new();
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
11 file.read_to_end(&mut buf)?;
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
12 Ok(buf)
21b186be2590 Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 756
diff changeset
13 }
719
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
15 fn format_rank(rank: &Rank) -> String {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 format!("{}{}{}{}", if rank.contains(Rank::EASY) { 'E' } else { ' ' },
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 if rank.contains(Rank::NORMAL) { 'N' } else { ' ' },
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18 if rank.contains(Rank::HARD) { 'H' } else { ' ' },
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 if rank.contains(Rank::LUNATIC) { 'L' } else { ' ' })
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22 fn print_sub_instruction(call: &CallSub) {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23 let CallSub { time, rank_mask, param_mask: _, instr } = call;
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24 println!(" {:>5}: {}: {:?}", time, format_rank(rank_mask), instr);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27 fn print_main_instruction(call: &CallMain) {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28 let CallMain { time, sub, instr } = call;
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
29 println!(" {:>5}: sub {:>2}: {:?}", time, sub, instr);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
31
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32 fn main() {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
33 // Parse arguments.
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 let args: Vec<_> = env::args().collect();
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35 if args.len() != 2 {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 eprintln!("Usage: {} <ECL file>", args[0]);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
37 return;
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
39 let ecl_filename = Path::new(&args[1]);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41 // Open the ECL file.
756
4d91790cf8ab Fix dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 727
diff changeset
42 let buf = load_file_into_vec(ecl_filename).unwrap();
719
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
43 let (_, ecl) = Ecl::from_slice(&buf).unwrap();
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45 for (i, main) in ecl.mains.iter().enumerate() {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 println!("Main {} {{", i);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 for call in main.instructions.iter() {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48 print_main_instruction(call);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 println!("}}");
727
eea03c9ca604 dump_ecl: Add newlines between blocks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 719
diff changeset
51 println!();
719
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54 for (i, sub) in ecl.subs.iter().enumerate() {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55 println!("Sub {} {{", i);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
56 for call in sub.instructions.iter() {
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
57 print_sub_instruction(call);
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
58 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
59 println!("}}");
727
eea03c9ca604 dump_ecl: Add newlines between blocks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 719
diff changeset
60 println!();
719
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
61 }
28e6332b088d Add a dump_ecl example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
62 }