pub const UPPER: usize = 0;
pub const LOWER: usize = 1;
pub const MIXED: usize = 2;
pub const PUNCT: usize = 3;
pub const DIGIT: usize = 4;
pub fn mode_bits(mode: usize) -> usize {
if mode == DIGIT { 4 } else { 5 }
}
pub fn char_for_code(mode: usize, code: u16) -> Option<u8> {
let c = code as usize;
match mode {
UPPER => match code {
1 => Some(b' '),
2..=27 => Some(b'A' + (code as u8 - 2)),
_ => None,
},
LOWER => match code {
1 => Some(b' '),
2..=27 => Some(b'a' + (code as u8 - 2)),
_ => None,
},
MIXED => MIXED_TABLE.get(c).copied().flatten(),
PUNCT => PUNCT_TABLE.get(c).copied().flatten(),
DIGIT => match code {
1 => Some(b' '),
2..=11 => Some(b'0' + (code as u8 - 2)),
12 => Some(b','),
13 => Some(b'.'),
_ => None,
},
_ => None,
}
}
pub fn punct_pair_for_code(code: u16) -> Option<[u8; 2]> {
match code {
2 => Some([b'\r', b'\n']),
3 => Some([b'.', b' ']),
4 => Some([b',', b' ']),
5 => Some([b':', b' ']),
_ => None,
}
}
pub fn code_for_char(mode: usize, byte: u8) -> Option<u16> {
let n = if mode == DIGIT { 16 } else { 32 };
(1..n as u16).find(|&code| char_for_code(mode, code) == Some(byte))
}
const MIXED_TABLE: [Option<u8>; 28] = [
None, Some(b' '), Some(1), Some(2), Some(3), Some(4), Some(5), Some(6), Some(7), Some(8), Some(9), Some(10), Some(11), Some(12), Some(13), Some(27), Some(28), Some(29), Some(30), Some(31), Some(b'@'), Some(b'\\'), Some(b'^'), Some(b'_'), Some(b'`'), Some(b'|'), Some(b'~'), Some(127), ];
const PUNCT_TABLE: [Option<u8>; 31] = [
None, Some(b'\r'), None, None, None, None, Some(b'!'), Some(b'"'), Some(b'#'), Some(b'$'), Some(b'%'), Some(b'&'), Some(b'\''), Some(b'('), Some(b')'), Some(b'*'), Some(b'+'), Some(b','), Some(b'-'), Some(b'.'), Some(b'/'), Some(b':'), Some(b';'), Some(b'<'), Some(b'='), Some(b'>'), Some(b'?'), Some(b'['), Some(b']'), Some(b'{'), Some(b'}'), ];
pub fn word_size(layers: usize) -> usize {
match layers {
1..=2 => 6,
3..=8 => 8,
9..=22 => 10,
_ => 12,
}
}
pub fn total_bits_in_layer(layers: usize, compact: bool) -> usize {
((if compact { 88 } else { 112 }) + 16 * layers) * layers
}