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
|
pub const MAX_NAME_LEN: usize = 255;
pub const MAX_TARGET_LEN: usize = 4095;
#[cfg(test)]
fn token(xs: &[&str]) -> Vec<u8> {
let mut out = vec![];
for x in xs {
let len = x.len() as u64;
out.extend_from_slice(&len.to_le_bytes());
out.extend_from_slice(x.as_bytes());
let n = x.len() & 7;
if n != 0 {
const ZERO: [u8; 8] = [0; 8];
out.extend_from_slice(&ZERO[n..]);
}
}
out
}
pub const TOK_NAR: [u8; 56] = *b"\x0d\0\0\0\0\0\0\0nix-archive-1\0\0\0\x01\0\0\0\0\0\0\0(\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0type\0\0\0\0";
pub const TOK_REG: [u8; 32] = *b"\x07\0\0\0\0\0\0\0regular\0\x08\0\0\0\0\0\0\0contents";
pub const TOK_EXE: [u8; 64] = *b"\x07\0\0\0\0\0\0\0regular\0\x0a\0\0\0\0\0\0\0executable\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0contents";
pub const TOK_SYM: [u8; 32] = *b"\x07\0\0\0\0\0\0\0symlink\0\x06\0\0\0\0\0\0\0target\0\0";
pub const TOK_DIR: [u8; 24] = *b"\x09\0\0\0\0\0\0\0directory\0\0\0\0\0\0\0";
pub const TOK_ENT: [u8; 48] = *b"\x05\0\0\0\0\0\0\0entry\0\0\0\x01\0\0\0\0\0\0\0(\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0name\0\0\0\0";
pub const TOK_NOD: [u8; 48] = *b"\x04\0\0\0\0\0\0\0node\0\0\0\0\x01\0\0\0\0\0\0\0(\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0type\0\0\0\0";
pub const TOK_PAR: [u8; 16] = *b"\x01\0\0\0\0\0\0\0)\0\0\0\0\0\0\0";
#[test]
fn tokens() {
let cases: &[(&[u8], &[&str])] = &[
(&TOK_NAR, &["nix-archive-1", "(", "type"]),
(&TOK_REG, &["regular", "contents"]),
(&TOK_EXE, &["regular", "executable", "", "contents"]),
(&TOK_SYM, &["symlink", "target"]),
(&TOK_DIR, &["directory"]),
(&TOK_ENT, &["entry", "(", "name"]),
(&TOK_NOD, &["node", "(", "type"]),
(&TOK_PAR, &[")"]),
];
for &(tok, xs) in cases {
assert_eq!(tok, token(xs));
}
}
|