1use std::io::prelude::*;
2use std::fs::File;
3
4pub fn usize_from_file(path: String) -> Result<usize, &'static str> {
5 if let Ok(mut f) = File::open(&path) {
6 let mut s = String::new();
7 match f.read_to_string(&mut s) {
8 Ok(_) => {
9 match s.trim().parse() {
10 Ok(i) => Ok(i),
11 Err(_) => Err("unable to parse"),
12 }
13 }
14 Err(_) => Err("unable to read file contents"),
15 }
16 } else {
17 Err("unable to open file")
18 }
19}
20
21pub fn bitmask_from_hex_file(file: String) -> Result<Vec<bool>, &'static str> {
22 if let Ok(mut f) = File::open(&file) {
23 let mut s = String::new();
24 match f.read_to_string(&mut s) {
25 Ok(_) => {
26 s.trim();
27 bitmask_from_hex(s)
28 }
29 Err(_) => Err("unable to read file contents"),
30 }
31 } else {
32 Err("unable to open file")
33 }
34}
35
36pub fn bitmask_from_hex(mask: String) -> Result<Vec<bool>, &'static str> {
37 let mut bitmask = Vec::new();
38 let chars = mask.trim().chars();
39 for c in chars {
40 match c {
41 '0' => bitmask.extend_from_slice(&vec![false, false, false, false]),
42 '1' => bitmask.extend_from_slice(&vec![false, false, false, true]),
43 '2' => bitmask.extend_from_slice(&vec![false, false, true, false]),
44 '3' => bitmask.extend_from_slice(&vec![false, false, true, true]),
45 '4' => bitmask.extend_from_slice(&vec![false, true, false, false]),
46 '5' => bitmask.extend_from_slice(&vec![false, true, false, true]),
47 '6' => bitmask.extend_from_slice(&vec![false, true, true, false]),
48 '7' => bitmask.extend_from_slice(&vec![false, true, true, true]),
49 '8' => bitmask.extend_from_slice(&vec![true, false, false, false]),
50 '9' => bitmask.extend_from_slice(&vec![true, false, false, true]),
51 'a' | 'A' => bitmask.extend_from_slice(&vec![true, false, true, false]),
52 'b' | 'B' => bitmask.extend_from_slice(&vec![true, false, true, true]),
53 'c' | 'C' => bitmask.extend_from_slice(&vec![true, true, false, false]),
54 'd' | 'D' => bitmask.extend_from_slice(&vec![true, true, false, true]),
55 'e' | 'E' => bitmask.extend_from_slice(&vec![true, true, true, false]),
56 'f' | 'F' => bitmask.extend_from_slice(&vec![true, true, true, true]),
57 ',' => {}
58 _ => {
59 return Err("unexpected character in mask");
60 }
61 }
62 }
63 bitmask.reverse();
64 Ok(bitmask)
65}