//! Host-side cross-check tool for the kernel QR encoder. //! //! Usage: `qrcheck TEXT [VERSION] [MASK]` //! - with VERSION+MASK: force both and dump the matrix (compared against //! segno by `tools/qrcheck.py`); //! - with neither: auto-pick version and best mask, print `v m`. //! //! Output: first line `v m`, then one line per matrix row of //! `#` (dark) / `.` (light). #![allow(static_mut_refs)] #[path = "../../../rsnix/src/qr.rs"] mod qr; fn main() { let args: Vec = std::env::args().collect(); if args.get(1).map(String::as_str) == Some("--raw") { let text = args.get(2).map(String::as_str).unwrap_or("hello"); let version: usize = args.get(3).and_then(|s| s.parse().ok()).unwrap_or(0); let v = if version > 0 { qr::encode_at(text.as_bytes(), version, Some(0)) } else { qr::encode(text.as_bytes()) }; if v == 0 { eprintln!("FAIL"); std::process::exit(1); } for b in qr::codeword_stream() { print!("{:02x}", b); } println!(); return; } let text = args.get(1).map(String::as_str).unwrap_or("hello world"); let version: usize = args.get(2).and_then(|s| s.parse().ok()).unwrap_or(0); let mask: Option = args.get(3).and_then(|s| s.parse().ok()); let v = if version > 0 { qr::encode_at(text.as_bytes(), version, mask) } else { qr::encode(text.as_bytes()) }; if v == 0 { eprintln!("FAIL: cannot encode {} bytes at v{}", text.len(), version); std::process::exit(1); } let size = qr::size(); let m = if let Some(m) = mask { m } else { qr::last_mask() }; println!("v{} m{}", v, m); for y in 0..size { let mut row = String::with_capacity(size); for x in 0..size { row.push(if qr::module(x, y) { '#' } else { '.' }); } println!("{}", row); } }