-
Notifications
You must be signed in to change notification settings - Fork 33
/
build.rs
89 lines (76 loc) · 1.99 KB
/
build.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use std::env;
use std::fmt;
use std::fs::File;
use std::io::Write;
use std::num::Wrapping;
use std::path::Path;
const POLY: u8 = 0x1D;
/// replicates the least significant bit to every other bit
#[inline]
fn mask(bit: u8) -> u8 {
(Wrapping(0u8) - Wrapping(bit & 1)).0
}
/// multiplies a polynomial with x and returns the residual
/// of the polynomial division with POLY as divisor
#[inline]
fn xtimes(poly: u8) -> u8 {
(poly << 1) ^ (mask(poly >> 7) & POLY)
}
struct Tables {
exp: [u8; 256],
log: [u8; 256],
}
fn generate_tables(mut file: &File) {
let mut tabs = Tables {
exp: [0; 256],
log: [0; 256],
};
let mut tmp = 1;
for power in 0..255usize {
tabs.exp[power] = tmp;
tabs.log[tmp as usize] = power as u8;
tmp = xtimes(tmp);
}
tabs.exp[255] = 1;
match write!(file, "{}", tabs) {
Ok(()) => {}
Err(_) => panic!("Could not format the table. Aborting build."),
};
}
fn farray(array: [u8; 256], f: &mut fmt::Formatter) -> fmt::Result {
for (index, value) in array.into_iter().enumerate() {
try!(write!(f, "{}", value));
if index != array.len() - 1 {
try!(write!(f, ","));
}
}
Ok(())
}
impl fmt::Display for Tables {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "Tables {{\n"));
try!(write!(f, " exp: ["));
try!(farray(self.exp, f));
try!(write!(f, "],\n"));
try!(write!(f, " log: ["));
try!(farray(self.log, f));
try!(write!(f, "]\n"));
write!(f, "}};")
}
}
#[allow(unused_must_use)]
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let dest = Path::new(&out_dir).join("nothinghardcoded.rs");
let mut f = File::create(&dest).unwrap();
write!(
f,
"pub struct Tables {{ \
pub exp: [u8; 256], \
pub log: [u8; 256] \
}} \
\
pub static TABLES: Tables = "
);
generate_tables(&f);
}