//! Which elements carry which values at the low-cardinality declaration words? //! //! `decl_entry_diff` found nothing separating `ptframe1`/`ptframe2` except their //! NAME — +0x00 and +0x08 are the name string ("ptfr", ".t32"), so those two hits //! are a false positive of that test, not a field. //! //! The remaining candidates for a per-element mode flag are the words with few //! distinct values: +0x28 (3) and +0x2C (6). This prints who has what. //! //! cargo run -p sylpheed-formats --example decl_flag_words use sylpheed_formats::{pak::PakArchive, ui_layout}; use std::path::PathBuf; const AT: usize = 0x20; const N: usize = 60; fn main() { let root = PathBuf::from(std::env::var("SYLPHEED_DISC").expect("SYLPHEED_DISC")); let ar = PakArchive::open(root.join("dat/GP_TITLE.pak")).expect("GP_TITLE"); let by = ar.read(&ar.entries()[5]).expect("entry 5"); let b = ui_layout::parse_build(&by).expect("build"); let w = |i: usize, off: usize| -> u32 { let o = AT + i * N + off; u32::from_be_bytes([by[o], by[o + 1], by[o + 2], by[o + 3]]) }; println!("{:<22} {:>10} {:>10} {:>10} {:>10}", "element", "+0x28", "+0x2C", "+0x34", "kind"); for (i, e) in b.elements.iter().enumerate() { let mark = if e.name.starts_with("ptframe") { " <- FRAME" } else { "" }; println!("{:<22} {:>10} {:>10} {:>10} {:>#10x}{mark}", e.name, w(i, 0x28), w(i, 0x2C) as i32, w(i, 0x34), e.kind); } }